How to send message or establish 2 way communication between two XUL Overlay Firefox extensions/add-ons -


i have xul overlay firefox extension, need develop dummy xul extension establishes connection original extension , sends set of parameters (message) original extension. in short, have trigger original extension dummy extension.

probably easiest way have original extension listening custom event on base browser window. dummy extension can create , dispatch event whatever custom data desired.

creating , dispatching event dummy:

function senddatatomainextension(data) {      if (typeof window === "undefined") {         //if there no window defined, recent.         var window=components.classes["@mozilla.org/appshell/window-mediator;1"]                            .getservice(components.interfaces.nsiwindowmediator)                              .getmostrecentwindow("navigator:browser");     }      //this assumes event being both sent      //  , received privileged (main add-on) code.     var event = new customevent('myextensionname-from-dummy', { 'detail': data });     window.dispatchevent(event); } 

you may need take same steps making sure data visible on receiving end necessary when firing privileged code non-privileged code.

listening event in main:

components.utils.import("resource://gre/modules/services.jsm"); const ci = components.interfaces;  //listen event on windows unknown on 1 //  event sent. function loadintowindow(mywindow) {     mywindow.addeventlistener("myextensionname-from-dummy",                                       receivemessagefromdummy, false); }  function unloadfromwindow(mywindow) {     mywindow.removeeventlistener("myextensionname-from-dummy",                                       receivemessagefromdummy, false); }  function foreachopenwindow(fn) {     // apply function open browser windows     var windows = services.wm.getenumerator("navigator:browser");     let windowcount =0;     while (windows.hasmoreelements()) {         windowcount++;         fn(windows.getnext().queryinterface(ci.nsidomwindow));     } }  function receivemessagefromdummy(event) {     var datafromdummy = event.detail;     //do whatever desired data. }  var windowlistener = {     onopenwindow: function(awindow)     {         let domwindow = awindow.queryinterface(ci.nsiinterfacerequestor)                                .getinterface(ci.nsidomwindowinternal || ci.nsidomwindow);         function onwindowload()         {             domwindow.removeeventlistener("load",onwindowload);             if (domwindow.document.documentelement.getattribute("windowtype")                                                                == "navigator:browser") {                 loadintowindow(domwindow);             }         }         domwindow.addeventlistener("load",onwindowload);     },      onclosewindow: function(xulwindow) { },  // each window has unload event handler.      onwindowtitlechange: function(xulwindow, newtitle) { } };  //listen custom event on current browser windows. foreachopenwindow(loadintowindow); //listen custom event on new browser window. services.wm.addlistener(windowlistener); 

the data sent should available event.detail within receivemessagefromdummy() function.

the code above provides 1 way communication. 2 way communication obtained duplicating code communicate in other direction different custom event. in other words, having main extension dispatching different custom event called myextensionname-from-main , having dummy extension listening event. code same above, event name changed , function called being receivemessagefrommain().

alternately, use window.postmessage(). doing sends "message" event can listen. however, doing leads complications easier avoid using custom event (e.g. have account fact code (i.e. other random extension) using event own purpose).

note: code loop through windows taken converting old overlay-based firefox extension restartless addon author re-wrote initial part of how convert overlay extension restartless on mdn. has been modified multiple times code. may have earlier versions other sources.


Comments