在 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'}]}
);
所以我正在尝试按照使用 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'}]}
);