我打算在打开该标签时在新标签页中执行脚本。
在我的后台脚本中,我有:
var listener = function (tab) {
browser.tabs.executeScript(null, { file: "content_scripts/contentScript.js" });
}
browser.tabs.onCreated.addListener(listener);
在contentScript.js中:
function foo() {
console.log("Executed");
}
foo();
由此我得到以下错误:
Error: Permission denied to access property "chrome"
如果我只是执行代码而不是调用js脚本,例如:
browser.tabs.executeScript(null, { code: "console.log("Executed") });
这不会导致错误。知道是什么导致了这个吗?
答案 0 :(得分:1)
无法发表评论,对不起,这不是一个真正的答案......
我没有看到相同的结果。提供详细信息以防万一有人跳出来与我的运行方式以及运行方式不同。
在后台脚本中(位于扩展根目录中),在扩展启动时,都是:
browser.tabs.onCreated.addListener(function (tab) {
browser.tabs.executeScript(null, { file: "src/js/asdf.js" });
});
和
src/js/asdf.js
正确注册(启动时没有错误)。
文件undefined
存在,是来自background.js的正确相对路径,包含你的foo方法和调用。
当我创建一个新的空白选项卡(根据定义不能附加内容脚本)时,我在控制台中看到了预期的错误(尽管来自Error: Missing host permission for the tab
而不是来自background.js):
Executed
当我从头开始创建包含内容的新空白选项卡时(即,上下文单击以在新选项卡中打开链接),我看到预期结果(控制台日志中的Executed
)。
当我在扩展程序中创建新选项卡时,我也会在控制台日志中看到预期结果({{1}}。
潜在相关的清单信息:
在Mac 10.13.4上运行Firefox 59.0.2(64位)
答案 1 :(得分:0)
如果FF开发人员说它的话说:
在Firefox中,相对URL传递到tabs.executeScript()或 tabs.insertCSS()是相对于当前页面URL解析的。在 Chrome,这些网址是相对于附加组件的基本网址解析的。至 跨浏览器工作,您可以将路径指定为绝对URL, 从附加组件的根开始,如下所示:
/path/to/script.js
所以这应该可以解决问题,但事实上FF48由于未知原因而无法执行insertCSS()和executeScript()。同时我发现是否在逐步调试模式下使用这些函数调用执行代码,它们会正常触发。所以它看起来像FF bug。
答案 2 :(得分:0)
它无法正常工作,因为显然this bug尚未修复且仍然存在于Firefox 59中。
您可以在运行executeScript之前让标签加载几毫秒来解决此问题。
我测试了它,它对我有用:
(请记住,这不适用于新的空白标签,例如" about:newtab"。出于安全原因,无法访问这些标签。)
<强> background.js 强>
var listener = function (tab) {
setTimeout(()=>{
browser.tabs.executeScript(tab.id, {file: "/content_scripts/contentScript.js"}).then(()=>{
console.log("Executed!")
}).catch(err=>{
console.error("Not executed:")
console.error(err)
})
},1000) // Add a delay because of this bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1254003
}
browser.tabs.onCreated.addListener(listener);
<强> content_scripts / contentScript.js 强>
function foo() {
console.log("Executed");
alert("Executed!");
}
foo();
<强>的manifest.json 强>
{
"description": "Test executeScript api",
"manifest_version": 2,
"name": "ExecuteScript-Test",
"version": "1.0",
"permissions": [
"activeTab",
"tabs",
"<all_urls>"
],
"background": {
"scripts": ["background.js"]
}
}