我正在尝试编写一个简单的Web扩展。 目前,我正在学习各种教程,并尝试了解架构。
与特定标签的交互是通过注入网站源代码的content_scripts完成的。 在我看来,好像content_scripts是自动加载的: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts
MDN上的tutorial使这一点变得更加清晰:
此脚本将加载到与给定模式匹配的页面中 在content_scripts manifest.json键中。该脚本具有直接访问权限 到文档,就像页面本身加载的脚本一样。
我的扩展程序应该在每个文本选择上提供上下文菜单。 作为起点,我找到了一个有用的铬样本扩展。您可以在https://developers.chrome.com/extensions/samples找到它,它被称为"说出选择"
此扩展程序正在使用tts引擎读取所选文本。 但是源代码的一部分令人困惑:它们具有在选项卡中运行content_scripts的显式函数。此代码作为其后一个脚本中的Init()函数的一部分执行:
select * from YOUR_TABLE WHERE class = '295' and (classname = '' OR classname IS NULL);
据我所知,代码会在浏览器启动后立即执行。 这不是多余的吗?
他们的manifest.json应该处理content_script的执行,这里是相关的代码:
function loadContentScriptInAllTabs() {
chrome.windows.getAll({'populate': true}, function(windows) {
for (var i = 0; i < windows.length; i++) {
var tabs = windows[i].tabs;
for (var j = 0; j < tabs.length; j++) {
chrome.tabs.executeScript(
tabs[j].id,
{file: 'keycodes.js', allFrames: true});
chrome.tabs.executeScript(
tabs[j].id,
{file: 'content_script.js', allFrames: true});
}
}
});
}
将脚本注入每个打开的标签的正确方法是什么?
答案 0 :(得分:3)
简短回答:在Chrome中需要它,但不是Firefox。
Chrome does not load内容脚本在扩展加载时匹配页面(包括扩展更新,而不仅仅是初始加载)。
因此,如果您希望在扩展加载(而不是将来的导航)中打开选项卡中的内容脚本功能,则需要此代码(或类似代码)。
您可以使用chrome.tabs.query
对此代码进行一些现代化。
Firefox在这方面与Chrome不兼容: 会自动在加载时匹配的所有内容中插入内容脚本。所以你应该使用一些浏览器检测和/或只注入一次保护代码。
我希望他们没有将这作为一个突破性的变化。至少提供一个清单键来选择易于转换的行为是有意义的。
注意:在扩展重新加载方案中,旧实例的内容脚本仍然存在(但扩展API将失败);你有责任优雅地处理它。
答案 1 :(得分:0)
您可以将内容(前景)页面显式加载到任何选项卡中,或创建一个选项卡然后加载内容页面。从后台脚本执行此操作。除了需要活动的选项卡许可,您不需要清单文件中的条目。
browser.tabs.executeScript(null,{file:"/content.js"}).then(NextAction);
function NextAction(Array of last evaluated statement of foreground script in each frame)
{...}