对于我的FF扩展名,我在content_scripts
中使用了manifest.json
中的matches: ['<all_urls>']
键,但是现在我使用browser.tabs.executeScript
切换到程序化注入。
如何确保将脚本加载到每个选项卡的每个框架中?我是否必须使用browser.tabs.onUpdated
监听选项卡的URL更改,或者使用DOMContentLoaded
来监听browser.webNavigation.onDOMContentLoaded
事件?
还是有一种更优雅的方法?
browser.tabs.onUpdated
的问题在于,它不会在ID为!== 0的iFrame的URL更改上触发。
因此,我尝试使用browser.webNavigation.onDOMContentLoaded
来解决此问题(简化的代码示例):
browser.webNavigation.onDOMContentLoaded.addListener(infos => {
const { tabId, frameId } = infos;
browser.tabs.executeScript(tabId, {
file: '../path/to/content-script.js',
frameId
});
});
所有这些的原因是,我想让用户启用退出自动内容脚本加载的功能,而是通过pageAction
手动进行加载,以及退出对iFrame的注入。因此,在DOMContentLoaded
上,将在进行任何注入之前检查这2个设置。
在comment to another question中,一位友好的用户建议我什至不需要其他API(例如webRequests
),而tabs.executeScript
就足够了-我想知道如何?有条件注入内容脚本的另一种方法吗?