gecko-dev/toolkit/components/extensions/ext-test.js
Rob Wu be3652cd57 Bug 1287010 - Make environment of Context explicit. r=billm
- Add `envType` to BaseContext.
 - Pass an explicit envType to all `registerSchemaAPI` invocations.
 - The factories passed to `registerSchemaAPI` will be split up later, so
   that content scripts (`content_child`) and addon pages can share
   common implementations.
 - The factories that implement the addon API will also be split up,
   to separate code running in the main process (`addon_parent`) from
   code running in a child process (`addon_child`).
 - Remove the use of a hardcoded list of `namespaces` from ProxyContext.
   Now `envType` is used to specify whether an API should be activated.

MozReview-Commit-ID: Jiff8HIwG92

--HG--
extra : rebase_source : 946a3c0009a4e3223c2d10044b3099a94c845394
2016-08-16 15:51:50 -07:00

80 lines
2 KiB
JavaScript

"use strict";
Components.utils.import("resource://gre/modules/ExtensionUtils.jsm");
var {
EventManager,
} = ExtensionUtils;
// WeakMap[Extension -> Set(callback)]
var messageHandlers = new WeakMap();
/* eslint-disable mozilla/balanced-listeners */
extensions.on("startup", (type, extension) => {
messageHandlers.set(extension, new Set());
});
extensions.on("shutdown", (type, extension) => {
messageHandlers.delete(extension);
});
extensions.on("test-message", (type, extension, ...args) => {
let handlers = messageHandlers.get(extension);
for (let handler of handlers) {
handler(...args);
}
});
/* eslint-enable mozilla/balanced-listeners */
function testApiFactory(context) {
let {extension} = context;
return {
test: {
sendMessage: function(...args) {
extension.emit("test-message", ...args);
},
notifyPass: function(msg) {
extension.emit("test-done", true, msg);
},
notifyFail: function(msg) {
extension.emit("test-done", false, msg);
},
log: function(msg) {
extension.emit("test-log", true, msg);
},
fail: function(msg) {
extension.emit("test-result", false, msg);
},
succeed: function(msg) {
extension.emit("test-result", true, msg);
},
assertTrue: function(value, msg) {
extension.emit("test-result", Boolean(value), msg);
},
assertFalse: function(value, msg) {
extension.emit("test-result", !value, msg);
},
assertEq: function(expected, actual, msg) {
extension.emit("test-eq", expected === actual, msg, String(expected), String(actual));
},
onMessage: new EventManager(context, "test.onMessage", fire => {
let handlers = messageHandlers.get(extension);
handlers.add(fire);
return () => {
handlers.delete(fire);
};
}).api(),
},
};
}
extensions.registerSchemaAPI("test", "addon_parent", testApiFactory);
extensions.registerSchemaAPI("test", "content_parent", testApiFactory);