Bug 1278687: Multiplex extension message listeners for use in chrome tests. r?aswan
MozReview-Commit-ID: 3V5FqnBQy1j
--- a/testing/specialpowers/content/specialpowersAPI.js
+++ b/testing/specialpowers/content/specialpowersAPI.js
@@ -1940,31 +1940,47 @@ SpecialPowersAPI.prototype = {
this.notifyObserversInParentProcess(null, "browser:purge-domain-data", "example.com");
},
cleanUpSTSData: function(origin, flags) {
return this._sendSyncMessage('SPCleanUpSTSData', {origin: origin, flags: flags || 0});
},
_nextExtensionID: 0,
+ _extensionListeners: null,
+
loadExtension: function(ext, handler) {
+ if (this._extensionListeners == null) {
+ this._extensionListeners = new Set();
+
+ this._addMessageListener("SPExtensionMessage", msg => {
+ for (let listener of this._extensionListeners) {
+ try {
+ listener(msg);
+ } catch (e) {
+ Cu.reportError(e);
+ }
+ }
+ });
+ }
+
// Note, this is not the addon is as used by the AddonManager etc,
// this is just an identifier used for specialpowers messaging
// between this content process and the chrome process.
let id = this._nextExtensionID++;
let resolveStartup, resolveUnload, rejectStartup;
let startupPromise = new Promise((resolve, reject) => {
resolveStartup = resolve;
rejectStartup = reject;
});
let unloadPromise = new Promise(resolve => { resolveUnload = resolve; });
startupPromise.catch(() => {
- this._removeMessageListener("SPExtensionMessage", listener);
+ this._extensionListeners.delete(listener);
});
handler = Cu.waiveXrays(handler);
ext = Cu.waiveXrays(ext);
let sp = this;
let state = "uninitialized";
let extension = {
@@ -1995,28 +2011,28 @@ SpecialPowersAPI.prototype = {
state = "running";
resolveStartup();
} else if (msg.data.type == "extensionSetId") {
extension.id = msg.data.args[0];
} else if (msg.data.type == "extensionFailed") {
state = "failed";
rejectStartup("startup failed");
} else if (msg.data.type == "extensionUnloaded") {
- this._removeMessageListener("SPExtensionMessage", listener);
+ this._extensionListeners.delete(listener);
state = "unloaded";
resolveUnload();
} else if (msg.data.type in handler) {
handler[msg.data.type](...msg.data.args);
} else {
dump(`Unexpected: ${msg.data.type}\n`);
}
}
};
- this._addMessageListener("SPExtensionMessage", listener);
+ this._extensionListeners.add(listener);
return extension;
},
invalidateExtensionStorageCache: function() {
this.notifyObserversInParentProcess(null, "extension-invalidate-storage-cache", "");
},
allowMedia: function(window, enable) {