Index: lib/messaging.js |
=================================================================== |
--- a/lib/messaging.js |
+++ b/lib/messaging.js |
@@ -17,56 +17,48 @@ |
/** @module messaging */ |
"use strict"; |
const {EventEmitter} = require("events"); |
/** |
- * Communication port wrapping ext.onMessage to receive messages. |
+ * Communication port wrapping runtime.onMessage to receive messages. |
* |
* @constructor |
*/ |
function Port() |
{ |
this._eventEmitter = new EventEmitter(); |
this._onMessage = this._onMessage.bind(this); |
- ext.onMessage.addListener(this._onMessage); |
+ browser.runtime.onMessage.addListener(this._onMessage); |
} |
Port.prototype = { |
- _onMessage(message, sender, sendResponse) |
+ _onMessage(message, sender) |
{ |
- let async = false; |
- let callbacks = this._eventEmitter.listeners(message.type); |
- |
- for (let callback of callbacks) |
+ // Add "page" and "frame" if the message was sent by a content script. |
Manish Jethani
2018/03/22 19:56:55
This used to be in ext/background.js
|
+ // If sent by popup or the background page itself, there is no "tab". |
+ if ("tab" in sender) |
{ |
- let response = callback(message, sender); |
- |
- if (response && typeof response.then == "function") |
- { |
- response.then( |
- sendResponse, |
- reason => |
- { |
- console.error(reason); |
- sendResponse(undefined); |
- } |
- ); |
- async = true; |
- } |
- else if (typeof response != "undefined") |
- { |
- sendResponse(response); |
- } |
+ sender = { |
+ page: new ext.Page(sender.tab), |
+ frame: new ext.Frame(sender.tab.id, sender.frameId, sender.url) |
+ }; |
} |
- return async; |
+ // The message sender receives only the first response. |
Manish Jethani
2018/03/22 19:56:55
Note: using Promise.race here to resolve with firs
|
+ // https://developer.chrome.com/apps/messaging |
+ // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onMessage |
+ return Promise.race( |
+ this._eventEmitter.listeners(message.type) |
+ .map(callback => callback(message, sender)) |
+ .filter(response => typeof response != "undefined") |
+ ); |
}, |
/** |
* Function to be called when a particular message is received. |
* |
* @callback Port~messageCallback |
* @param {object} message |
* @param {object} sender |
@@ -98,17 +90,17 @@ |
this._eventEmitter.off(name, callback); |
}, |
/** |
* Disables the port and makes it stop listening to incoming messages. |
*/ |
disconnect() |
{ |
- ext.onMessage.removeListener(this._onMessage); |
+ brower.runtime.onMessage.removeListener(this._onMessage); |
} |
}; |
/** |
* The default port to receive messages. |
* |
* @type {Port} |
*/ |