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

Firefox addon 内容脚本无法通过send.port.emit发送消息,firefox-addon,firefox-addon-sdk,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({ contentScrip

我在目前正在开发的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页面,并且能够从扩展接收消息和向扩展发送消息,这是绝对重要的。我如何克服这个限制



我创建了一个很小的扩展,它清晰地再现了这个问题。你可以找到它。

找到了一种绕过限制的方法,但它相当粗糙。它包括抓取选项卡的内容窗口对象,然后依赖窗口的
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?或者为什么它会安静地抑制发送消息的尝试。

正如所指出的,答案是在
就绪
事件中发送消息(而不是
打开