| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ | 16 */ |
| 17 | 17 |
| 18 "use strict"; | 18 "use strict"; |
| 19 | 19 |
| 20 let {EventEmitter} = require("events"); |
| 21 |
| 20 const MESSAGE_NAME = "AdblockPlus:Message"; | 22 const MESSAGE_NAME = "AdblockPlus:Message"; |
| 21 const RESPONSE_NAME = "AdblockPlus:Response"; | 23 const RESPONSE_NAME = "AdblockPlus:Response"; |
| 22 | 24 |
| 23 function isPromise(value) | 25 function isPromise(value) |
| 24 { | 26 { |
| 25 // value instanceof Promise won't work - there can be different Promise | 27 // value instanceof Promise won't work - there can be different Promise |
| 26 // classes (e.g. in different contexts) and there can also be promise-like | 28 // classes (e.g. in different contexts) and there can also be promise-like |
| 27 // classes (e.g. Task). | 29 // classes (e.g. Task). |
| 28 return (value && typeof value.then == "function"); | 30 return (value && typeof value.then == "function"); |
| 29 } | 31 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 | 116 |
| 115 /** | 117 /** |
| 116 * Communication port wrapping the message manager API to send and receive | 118 * Communication port wrapping the message manager API to send and receive |
| 117 * messages. | 119 * messages. |
| 118 * @param {nsIMessageManager} messageManager | 120 * @param {nsIMessageManager} messageManager |
| 119 * @constructor | 121 * @constructor |
| 120 */ | 122 */ |
| 121 function Port(messageManager) | 123 function Port(messageManager) |
| 122 { | 124 { |
| 123 this._messageManager = messageManager; | 125 this._messageManager = messageManager; |
| 126 this._eventEmitter = new EventEmitter(); |
| 124 | 127 |
| 125 this._callbacks = new Map(); | |
| 126 this._responseCallbacks = new Map(); | 128 this._responseCallbacks = new Map(); |
| 127 this._responseCallbackCounter = 0; | 129 this._responseCallbackCounter = 0; |
| 128 | 130 |
| 129 this._handleRequest = this._handleRequest.bind(this); | 131 this._handleRequest = this._handleRequest.bind(this); |
| 130 this._handleResponse = this._handleResponse.bind(this); | 132 this._handleResponse = this._handleResponse.bind(this); |
| 131 this._messageManager.addMessageListener(MESSAGE_NAME, this._handleRequest); | 133 this._messageManager.addMessageListener(MESSAGE_NAME, this._handleRequest); |
| 132 this._messageManager.addMessageListener(RESPONSE_NAME, this._handleResponse); | 134 this._messageManager.addMessageListener(RESPONSE_NAME, this._handleResponse); |
| 133 } | 135 } |
| 134 Port.prototype = { | 136 Port.prototype = { |
| 135 /** | 137 /** |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 callbackData[2] = --expectedResponses; | 203 callbackData[2] = --expectedResponses; |
| 202 if (expectedResponses <= 0) | 204 if (expectedResponses <= 0) |
| 203 { | 205 { |
| 204 this._responseCallbacks.delete(callbackID); | 206 this._responseCallbacks.delete(callbackID); |
| 205 callback(processor.value); | 207 callback(processor.value); |
| 206 } | 208 } |
| 207 }, | 209 }, |
| 208 | 210 |
| 209 _dispatch: function(messageName, payload, sender) | 211 _dispatch: function(messageName, payload, sender) |
| 210 { | 212 { |
| 211 let callbacks = this._callbacks.get(messageName); | 213 let callbacks = this._eventEmitter.listeners(messageName); |
| 212 if (!callbacks) | |
| 213 return undefined; | |
| 214 | |
| 215 callbacks = callbacks.slice(); | |
| 216 let processor = new ResponseProcessor(messageName); | 214 let processor = new ResponseProcessor(messageName); |
| 217 for (let callback of callbacks) | 215 for (let callback of callbacks) |
| 218 { | 216 { |
| 219 try | 217 try |
| 220 { | 218 { |
| 221 processor.add(callback(payload, sender)); | 219 processor.add(callback(payload, sender)); |
| 222 } | 220 } |
| 223 catch (e) | 221 catch (e) |
| 224 { | 222 { |
| 225 Cu.reportError(e); | 223 Cu.reportError(e); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 239 * response). | 237 * response). |
| 240 */ | 238 */ |
| 241 | 239 |
| 242 /** | 240 /** |
| 243 * Adds a handler for the specified message. | 241 * Adds a handler for the specified message. |
| 244 * @param {string} messageName message that would trigger the callback | 242 * @param {string} messageName message that would trigger the callback |
| 245 * @param {Port~messageHandler} callback | 243 * @param {Port~messageHandler} callback |
| 246 */ | 244 */ |
| 247 on: function(messageName, callback) | 245 on: function(messageName, callback) |
| 248 { | 246 { |
| 249 let callbacks = this._callbacks.get(messageName); | 247 this._eventEmitter.on(messageName, callback); |
| 250 if (callbacks) | |
| 251 callbacks.push(callback); | |
| 252 else | |
| 253 this._callbacks.set(messageName, [callback]); | |
| 254 }, | 248 }, |
| 255 | 249 |
| 256 /** | 250 /** |
| 257 * Removes a handler for the specified message. | 251 * Removes a handler for the specified message. |
| 258 * @param {string} messageName message that would trigger the callback | 252 * @param {string} messageName message that would trigger the callback |
| 259 * @param {Port~messageHandler} callback | 253 * @param {Port~messageHandler} callback |
| 260 */ | 254 */ |
| 261 off: function(messageName, callback) | 255 off: function(messageName, callback) |
| 262 { | 256 { |
| 263 let callbacks = this._callbacks.get(messageName); | 257 this._eventEmitter.off(messageName, callback); |
| 264 if (!callbacks) | |
| 265 return; | |
| 266 | |
| 267 let index = callbacks.indexOf(callback); | |
| 268 if (index >= 0) | |
| 269 callbacks.splice(index, 1); | |
| 270 }, | 258 }, |
| 271 | 259 |
| 272 /** | 260 /** |
| 273 * Sends a message. | 261 * Sends a message. |
| 274 * @param {string} messageName message identifier | 262 * @param {string} messageName message identifier |
| 275 * @param [payload] data to attach to the message | 263 * @param [payload] data to attach to the message |
| 276 */ | 264 */ |
| 277 emit: function(messageName, payload) | 265 emit: function(messageName, payload) |
| 278 { | 266 { |
| 279 sendMessage(this._messageManager, messageName, payload, undefined); | 267 sendMessage(this._messageManager, messageName, payload, undefined); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 catch (e) | 307 catch (e) |
| 320 { | 308 { |
| 321 // Parent | 309 // Parent |
| 322 messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] | 310 messageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"] |
| 323 .getService(Ci.nsIMessageListenerManager); | 311 .getService(Ci.nsIMessageListenerManager); |
| 324 } | 312 } |
| 325 | 313 |
| 326 let port = new Port(messageManager); | 314 let port = new Port(messageManager); |
| 327 onShutdown.add(() => port.disconnect()); | 315 onShutdown.add(() => port.disconnect()); |
| 328 exports.port = port; | 316 exports.port = port; |
| OLD | NEW |