--- 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) {