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

lhk*_*lhk 4 javascript google-chrome google-chrome-extension firefox-addon-webextensions

我正在尝试编写一个简单的Web扩展。目前,我正在关注各种教程,并试图了解该体系结构。

通过注入到网站源代码中的content_scripts与特定选项卡进行交互。在我看来,好像content_scripts是自动加载的:https : //developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts

关于MDN 的教程使这一点更加清晰:

该脚本将被加载到与content_scripts manifest.json键中给出的模式匹配的页面中。脚本可以直接访问文档,就像页面本身加载的脚本一样。

我的扩展程序应该为每个文本选择提供一个上下文菜单。首先,我发现了一个有用的Chrome扩展示例。您可以在这里https://developers.chrome.com/extensions/samples找到它,它被称为“说话选择”

该扩展程序正在使用tts引擎读取所选文本。但是源代码的一部分令人困惑:它们具有显式功能,可以在选项卡中运行content_scripts。此代码在其后台脚本之一中作为Init()函数的一部分执行:

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});
      }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

据我所知,浏览器启动后即会立即执行代码。那不是多余的吗?

他们的manifest.json应该负责content_script的执行,这是相关代码:

"content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "all_frames": true,
      "js": [
        "keycodes.js",
        "content_script.js"
      ]
    }
  ],
Run Code Online (Sandbox Code Playgroud)

将脚本注入每个打开的选项卡的正确方法是什么?

Xan*_*Xan 5

简短答案:Chrome需要此功能,但Firefox不需要。


Chrome浏览器不会加载内容脚本到在扩展负载(包括扩展的更新,而不仅仅是初始负载)匹配的网页。

因此,如果要在扩展加载时打开选项卡中的内容脚本功能(而不是将来的导航),则需要此代码(或类似代码)。

您可以使用来对代码进行现代化chrome.tabs.query


Firefox在这方面与Chrome不兼容:它在加载时自动将内容脚本注入所有匹配的内容。因此,您应该使用一些浏览器检测和/或仅注入一次防护代码。

我希望他们不会将其介绍为一项重大变化。至少提供一个清单键来选择行为以便于过渡是很有意义的。


注意:在扩展重新加载方案中,旧实例中的内容脚本将继续存在(但是扩展API将会失败);妥善处理是您的责任。