面板&在Firefox扩展中传递的PageMod内容脚本消息

Panel & PageMod Content Script message passing in a Firefox extension

本文关键字:PageMod 消息 脚本 amp 扩展 Firefox 面板      更新时间:2023-09-26

我正在使用Firefox插件SDK将Chrome扩展移植到Firefox。

该扩展由一个连接到工具栏按钮的面板(相当于Chrome的popup.html+浏览器操作)和一个PageMod内容脚本组成。

当面板打开时,它需要向当前选项卡的内容脚本发送一条消息,以接收来自该页面的包含某些信息的对象。我遇到的问题是如何实际传递消息。有人能帮我指明正确的方向吗?我似乎找不到很多资源来帮助Chrome扩展开发人员学习Firefox插件的开发。

下面的问题在Chrome环境中演示了这个概念。我只需要帮助将它移植到Firefox
Chrome扩展-消息从弹出窗口传递到内容脚本

插件SDK有点复杂,因为你不与那里的选项卡通信,而是与你创建的工作人员通信。这个系统不会跟踪工人,你必须自己做。像这样的东西应该可以工作(未经测试的代码):

var workers = [];
var pageMod = require("page-mod");
pageMod.PageMod({
  include: ...,
  contentScriptFile: ...,
  onAttach: function(worker)
  {
    workers.push(worker);
    worker.on("detach", function()
    {
      var index = workers.indexOf(worker);
      if (index >= 0)
        workers.splice(index, 1);
    });
  }
});

这样可以确保workers变量包含活动工作者的列表(Worker对象文档)。因此,当你需要向分配给特定选项卡的工作人员发送消息时,你可以这样做:

var tabs = require('tabs');
for (var i = 0; i < workers.length; i++)
  if (workers[i].tab == tabs.activeTab)
    worker.postMessage(...);

当然,您只能从扩展本身执行此操作,而不能从加载到面板或类似内容的内容脚本执行此操作。如果你在一个内容脚本中,你首先必须向扩展发送一条消息,然后它应该将消息转发给选项卡中的工作者。