Bug 1263481 - Fix webRequest multiple listeners support. r?kmag
MozReview-Commit-ID: EYWojttOhk6
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
@@ -152,18 +152,20 @@ function backgroundScript() {
let frameIDs = new Map();
let recorded = {requested: [],
beforeSendHeaders: [],
beforeRedirect: [],
sendHeaders: [],
responseStarted: [],
+ responseStarted2: [],
error: [],
- completed: []};
+ completed: [],
+ };
let testHeaders = {
request: {
added: {
"X-WebRequest-request": "text",
"X-WebRequest-request-binary": "binary",
},
modified: {
"User-Agent": "WebRequest",
@@ -412,16 +414,17 @@ function backgroundScript() {
}
browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, {urls: ["<all_urls>"]}, ["blocking"]);
browser.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, {urls: ["<all_urls>"]}, ["blocking", "requestHeaders"]);
browser.webRequest.onSendHeaders.addListener(onSendHeaders, {urls: ["<all_urls>"]}, ["requestHeaders"]);
browser.webRequest.onBeforeRedirect.addListener(onBeforeRedirect, {urls: ["<all_urls>"]});
browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
browser.webRequest.onResponseStarted.addListener(checkIpAndRecord.bind(null, "responseStarted"), {urls: ["<all_urls>"]});
+ browser.webRequest.onResponseStarted.addListener(checkIpAndRecord.bind(null, "responseStarted2"), {urls: ["<all_urls>"]});
browser.webRequest.onErrorOccurred.addListener(onErrorOccurred, {urls: ["<all_urls>"]});
browser.webRequest.onCompleted.addListener(onCompleted, {urls: ["<all_urls>"]}, ["responseHeaders"]);
function onTestMessage(msg) {
if (msg == "skipCompleted") {
checkCompleted = false;
browser.test.sendMessage("ackSkipCompleted");
} else {
@@ -494,17 +497,17 @@ function* test_once(skipCompleted) {
compareLists(recorded.requested, expected_requested, "requested");
compareLists(recorded.beforeSendHeaders, expected_beforeSendHeaders, "beforeSendHeaders");
compareLists(recorded.sendHeaders, expected_sendHeaders, "sendHeaders");
compareLists(recorded.beforeRedirect, expected_redirect, "beforeRedirect");
compareLists(recorded.responseStarted, expected_response, "responseStarted");
compareLists(recorded.error, expected_error, "error");
compareLists(recorded.completed, expected_complete, "completed");
-
+ compareLists(recorded.responseStarted2, recorded.responseStarted, "multiple non-blocking listeners");
yield extension.unload();
info("webrequest extension unloaded");
}
// Run the test twice to make sure it works with caching.
add_task(function* () { yield test_once(false); });
add_task(function* () { yield test_once(true); });
</script>
--- a/toolkit/modules/addons/WebRequest.jsm
+++ b/toolkit/modules/addons/WebRequest.jsm
@@ -570,17 +570,17 @@ HttpObserverManager = {
let result = null;
try {
result = callback(data);
} catch (e) {
Cu.reportError(e);
}
if (!result || !opts.blocking) {
- return true;
+ continue;
}
if (result.cancel) {
channel.cancel(Cr.NS_ERROR_ABORT);
this.errorCheck(channel, loadContext);
return false;
}
if (result.redirectUrl) {
channel.redirectTo(BrowserUtils.makeURI(result.redirectUrl));