【问题标题】:Chrome Extension OnBeforeRequest not triggering unless I click the poupup button除非我单击弹出按钮,否则 Chrome 扩展 OnBeforeRequest 不会触发
【发布时间】:2021-02-08 15:28:43
【问题描述】:

我正在构建一个 chrome 扩展,它需要重定向某个页面的脚本。我的 background.js 包括:

    chrome.webRequest.onBeforeRequest.addListener(
        function(details) {
            if (/js\example.js/.test(details.url))
                // setTimeout(requestScript(details), 0);
                return { 
                    redirectUrl: chrome.extension.getURL("novoScript.js")
                }
        },
        {urls: ['*://*.example.com/*.js']},
        ["blocking"]
    );

manifest.json 包括:

"background": {
    "scripts": ["background.js"],
    "persistent": true
},

它按预期工作,但该功能仅在我单击弹出按钮后重新加载页面时运行。我第一次在新选项卡中打开页面时,它没有运行。如果我在页面中,并且单击了弹出按钮,它总是有效的。如果我没有点击,无论我重新加载多少次,重定向都不起作用。

我已经尝试擦除 popup.js 的全部内容,但没有任何影响,所以不是因为那里有任何代码。

另外,我已经检查过 background.js 文件没有再次运行,所以似乎监听器在那里,但是如果我不点击弹出按钮,它就不会监听。我还在监听函数中添加了 console.log,在我点击按钮之前,它只记录对 'aobut:blank' url 的调用。

我想让侦听器在不点击弹出窗口的情况下工作,以避免不一致。任何帮助表示赞赏。

【问题讨论】:

  • 您是否在 chrome://extensions 页面上重新加载了扩展程序?您描述的行为听起来像是 Chrome 中的错误,或者您未显示的代码中存在其他错误。 FWIW 你可以改用declarativeNetRequest
  • 是的,我正在重新加载。感谢您对“declarativeNetRequest”的指导,它正在工作,并且总体上是解决问题的更好方法。我将用这种方法写一个答案,将其标记为已接受。谢谢。
  • 每当服务人员处于非活动状态时,我也会遇到此问题,正如您所描述的,在您单击图标之前,它最初是不活动的。 webRequest 事件仅在服务工作人员处于活动状态时触发,但服务工作人员只有在事件唤醒时才会激活。这是什么逻辑啊,mv3 已经超越了bug,bug 报告还不如做背景装饰。

标签: javascript google-chrome redirect google-chrome-extension webrequest


【解决方案1】:

我不确定是什么导致了问题。但@wOxxOm 指出了一种整体上似乎更好的替代方法:declarativeNetRequest。有了它,每当请求所需的资源时,我都会应用一个通用规则。

实施:

manifest.json:

{
    ...    
    "declarative_net_request" : {
            "rule_resources" : [{
              "id": "ruleset_1",
              "enabled": true,
              "path": "redirectRules.json"
            }]
          },
     "permissions": [
          "declarativeNetRequest",
            "*://*.example.com/*"
        ],
      ...
}

redirectRules.json:

[{
    "id": 1,
    "priority": 1,
    "action": {"type": "redirect", "redirect": {"extensionPath": "/novoScript.js" }},
    "condition" : {
        "urlFilter" : "js/app.*.js",
        "domains": ["example.com"],
        "resourceTypes" : ["script"]
    }
}]

【讨论】:

  • declarativeNetRequest 非常适合您。我有完全相同的问题,没有可用的解决方案。 declarativeNetRequest 不是我的用例的选项。以后这个问题有新发现吗?
【解决方案2】:

如果我在您第一次打开页面时理解正确,则它不会触发 onBeforeRequest。当您以另一种方式触发页面加载时,它会按预期触发 onBeforeRequest

您可以使用 onBeforeNavigateonBeforeNavigateonBeforeRequest 的某种组合来捕获您想要的内容。

捕获任何选项卡更改的绝对可靠的方法是在后台脚本中执行以下操作:

chrome.tabs.onUpdated.addListener(function
  (tabId, changeInfo, tab) {
    // read changeInfo data and do something with it (like read the url)
    if (changeInfo.url && ..url-comparison-here) {
      // do something here

    }
  }
);

【讨论】:

  • “当您以另一种方式触发页面加载时”我不确定我是否理解这部分。我认为它与页面加载无关,因为只有当我单击弹出窗口时它才会起作用,而不是在我重新加载时。我之前尝试过 onUpdate 方法,但无法让它工作,因为当 changeInfo 不包含 url 时,我无法找到获取 url 的同步方式。但无论如何我使用 declarativeNetRequest 让它工作。感谢您的宝贵时间。
  • 引用docs“如果你需要访问tabs.Tab的url、pendingUrl、title或favIconUrl属性,你必须在manifest中声明“tabs”权限。”,但是选项卡权限显示用户“阅读您的浏览历史记录”作为权限。因此,我认为只有在您已经请求选项卡权限时这是一个不错的选择,否则使用此 tabs 权限仅重定向一个域是不可接受的。
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 2016-10-15
  • 2018-04-13
  • 2018-06-13
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多