【问题标题】:Dynamically modify content_scripts.matches in FireFox extension动态修改 FireFox 扩展中的 content_scripts.matches
【发布时间】:2016-12-13 13:30:09
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您在这里问了两个不同的问题:“我可以动态更改注入 manifest.json content_script 的 URL 吗?”和“如何在我动态确定的 URL 上注入内容脚本?”虽然相关,但如果这是两个独立的问题,而不是归为一个问题,那就更好了。请将此问题编辑为其中之一,并ask a another Question for the other
  • 我以为自己只是在问第一个问题。重读时,我发现它不清楚并按照您建议的方式进行了更改。

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


【解决方案1】:

不,对于manifest.json content_script(CSS 或 JavaScript),无法修改将发生注入的 URL。指定的代码将被注入所有匹配的 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 条目获得的功能类似的功能,但具有更多控制权。这种更大的控制是以更高的复杂性为代价的。

【讨论】:

    【解决方案2】:

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

    • 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'}]}
    );
    

    【讨论】:

    • 事件的选择真的无助于我想到的用例。我想创建功能(发布到博客的记录 cmets),该功能仅在与用户设置的模式匹配的那些 url 上运行,即,如果用户设置 enable_record_comment: stackoverflow.com/* 它也将在 stackoverflow 上运行。但我想答案是,如果我想要那种功能,我只需要吃掉到处跑造成的任何性能损失。
    • @PeterGerdes 不确定是什么问题,事件路由是在浏览器内部完成的,应该非常有效。您可以尝试使用数千个不同的过滤器添加侦听器 - 我没有看到任何可观察到的性能影响。当用户更改设置时,您可以轻松删除旧侦听器并添加带有更新过滤器集的新侦听器(addListener 的第二个参数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多