我正在尝试将我的 Firefox 扩展移植到电解/e10s/多进程模式下。我有一个功能需要通过 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 响应。

最佳答案

"@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

关于javascript - Firefox:如何从 Electrolysis (e10s) 下的 JS 模块获取 nsIMessageManager 实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28115739/

10-12 00:08