Bug 1263481 - Fix webRequest multiple listeners support. r?kmag draft
authorGiorgio Maone <g.maone@informaction.com>
Mon, 11 Apr 2016 00:25:47 +0200
changeset 349547 cf308c2d5832806595e8422ae4e7d6cf51c2d46b
parent 349127 705c5fb32d49de2c09b564aa5ff8e8edf1be85ae
child 518135 b55ae3ea20ae757bfc1c823b22344c39a6a433a4
push id15124
push userg.maone@informaction.com
push dateMon, 11 Apr 2016 22:17:24 +0000
reviewerskmag
bugs1263481
milestone48.0a1
Bug 1263481 - Fix webRequest multiple listeners support. r?kmag MozReview-Commit-ID: EYWojttOhk6
toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
toolkit/modules/addons/WebRequest.jsm
--- 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));