Bug 1406695 - Fail if a browser.test.onMessage handler throws an error. r?aswan
MozReview-Commit-ID: BXOrdtla1qE
--- a/toolkit/components/extensions/ext-c-test.js
+++ b/toolkit/components/extensions/ext-c-test.js
@@ -80,16 +80,28 @@ this.test = class extends ExtensionAPI {
function getStack() {
return new context.cloneScope.Error().stack.replace(/^/gm, " ");
}
function assertTrue(value, msg) {
extension.emit("test-result", Boolean(value), String(msg), getStack());
}
+ class TestEventManager extends EventManager {
+ addListener(callback, ...args) {
+ super.addListener(function(...args) {
+ try {
+ callback.call(this, ...args);
+ } catch (e) {
+ assertTrue(false, `${e}\n${e.stack}`);
+ }
+ }, ...args);
+ }
+ }
+
return {
test: {
sendMessage(...args) {
extension.emit("test-message", ...args);
},
notifyPass(msg) {
extension.emit("test-done", true, msg, getStack());
@@ -163,17 +175,17 @@ this.test = class extends ExtensionAPI {
let errorMessage = toSource(error && error.message);
assertTrue(errorMatches(error, expectedError, context),
`Function threw, expecting error to match ${toSource(expectedError)}` +
`got ${errorMessage}${msg}`);
}
},
- onMessage: new EventManager(context, "test.onMessage", fire => {
+ onMessage: new TestEventManager(context, "test.onMessage", fire => {
let handler = (event, ...args) => {
fire.async(...args);
};
extension.on("test-harness-message", handler);
return () => {
extension.off("test-harness-message", handler);
};