Bug 1295680: Fix test race for image loading requests. r?mao draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 04 Oct 2016 23:08:40 +0100
changeset 420873 813a27530bb31cce52a542ce4f9d043aae8b8c0b
parent 420871 ede6abc13627a29a9e66952204f9bddb7a4cbc1a
child 532923 26e59030afe049c885b64cd9ed154f031121796c
push id31325
push usermaglione.k@gmail.com
push dateTue, 04 Oct 2016 22:13:24 +0000
reviewersmao
bugs1295680
milestone52.0a1
Bug 1295680: Fix test race for image loading requests. r?mao MozReview-Commit-ID: DTJTOFTKWna
toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest.html
@@ -147,16 +147,17 @@ function backgroundScript() {
     browser.test.assertTrue(ids && ids.has(details.requestId), `correct requestId for ${details.url} in ${event} (${details.requestId} in [${ids && [...ids].join(", ")}])`);
     if (ids && idDisposalEvents.has(event)) {
       ids.delete(details.requestId);
     }
   }
 
   let frameIDs = new Map();
   let skippedRequests = new Set();
+  let redirectedRequests = new Set();
 
   let recorded = {requested: [],
                   beforeSendHeaders: [],
                   beforeRedirect: [],
                   sendHeaders: [],
                   responseStarted: [],
                   responseStarted2: [],
                   error: [],
@@ -363,16 +364,17 @@ function backgroundScript() {
 
       browser.test.assertEq(details.tabId, savedTabId, "correct tab ID");
       checkType(details);
 
       let id = frameIDs.get(details.url);
       browser.test.assertEq(id, details.frameId, "frame ID same in onBeforeSendHeaders as onBeforeRequest");
     }
     if (details.url.includes("_redirect.")) {
+      redirectedRequests.add(details.requestId);
       return {redirectUrl: details.url.replace("_redirect.", "_good.")};
     }
     return {requestHeaders: details.requestHeaders};
   }
 
   function onBeforeRedirect(details) {
     browser.test.log(`onBeforeRedirect ${details.url} -> ${details.redirectUrl}`);
     checkRequestId(details, "redirect");
@@ -444,18 +446,26 @@ function backgroundScript() {
   function onHeadersReceived(details) {
     checkIpAndRecord("headersReceived", details);
     processHeaders("response", details);
     browser.test.log(`After processing response headers: ${details.responseHeaders.toSource()}`);
     return {responseHeaders: details.responseHeaders};
   }
 
   function onErrorOccurred(details) {
-    onRecord("error", details);
-    browser.test.assertTrue(/^NS_ERROR_/.test(details.error), `onErrorOccurred reported for ${details.url} (${details.error})`);
+    if (details.url.endsWith("_good.png") && redirectedRequests.has(details.requestId)) {
+      // Redirected image requests sometimes result in multiple attempts to
+      // load the same image in parallel. In this case, the later request is
+      // canceled, and the same image loading context is shared by both images.
+      redirectedRequests.delete(details.requestId);
+      browser.test.assertEq("NS_BINDING_ABORTED", details.error, `onErrorOccurred reported for ${details.url}`);
+    } else {
+      onRecord("error", details);
+      browser.test.assertTrue(/^NS_ERROR_/.test(details.error), `onErrorOccurred reported for ${details.url} (${details.error})`);
+    }
   }
 
   function onCompleted(details) {
     checkFromCache("completed", details);
     checkHeaders("response", details);
   }
 
   browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, {urls: ["<all_urls>"]}, ["blocking"]);
@@ -493,21 +503,22 @@ function backgroundScript() {
 function* test_once(skipCompleted) {
   let extensionData = {
     manifest: {
       permissions: [
         "webRequest",
         "webRequestBlocking",
       ],
     },
-    background: `const BASE = ${JSON.stringify(BASE)}; (${backgroundScript.toString()})()`,
+    background: `const BASE = ${JSON.stringify(BASE)}; (${backgroundScript})()`,
   };
 
   let extension = ExtensionTestUtils.loadExtension(extensionData);
-  let [, resourceTypes] = yield Promise.all([extension.startup(), extension.awaitMessage("ready")]);
+  yield extension.startup();
+  let resourceTypes = yield extension.awaitMessage("ready");
   info("webrequest extension loaded");
 
   if (skipCompleted) {
     extension.sendMessage("skipCompleted");
     yield extension.awaitMessage("ackSkipCompleted");
   }
 
   for (let key in resourceTypes) {