Javascript 为什么';Firefox是否允许您在主框架中执行脚本?
我正在使用Firefox新的webExtensions框架编写一个webExtensions,该框架基于Chrome。所有的示例扩展都在夜间构建中工作,所以这就是我要测试的地方。我要做的是在内容页加载时运行一个脚本。以下是我的background.js页面: background.jsJavascript 为什么';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(
"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"]
}
}