11

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

在我的后台脚本中,我有:

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

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

4

3 回答 3

2

它不能正常工作,因为显然这个错误尚未修复并且仍然存在于 Firefox 59 中。

您可以通过在对其运行 executeScript 之前让选项卡加载几毫秒来解决此问题。

我已经对此进行了测试,它对我有用:

(请记住,这不适用于“about:newtab”中的新空白选项卡。出于安全原因,这些选项卡无法访问。)

背景.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();

清单.json

{

  "description": "Test executeScript api",
  "manifest_version": 2,
  "name": "ExecuteScript-Test",
  "version": "1.0",

  "permissions": [
    "activeTab",
    "tabs",
    "<all_urls>"
  ],

  "background": {
    "scripts": ["background.js"]
  }

}
于 2018-05-08T09:40:23.950 回答
0

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

我没有看到相同的结果。提供详细信息,以防万一您突然出现与我运行它的方式以及您运行它的方式不同的情况。

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

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

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

正确注册(启动时没有错误)。

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

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

Error: Missing host permission for the tab

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

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

可能相关的清单信息:

  • asdf.js无法通过网络访问
  • 权限包括标签和 <all_urls>
  • manifest.json 中没有定义内容脚本

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

于 2018-05-08T15:43:53.143 回答
0

如果 FF 开发人员文档是这样说的:

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

/path/to/script.js

所以这应该可以解决问题,但实际上 FF48 由于未知原因 insertCSS() 和 executeScript() 都不想执行。同时我发现如果在调试器中以分步模式执行这些函数调用的代码,它们会正常触发。所以它看起来像FF错误。

于 2016-08-30T18:46:09.800 回答