Bug 1406695 - Fail if a browser.test.onMessage handler throws an error. r?aswan draft
authorMasatoshi Kimura <VYV03354@nifty.ne.jp>
Sat, 07 Oct 2017 19:24:32 +0900
changeset 676501 1235bfd9b0977f01dd60426dc0fe43a50cf42d87
parent 676500 b863d8313f521333a755b933e9d832be8c1400fe
child 734953 59ca67e0b02e33d4bdae276da1449674e5792944
push id83511
push userVYV03354@nifty.ne.jp
push dateSat, 07 Oct 2017 22:11:57 +0000
reviewersaswan
bugs1406695
milestone58.0a1
Bug 1406695 - Fail if a browser.test.onMessage handler throws an error. r?aswan MozReview-Commit-ID: BXOrdtla1qE
toolkit/components/extensions/ext-c-test.js
--- 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);
           };