7

如何从后台脚本中app的内容脚本访问变量?app.jsbackground.js

这是我的尝试方法(background.js):

chrome.tabs.executeScript(null, { file: "app.js" }, function() {
   app.getSettings('authorizeInProgress'); //...
});

这是我得到的: tabs.executeScript 期间出错:无法访问 url 的内容

这里是manifest.json

{
  "name": "ctrl-vk",
  "version": "0.1.3",
  "manifest_version": 2,
  "description": "Chrome extension for ctrl+v insertion of images to vk.com",

  "content_scripts": [{
    "matches": [
        "http://*/*",
        "https://*/*"
    ],
    "js": ["jquery-1.9.1.min.js"
    ],
    "run_at": "document_end"
  }],

  "web_accessible_resources": [
    "jquery-1.9.1.min.js"
  ],

  "permissions" : [
    "tabs",
    "http://*/*",
    "https://*/*"
  ],

  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  }
}

例如完整的代码,在 github

https://github.com/MaxLord/ctrl-vk/tree/with_bug

4

3 回答 3

2

为避免上述错误,请使用以下代码

if (tab.url.indexOf("chrome-devtools://") == -1) {
    chrome.tabs.executeScript(tabId, {
        file: "app.js"
    }, function () {

        if (app.getSettings('authorizeInProgress')) {
            alert('my tab');
            REDIRECT_URI = app.getSettings('REDIRECT_URI');
            if (tab.url.indexOf(REDIRECT_URI + "#access_token") >= 0) {
                app.setSettings('authorize_in_progress', false);
                chrome.tabs.remove(tabId);
                return app.finishAuthorize(tab.url);
            }
        } else {
            alert('not my');
        }

    });
}

代替

chrome.tabs.executeScript(null, {
    file: "app.js"
}, function () {

    if (app.getSettings('authorizeInProgress')) {
        alert('my tab');
        REDIRECT_URI = app.getSettings('REDIRECT_URI');
        if (tab.url.indexOf(REDIRECT_URI + "#access_token") >= 0) {
            app.setSettings('authorize_in_progress', false);
            chrome.tabs.remove(tabId);
            return app.finishAuthorize(tab.url);
        }
    } else {
        alert('not my');
    }

});

解释

  • chrome://extensions/page 也会触发chrome.tabs.onUpdated事件,为了避免它,我们必须添加一个过滤器来跳过所有开发工具页面。
于 2013-02-17T17:40:34.720 回答
1

(会将此作为对已接受答案的评论提交,但仍缺乏所需的声誉)

您还应该将 tabId 作为第一个参数提供给 chrome.tabs.executeScript。否则,您会冒着用户在请求 URL 和 background.js 对错误页面执行 executeScript 后立即切换窗口/选项卡的风险。

虽然事后看来相当明显,但当我收到相同的错误消息“无法访问 url 的内容“chrome-devtools://..”时,它让我陷入了一个循环,即使我的 chrome.tabs.onUpdated 事件处理程序正在检查用户请求的页面在执行 executeScript 调用之前有一些特定的域名。

所以请记住,chrome.tabs.executeScript(null,..) 在活动窗口中运行脚本,即使活动窗口可能是开发人员工具检查器。

于 2014-11-25T20:19:00.480 回答
0

我们应该注意到,在 manifest cofig 中:</p>

"content_scripts": [{
"matches": [
    "http://*/*",
    "https://*/*"
],
"js": ["jquery-1.9.1.min.js"
],

在“匹配”部分,仅匹配 http、https,因此如果您在页面中加载扩展程序,例如:“chrome://extensions/”或“file:///D:xxx”,则会发生该错误。

您可以使用 url 'http://' 在页面中加载您的扩展程序;或在“匹配”数组中添加更多规则。

于 2013-07-26T09:13:12.337 回答