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

时间:2016-12-13 13:30:09

标签: javascript firefox content-script firefox-webextensions manifest.json

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

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

由于

2 个答案:

答案 0 :(得分:1)

不,无法修改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条目获得的类似功能,但具有更多控制权。这种更大的控制是以更大的复杂性为代价的。

答案 1 :(得分:0)

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

  • onBeforeNavigate
  • onCommitted
  • onDOMContentLoaded
  • onCompleted。

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

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