Javascript 为什么';Firefox是否允许您在主框架中执行脚本?

Javascript 为什么';Firefox是否允许您在主框架中执行脚本?,javascript,google-chrome-extension,firefox-addon-webextensions,Javascript,Google Chrome Extension,Firefox Addon Webextensions,我正在使用Firefox新的webExtensions框架编写一个webExtensions,该框架基于Chrome。所有的示例扩展都在夜间构建中工作,所以这就是我要测试的地方。我要做的是在内容页加载时运行一个脚本。以下是我的background.js页面: background.js "use strict"; function onCompletedFunc(details) { var script = 'console.log("ok");'; console.log(

我正在使用Firefox新的webExtensions框架编写一个webExtensions,该框架基于Chrome。所有的示例扩展都在夜间构建中工作,所以这就是我要测试的地方。我要做的是在内容页加载时运行一个脚本。以下是我的background.js页面:

background.js

"use strict";

function onCompletedFunc(details) {
    var script = 'console.log("ok");';
    console.log("Details are %o", details);
    chrome.tabs.executeScript(details['tabId'], {
        code: script,
        runAt: 'document_end'
    });
};
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
                                     {'urls': ['<all_urls>']}, 
                                     ['responseHeaders']);
//Does not work:
/*
chrome.webRequest.onCompleted.addListener(onCompletedFunc, 
                                     {'urls': ['<all_urls>'], 'types':["main_frame"]}, 
                                     ['responseHeaders']);
*/
“严格使用”;
函数onCompletedFunc(详细信息){
var脚本='console.log(“ok”);';
console.log(“详细信息为%o”,详细信息);
chrome.tabs.executeScript(详细信息['tabId']{
代码:脚本,
runAt:'文档结束'
});
};
chrome.webRequest.onCompleted.addListener(onCompletedFunc,
{'URL':['']},
[“负责人]);
//不起作用:
/*
chrome.webRequest.onCompleted.addListener(onCompletedFunc,
{'URL':[''],'types':[“main_frame”]},
[“负责人]);
*/
这在夜间工作。我从后台页面获得了一个详细信息列表(“详细信息是…”),在内容页面的控制台上有几行“ok”,每个加载的资源对应一行。它在Chrome中运行相同(清单文件略有不同)

我想要的是第二个变体,它在页面上只运行一次。这在铬上很好用。在Nightly中,它显示来自主框架的一条“详细信息”消息,但在内容页的控制台中没有显示任何内容

我肯定这是个时间问题,但这里怎么了


manifest.json(删除“应用程序”:{…}用于Chrome)

{
“说明”:“,
“清单版本”:2,
“名称”:“执行脚本”,
“版本”:“1.0”,
“应用程序”:{
“壁虎”:{
“id”:“用户代理”-rewriter@mozilla.org",
“严格的最低版本”:“45.0”
}
},
“权限”:[
“webRequest”、“webRequestBlocking”和“
],
“背景”:{
“脚本”:[“background.js”]
}
}
您的第一个代码段(没有
类型
)之所以有效,是因为您不仅获得了对
主框架
的请求,而且还获得了另一个子资源<如果要插入脚本,则code>webRequest.onCompleted不是正确的事件。无法保证选项卡中的页面与您收到请求的页面匹配

如果希望无条件地运行代码,只需在清单文件中声明内容脚本。有关更多信息,请参阅

如果必须进行编程注入,请使用事件而不是webRequest事件。通过此事件,您知道选项卡现在显示对给定URL的响应。例如:

chrome.webNavigation.onCommitted.addListener(函数(详细信息)){
//示例:仅在主框架和包含“示例”的URL中运行
if(details.frameId==0&&details.url.includes('example')){
chrome.tabs.executeScript(details.tabId{
代码:'console.log(“注入到”+document.URL);',
runAt:'文档结束'
});
}
});
//filter(第二个参数,上面没有使用)从Firefox 50开始就受支持。
事件如果您使用
webNavigation.onCommitted
,则必须考虑API是非阻塞的。可能(但概率较低)发生以下情况:

  • 用户启动请求
  • webNavigation.onCompleted
    fires
  • 您可以调用
    选项卡。executeScript
  • 同时,该选项卡会导航到其他站点
  • tabs.executeScript
    请求到达选项卡,同时切换到另一个URL
  • 哎呀,您刚刚在一个页面中注入了一个脚本,它与您想要的页面不同

  • 如果不需要URL不匹配,则在继续使用内容脚本逻辑之前,请检查或具有预期值。

    可能还不支持此功能。尝试在Firefox WebExtensions论坛上提问。@wOxxOm看起来像个bug,我已经在感谢您的解释中报告过了。实际上,如果脚本在重定向后在页面上执行,我认为这很好,所以我没有认为这是一个问题。如果我将筛选器设置为all_URL,我仍然不知道为什么会导致脚本根本不执行。@CaitlinRainone这是一个bug,请参阅我在您的问题()下的链接。
    {
    
      "description": "",
      "manifest_version": 2,
      "name": "execute_script",
      "version": "1.0",
    
      "applications": {
        "gecko": {
          "id": "user-agent-rewriter@mozilla.org",
          "strict_min_version": "45.0"
        }
      },
    
      "permissions": [
        "webRequest", "webRequestBlocking", "<all_urls>" 
      ],
    
      "background": {
        "scripts": ["background.js"]
      }
    
    }