2

因此,我正在尝试使用 WebExtensions 遵循 firefox 扩展的说明,并且我想将内容脚本附加到某些页面(如此处所述:https ://developer.mozilla.org/en-US/Add-ons/WebExtensions /Modify_a_web_page)。

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

谢谢

4

2 回答 2

2

不,没有办法修改将发生注入的 URL manifest.json content_script(CSS 或 JavaScript)。指定的代码将被注入所有匹配的 URL。这是有多种原因的。

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

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

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

于 2016-12-13T17:02:06.060 回答
0

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

  • onBeforeNavigate
  • 承诺
  • onDOMContentLoaded
  • 完成。

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

browser.webNavigation.onCommitted.addListener(
    function(details) {
        browser.tabs.insertCSS(details.tabId, {code: 'body {background:red}'})
    },
    {url: [{hostSuffix: '.example.com'}]}
);
于 2017-03-04T16:14:07.203 回答