我试图将我的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响应。
答案 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);
反之亦然