Web扩展是否需要显式加载内容脚本?

时间:2017-09-14 14:23:32

标签: javascript google-chrome google-chrome-extension firefox-webextensions

我正在尝试编写一个简单的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});
      }
    }
  });
}

将脚本注入每个打开的标签的正确方法是什么?

2 个答案:

答案 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)
   {...}