内容脚本无法通过send.port.emit发送消息

时间:2015-09-08 09:27:03

标签: firefox-addon firefox-addon-sdk

我在目前正在处理的SDK扩展程序中遇到了未记录的行为,并希望社群能够找到修复程序或解决方法。

只有在标签中打开扩展程序中嵌入的HTML页面时才会出现此问题,如下所示:

tabs.open(data.url("html/test.html"));

请注意,上面的test.html位于data/html扩展程序的根目录中。

我正在注入内容脚本并监听下面给出的消息:

tabs.once("open", function (tab) {
  var w = tab.attach({ contentScriptFile: [ data.url("js/embed.js") ]});

  w.port.once("init", function () {
    console.log("content script initialised");
  });
});

内容脚本data/js/embed.js包含以下内容:

console.log("attaching embedded script");
self.port.emit("init");

问题在于,如果内容脚本附加到数据 HTML页面(扩展中嵌入的页面),则内容脚本发送的消息将被抑制

我的扩展程序打开嵌入式HTML页面并且能够从扩展程序接收和发送消息是绝对至关重要的。我怎样才能克服这个限制?

我创建了一个小扩展,可以清楚地再现问题。你可以找到它here

2 个答案:

答案 0 :(得分:1)

正如here所指出的那样,答案是在ready事件中发出消息(而不是open)。

答案 1 :(得分:0)

找到一种规避限制的方法,但它相当骇人听闻。它包括抓取选项卡的内容窗口对象,然后依赖Window的postMessage API。像这样:

var tabs = require("sdk/tabs"),
    self = require("sdk/self"),
    data = self.data,
    utils = require("sdk/tabs/utils"),
    {viewFor} = require("sdk/view/core");

tabs.once("ready", function (tab) {
  var window = utils.getTabContentWindow(viewFor(tab));
  window.addEventListener("message", function (ev) {
    console.log("message received: ", ev.data);
  });
});

tabs.open(data.url("html/test.html"));

然后在HTML页面加载的脚本中,可以做类似的事情:

window.postMessage({ method: "init", state: true }, origin);

我仍然想知道为什么人们不能使用原生的self.port.emit API?或者为什么安静地会抑制发送消息的尝试。