Index: lib/utils.js |
=================================================================== |
--- a/lib/utils.js |
+++ b/lib/utils.js |
@@ -524,16 +524,54 @@ let Utils = exports.Utils = |
if (accesskey != "") |
element.setAttribute("accesskey", accesskey); |
// Labels forward changes of the accessKey property to their control, only |
// set it for actual controls. |
if (element.localName != "label") |
element.accessKey = accesskey; |
} |
+ }, |
+ |
+ /** |
+ * Adds a message handler that will respond to both synchronous and |
+ * asynchonous messages. |
+ * @param {string} messageName name of the message to listen to |
+ * @param {Function} handler handler to be called with the message data. The |
+ * return value will be sent back to the child. |
+ */ |
+ addChildMessageListener: function(messageName, handler) |
+ { |
+ let messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] |
+ .getService(Ci.nsIMessageListenerManager); |
+ let wrapper = (message) => { |
+ let {callbackID, data} = message.data; |
+ let response = undefined; |
+ try |
+ { |
+ response = handler(data); |
+ } |
+ catch (e) |
+ { |
+ Cu.reportError(e); |
+ } |
+ |
+ if (callbackID) |
+ { |
+ let target = message.target.QueryInterface(Ci.nsIMessageSender); |
+ target.sendAsyncMessage("AdblockPlus:Response", { |
+ callbackID, |
+ response |
+ }); |
+ } |
+ else |
+ return response; |
+ }; |
+ messageManager.addMessageListener(messageName, wrapper); |
+ onShutdown.add(() => messageManager.removeMessageListener(messageName, wrapper)); |
} |
}; |
/** |
* A cache with a fixed capacity, newer entries replace entries that have been |
* stored first. |
* @constructor |
*/ |