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

时间:2012-03-05 18:28:41

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在使用Firefox Add-on SDK将Chrome扩展程序移植到Firefox。

该扩展程序包含一个连接到toolbar button(相当于Chrome的popup.html +浏览器操作)和PageMod内容脚本的面板。

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

以下问题在Chrome环境中演示了此概念。我只需要帮助将它移植到Firefox Chrome Extension - Message Passing from Popup to Content Script

1 个答案:

答案 0 :(得分:9)

附加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 object documentation)。因此,当您需要向分配给特定选项卡的工作人员发送消息时,请执行以下操作:

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

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