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
我正在尝试移植我的 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