Bug 1317366: Handle blocking WebRequest listeners returning non-object values. r?mixedpuppy draft
authorKris Maglione <maglione.k@gmail.com>
Mon, 14 Nov 2016 21:34:23 -0800
changeset 438916 c22d3a007e979047afa11d982e84d0c28258c6d7
parent 438899 ee33be95f2e3d7f2ab7165fab0d7dc3669b31296
child 537013 dbdd0fe34c31c99f00233c94ffa8e0448b6c9086
push id35841
push usermaglione.k@gmail.com
push dateTue, 15 Nov 2016 05:35:00 +0000
reviewersmixedpuppy
bugs1317366
milestone52.0a1
Bug 1317366: Handle blocking WebRequest listeners returning non-object values. r?mixedpuppy MozReview-Commit-ID: HMbgONPqsKU
toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
toolkit/modules/addons/WebRequest.jsm
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
@@ -8,37 +8,53 @@
   <script type="text/javascript" src="head.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
 
 <script type="text/javascript">
 "use strict";
 
-add_task(function* () {
+add_task(function* test_suspend() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       permissions: [
         "webRequest",
         "webRequestBlocking",
       ],
     },
 
     background() {
-      browser.webRequest.onBeforeSendHeaders.addListener(details => {
-        let requestHeaders = details.requestHeaders.concat({name: "Foo", value: "Bar"});
+      browser.webRequest.onBeforeSendHeaders.addListener(
+        details => {
+          // Make sure that returning undefined or a promise that resolves to
+          // undefined does not break later handlers.
+        },
+        {urls: ["<all_urls>"]},
+        ["blocking", "requestHeaders"]);
 
-        return new Promise(resolve => {
-          setTimeout(resolve, 500);
-        }).then(() => {
-          return {requestHeaders};
-        });
-      },
-      {urls: ["<all_urls>"]},
-      ["blocking", "requestHeaders"]);
+      browser.webRequest.onBeforeSendHeaders.addListener(
+        details => {
+          return Promise.resolve();
+        },
+        {urls: ["<all_urls>"]},
+        ["blocking", "requestHeaders"]);
+
+      browser.webRequest.onBeforeSendHeaders.addListener(
+        details => {
+          let requestHeaders = details.requestHeaders.concat({name: "Foo", value: "Bar"});
+
+          return new Promise(resolve => {
+            setTimeout(resolve, 500);
+          }).then(() => {
+            return {requestHeaders};
+          });
+        },
+        {urls: ["<all_urls>"]},
+        ["blocking", "requestHeaders"]);
     },
   });
 
   yield extension.startup();
 
   let result = yield fetch(SimpleTest.getTestFileURL("return_headers.sjs"));
 
   let headers = JSON.parse(yield result.text());
--- a/toolkit/modules/addons/WebRequest.jsm
+++ b/toolkit/modules/addons/WebRequest.jsm
@@ -744,16 +744,20 @@ HttpObserverManager = {
           } catch (e) {
             Cu.reportError(e);
             value.result = {};
           }
         }
       }
 
       for (let {opts, result} of handlerResults) {
+        if (!result || typeof result !== "object") {
+          continue;
+        }
+
         if (result.cancel) {
           this.maybeResume(channel);
           channel.cancel(Cr.NS_ERROR_ABORT);
 
           this.errorCheck(channel, loadContext);
           return;
         }