Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm trying to port my Firefox extension to work under Electrolysis / e10s / multi-process mode. I've got a feature that requires registration through nsIComponentRegistrar so it's in a JSM which gets loaded only once (per process). I'm running in the child scope, so I don't have access to things like files, but my feature requires that. So I want to sendSyncMessage() to the parent process to fetch that detail (just the path to a file in this case).

The docs even mention doing something like this explicitly. But in the JSM I don't have a message manager in scope to call sendSyncMessage() on. How do I get a handle to (the right?) one? When I get called I don't have anything relating to the content document/window in scope.


Update, for clarity:

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');

This code produces 0 responses, even running directly in the frame script (not in the JSM which the frame script loads). If I just use the globally available sendSyncMessage() in the frame script then it gets the 1 response I expect.

like image 823
arantius Avatar asked Jan 17 '26 22:01

arantius


1 Answers

"@mozilla.org/childprocessmessagemanager;1" is the way to go. Use that in child process JSMs.

However, as MDN puts it:

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

Therefore, you cannot use the regular frame script messengers, but have to use "@mozilla.org/parentprocessmessagemanager;1" in the parent (main) process.

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");

Core code uses this scheme in various places, e.g. Network:SampleRate

like image 146
nmaier Avatar answered Jan 20 '26 11:01

nmaier



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!