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

Javascript 在FireFox扩展中动态修改content_scripts.matches,javascript,firefox,content-script,firefox-addon-webextensions,manifest.json,Javascript,Firefox,Content Script,Firefox Addon Webextensions,Manifest.json,因此,我尝试按照使用WebExtensions的firefox扩展的说明进行操作,并希望将内容脚本附加到某些页面(如本文所述:) 问题是,当我编写扩展但从本地存储加载它时,我不想指定我希望在manifest.json中运行content_脚本的页面集,也就是说,我设置了一个选项页面,用户可以在其中指定应该运行content脚本的页面。是否可以动态更改通常使用manifest.json中的content_script指令设置的要修改的页面列表 谢谢否,无法修改manifest.jsonconten

因此,我尝试按照使用WebExtensions的firefox扩展的说明进行操作,并希望将内容脚本附加到某些页面(如本文所述:)

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


谢谢

否,无法修改
manifest.json
content\u脚本
(CSS或JavaScript)的注入URL。指定的代码将被注入所有匹配的URL中。这有多种原因

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

是的,这将有可能有一种方式来宣布你将这样做。铬有一种实验性的方法来实现这一点。在Chrome中,这被认为是实验性的,即使在提供了几年之后。它在Firefox中不可用。它何时可用,甚至是否在Firefox中可用,目前还不清楚。此外,即使在Chrome中,它也缺少其他注入脚本方法可用的一些功能(例如
run\u at
/
runAt


为了完全控制注射或不注射,您需要通过和/或执行注射。使用这些方法注入或不注入脚本和CSS完全由扩展中的JavaScript控制。使用这些方法可以获得与使用
manifest.json
content\u script
项获得的功能类似的功能,但需要更多的控制。这种更大的控制力是以更大的复杂性为代价的。

这怎么样?有许多事件需要听,您可以选择任何一个满足uour要求的事件:

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

您在这里提出了两个不同的问题:“我可以动态更改manifest.json
content\u script
注入的URL吗?”和“我如何在我动态确定的URL上注入内容脚本?”虽然相关,但如果这是两个独立的问题,而不是一个问题,那会更好。请把这个问题编辑成其中一个问题,我认为自己只是在问第一个问题。在重读时,我发现它不清楚,并以您建议的方式对其进行了更改。事件的选择确实无助于我所考虑的用例。我想创建一个功能(记录发布到博客上的评论),该功能只在那些与用户设置的模式匹配的URL上运行,也就是说,如果用户设置enable_record_comment:stackoverflow.com/*它也会在stackoverflow上运行。但我想答案是,如果我想要这种功能,我只需要吃掉到处运行所带来的任何性能损失。@PeterGerdes不确定问题出在哪里,事件路由是在浏览器内部完成的,应该非常有效。您可以尝试添加具有数千个不同过滤器的侦听器-我没有看到任何明显的性能影响。当用户更改设置时,您可以轻松删除旧的侦听器并添加新的侦听器,并设置更新的筛选器(第二个参数为
addListener