在 FireFox 扩展中动态修改 content_scripts.matches

Dynamically modify content_scripts.matches in FireFox extension

所以我正在尝试按照使用 WebExtensions 的 firefox 扩展的说明进行操作,并且我想将内容脚本附加到某些页面(如此处讨论:https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Modify_a_web_page)。

问题是我不想在编写扩展程序但从本地存储加载它时,在 manifest.json 中指定 content_script 到 运行 的页面集,即,我设置了一个选项页面,用户可以在其中指定内容脚本应该 运行 的页面。是否可以动态更改通常使用 manifest.json 中的 content_script 指令设置的要修改的页面列表?

谢谢

不,无法修改 manifest.json content_script(CSS 或 JavaScript)注入的 URL。指定的代码将被注入到所有匹配的 URL 中。这是出于多种原因。

这是不可能的原因之一是 security/transparency 给用户。 manifest.json 明确声明您的内容脚本将修改哪些 URL,声明它将修改活动选项卡,或者它将访问所有 URLs/tabs。如果您被允许更改 URL,那么您将有效地获得访问所有 URL 的能力,而无需明确声明您正在这样做。

是的,可以通过某种方式声明您将要这样做。 Chrome 有一个 实验性的 方法可以用 chrome.declarativeContent 来做到这一点。在 Chrome 中,这被认为是实验性的,即使在可用 couple/few 年后也是如此。它在 Firefox 中不可用。它何时可用,或者即使它在 Firefox 中可用也不清楚。此外,即使在 Chrome 中,它也缺少其他注入脚本方法可用的一些功能(例如 run_at/runAt)。

为了完全控制注射或不注射,您需要通过 tabs.insertCSS() and/or tabs.executeScript() 执行注射。使用这些方法注入或不注入脚本和 CSS 完全受扩展程序中 JavaScript 的控制。使用这些方法可以获得与使用 manifest.json content_script 条目获得的功能类似的功能,但具有更多控制权。这种更大的控制是以更大的复杂性为代价的。

怎么样?有一堆事件可以听,你可以选择任何一个满足你的要求:

  • onBeforeNavigate
  • onCommitted
  • onDOMContentLoaded
  • 已完成。

文档是 here。这是如何在 example.com 的子域上制作红色背景的示例。当然,您可以动态构建 URL 个过滤器列表,这只是一个 PoC:

browser.webNavigation.onCommitted.addListener(
    function(details) {
        browser.tabs.insertCSS(details.tabId, {code: 'body {background:red}'})
    },
    {url: [{hostSuffix: '.example.com'}]}
);