如何让 content_scripts 在 Chrome 扩展程序中的 file:/// URL 中执行

dan*_*hel 7 javascript google-chrome google-chrome-extension

无论我做什么,我似乎都无法完成这项工作。让我用一个非常简单的示例扩展来演示。这是manifest.json

{
  "manifest_version": 2,

  "name": "Sample Of Content Script",
  "description": "Changes the background of a page pink",
  "version": "1.0",

  "content_scripts": [
    {
      "matches": [ "<all_urls>" ],
      "js": [ "changer.js" ]
    }
  ],

  "permissions": [
    "webNavigation"
  ],

  "background": {
    "scripts": [ "background.js" ]
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我的content_scripts条目匹配all_urls,它(根据Google 文档)应该匹配file:///URL。

background.js

(function (chrome) {
    'use strict';

    chrome.webNavigation.onCompleted.addListener(function (details) {
        chrome.tabs.sendMessage(details.tabId, {
            action: 'changeBackground',
            color: 'pink'
        });
    });

})(chrome);
Run Code Online (Sandbox Code Playgroud)

changer.js(内容脚本):

(function (chrome) {
    'use strict';

    chrome.runtime.onMessage.addListener(function (request) {
        if (request.action !== 'changeBackground') { return; }
        document.body.style.background = request.color;
    });

})(chrome);
Run Code Online (Sandbox Code Playgroud)

此扩展程序已发布在 Chrome 网上应用店,因此您可以查看实际结果:

https://chrome.google.com/webstore/detail/sample-of-content-script/bkekbfjgkkineeokljnobgcoadlhdckd

这是一个非常简单的扩展。导航到一个页面,它会将页面的背景变成粉红色。不幸的是,它不适用于任何file:///URL。该changer.js脚本没有加载到页面中,并没有任何反应。

额外信息

  • 开发人员模式下作为Unpacked 扩展运行时,它实际上似乎工作得很好。从文件系统加载的页面变为粉红色。
  • 我尝试使用chrome.tabs.executeScript()而不是将脚本放入清单中。这以更明显的方式失败,说我没有请求修改file:///清单中的 URL 的权限。
  • 我添加"file:///*/*"permissions的部分manifest.json。这似乎适用于chrome.tabs.executeScript(),但 Chrome 网上应用店拒绝了该扩展程序,称file:///不允许使用权限。
  • 我恢复到一个content_script部分manifest.json并尝试添加"file:///*/*matches清单中的部分。同样,这在开发版本中有效,但是当我将它上传到 Chrome 网上应用店然后安装它时,它不起作用。

Xan*_*Xan 4

<all_urls>确实涵盖了file://方案,但必须在扩展列表中手动激活。

如果扩展程序具有涵盖file://方案的权限,则“允许隐身”旁边将有一个“允许访问文件 URL”复选框。用户必须手动启用该功能;在解释该过程后,您可以通过创建带有预配置 URL 的选项卡来提供帮助:

chrome.tabs.create({url: "chrome://extensions/?id=" + chrome.runtime.id});
Run Code Online (Sandbox Code Playgroud)