除非我单击弹出按钮,否则不会触发 Chrome 扩展 OnBeforeRequest

问题描述

我正在构建一个 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 的调用

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

解决方法

我不确定是什么导致了问题。但是@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"]
    }
}]
,

如果我在您第一次打开页面时理解正确,它不会触发 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

    }
  }
);