Bug 1317366: Handle blocking WebRequest listeners returning non-object values. r?mixedpuppy
MozReview-Commit-ID: HMbgONPqsKU
--- 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;
}