Javascript Firefox扩展名:调用文件而不是代码上的executeScript时出错

Javascript Firefox扩展名:调用文件而不是代码上的executeScript时出错,javascript,firefox-addon,firefox-addon-webextensions,Javascript,Firefox Addon,Firefox Addon Webextensions,打开新选项卡时,我正在尝试在该选项卡中执行脚本 在我的背景脚本中,我有: var listener = function (tab) { browser.tabs.executeScript(null, { file: "content_scripts/contentScript.js" }); } browser.tabs.onCreated.addListener(listener); 在contentScript.js中: function foo() { consol

打开新选项卡时,我正在尝试在该选项卡中执行脚本

在我的背景脚本中,我有:

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") });

这不会导致错误。你知道是什么原因造成的吗?

如果FF开发人员记录说:

在Firefox中,相对URL传递到tabs.executeScript()或 tabs.insertCSS()是相对于当前页面URL解析的。在里面 在Chrome中,这些URL是相对于插件的基本URL解析的。到 在跨浏览器工作时,可以将路径指定为绝对URL, 从加载项的根开始,如下所示:

/path/to/script.js


所以这应该可以做到,但事实上FF48由于未知原因,insertCSS()和executeScript()都不想执行。同时,我发现如果要在调试器中以逐步模式使用这些函数调用执行代码,它们会正常触发。所以它看起来像FF 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);
function foo() {
    console.log("Executed");
    alert("Executed!");
}

foo();
content\u脚本/contentScript.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);
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"]
  }

}
{
“说明”:“测试执行脚本api”,
“清单版本”:2,
“名称”:“ExecuteScript测试”,
“版本”:“1.0”,
“权限”:[
“活动标签”,
“标签”,
""
],
“背景”:{
“脚本”:[“background.js”]
}
}

无法评论,很抱歉这不是真正的答案

我没有看到同样的结果。提供了详细信息,以防有任何东西突然向您显示,因为它们与我如何运行它以及您如何运行它不同

在后台脚本(位于扩展根目录中)中,在扩展启动时,这两个脚本都:

var temp = function (tab) {
    browser.tabs.executeScript(null, { file: "src/js/asdf.js" });
};
browser.tabs.onCreated.addListener(temp);

正确注册(启动时无错误)

文件
src/js/asdf.js
存在,是background.js的正确相对路径,包含您的foo方法和调用

当我创建一个新的空白选项卡(根据定义,它不能附加内容脚本)时,我在控制台中看到了预期的错误(尽管是从
undefined
而不是从background.js):

错误:缺少选项卡的主机权限

当我创建一个新的空白选项卡,其中包含从头开始的内容(即,上下文单击以打开新选项卡中的链接)时,我会看到预期的结果(
在控制台日志中执行

当我从扩展中创建一个新选项卡时,我还会在控制台日志中看到预期的结果(
Executed

潜在相关舱单信息:

  • asdf.js是不可访问的
  • 权限包括选项卡和
  • manifest.json中没有定义内容脚本

运行Firefox 59.0.2(64位)在Mac 10.13.4上

我认为您必须转到
manifest.json
并将该文件设置为
webaccessible
,您尝试过了吗?
executeScript
的第一个参数是可选的,您可以删除
null
。关于
webaccessible\u资源
,页面上没有提到,至少在FF48中提到过没有必要。为什么要首先手动注入脚本?只需将它们作为内容脚本添加到manifest.json中,浏览器就会在正确的时间注入它们。下面是setTimeout,它包含了一个承诺,可以更轻松地延迟到某个操作完成(在本例中,等待选项卡准备好注入)://在承诺函数delay(msec,value){返回新承诺(函数(OKFunction){setTimeout(OKFunction,msec,value);}中包装setTimeout;}//delay