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

Chrome Extension OnBeforeRequest not triggering unless I click the poupup button

我正在构建一个 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
},

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

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

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

的调用

我想让侦听器在不单击弹出窗口的情况下工作,以避免不一致。感谢任何帮助。

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

    }
  }
);

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