Firefox:如何从电解 (e10s) 下的 JS 模块获取 nsIMessageManager 实例?

Firefox: How do I get an nsIMessageManager instance from a JS Module under Electrolysis (e10s)?

我正在尝试移植我的 Firefox 扩展以在电解/e10s/多进程模式下工作。我有一个功能需要通过 nsIComponentRegistrar 注册,所以它在一个 JSM 中,它只加载一次(每个进程)。我在子范围内 运行,所以我无权访问文件之类的东西,但我的功能需要这样做。所以我想 sendSyncMessage() 到父进程以获取该详细信息(在这种情况下只是文件的路径)。

The docs 甚至明确提到做这样的事情。但是在 JSM 中,我在范围内没有消息管理器来调用 sendSyncMessage()。我如何获得(正确的?)一个句柄?当我接到电话时,我没有任何与范围内的内容 document/window 相关的内容。


更新,为清楚起见:

var c = Cc['@mozilla.org/childprocessmessagemanager;1'];
var s = c.getService(Ci.nsISyncMessageSender);
var response = s.sendSyncMessage('id', {'data': 'x'});
dump('response len?? ' + response.length + '\n');

此代码产生 0 个响应,甚至 运行 直接在框架脚本中(而不是在框架脚本加载的 JSM 中)。如果我只是在框架脚本中使用全局可用的 sendSyncMessage(),那么它会得到我期望的 1 个响应。

这可能有效,没有承诺。

尝试加载:

Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);

如果这不起作用,请尝试使用:

Cc['@mozilla.org/childprocessmessagemanager;1'].getService(Ci.nsISyncMessageSender);

反之亦然

"@mozilla.org/childprocessmessagemanager;1" 是要走的路。在子进程 JSM 中使用它。

然而,正如 MDN 所说:

In addition to Message Managers centered around window and tab objects there also is a separate hierachy focusing on process boundaries.

因此,您不能使用常规框架脚本信使,而必须在父(主)进程中使用"@mozilla.org/parentprocessmessagemanager;1"

child.jsm

let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"].
           getService(Ci.nsISyncMessageSender);
cpmm.sendSyncMessage("addon:present?!")[0] === "yup"

parent.jsm

let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"].
           getService(Ci.nsIMessageListenerManager);
ppmm.addMessageListener("addon:present?", m => "yup");

核心代码在不同的地方使用这个方案,例如Network:SampleRate