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

时间:2015-01-23 17:48:40

标签: javascript firefox firefox-addon multiprocessing

我试图将我的Firefox扩展程序移植到Electrolysis / e10s / multi-process模式下工作。我有一个需要通过nsIComponentRegistrar注册的功能,因此它只能在一个JSM中加载一次(每个进程)。我在儿童范围内跑步,所以我无法访问文件等内容,但我的功能需要这样做。所以我希望sendSyncMessage()到父进程来获取该细节(在这种情况下只是文件的路径)。

The docs甚至提到明确地做这样的事情。但是在JSM中,我没有一个消息管理器可以调用sendSyncMessage()。如何处理(右边?)一个?当我接到电话时,我没有任何与内容文件/窗口有关的内容。


更新,为清晰起见:

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响应。

2 个答案:

答案 0 :(得分:2)

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

然而,正如MDN所说:

  

除了以窗口和制表符对象为中心的消息管理器   还有一个单独的层次关注过程边界。

因此,您不能使用常规框架脚本信使,但必须在父(主)过程中使用"@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

答案 1 :(得分:1)

这可能有效,没有承诺。

尝试加载:

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

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

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

反之亦然