Index: chrome/test/data/extensions/api_test/webrequest/test_blocking.js |
diff --git a/chrome/test/data/extensions/api_test/webrequest/test_blocking.js b/chrome/test/data/extensions/api_test/webrequest/test_blocking.js |
index f3aee70d04ca943ef3deed4acaf7de766980f64e..93008a6a0903a70158ef92bbe7004590bf70199e 100644 |
--- a/chrome/test/data/extensions/api_test/webrequest/test_blocking.js |
+++ b/chrome/test/data/extensions/api_test/webrequest/test_blocking.js |
@@ -322,6 +322,16 @@ runTests([ |
navigateAndWait(getURL("complexLoad/a.html")); |
}, |
+ // Tests redirect of <img crossorigin="anonymous" src="..."> |
+ function crossOriginAnonymousRedirect() { |
+ testLoadCORSImage("anonymous"); |
+ }, |
+ |
+ // Tests redirect of <img crossorigin="use-credentials" src="..."> |
+ function crossOriginCredentialedRedirect() { |
+ testLoadCORSImage("use-credentials"); |
+ }, |
+ |
// Loads a testserver page that echoes the User-Agent header that was |
// sent to fetch it. We modify the outgoing User-Agent in |
// onBeforeSendHeaders, so we should see that modified version. |
@@ -994,3 +1004,130 @@ runTests([ |
}); |
}, |
]); |
+ |
+ |
+// This helper verifies that extensions can successfully redirect resources even |
+// if cross-origin access control is in effect via the crossorigin attribute. |
+// Used by crossOriginAnonymousRedirect and crossOriginCredentialedRedirect. |
+function testLoadCORSImage(crossOriginAttributeValue) { |
+ // (Non-existent) image URL, with random query string to bust the cache. |
+ var requestedUrl = getServerURL("cors/intercepted_by_extension.gif?" + |
+ Math.random(), "original.tld"); |
+ var frameUrl = getServerURL( |
+ "extensions/api_test/webrequest/cors/load_image.html?" + |
+ "crossOrigin=" + crossOriginAttributeValue + |
+ "&src=" + encodeURIComponent(requestedUrl)); |
+ var redirectTarget = getServerURL( |
+ "extensions/api_test/webrequest/cors/redirect_target.gif", "domain.tld"); |
+ expect( |
+ [ // events |
+ { label: "onBeforeRequest-1", |
+ event: "onBeforeRequest", |
+ details: { |
+ type: "image", |
+ url: requestedUrl, |
+ // Frame URL unavailable because requests are filtered by type=image. |
+ frameUrl: "unknown frame URL", |
+ }, |
+ retval: {redirectUrl: redirectTarget} |
+ }, |
+ { label: "onBeforeRedirect", |
+ event: "onBeforeRedirect", |
+ details: { |
+ type: "image", |
+ url: requestedUrl, |
+ redirectUrl: redirectTarget, |
+ statusLine: "HTTP/1.1 307 Internal Redirect", |
+ statusCode: 307, |
+ fromCache: false, |
+ } |
+ }, |
+ { label: "onBeforeRequest-2", |
+ event: "onBeforeRequest", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ // Frame URL unavailable because requests are filtered by type=image. |
+ frameUrl: "unknown frame URL", |
+ }, |
+ }, |
+ { |
+ label: "onBeforeSendHeaders", |
+ event: "onBeforeSendHeaders", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ } |
+ }, |
+ { |
+ label: "onSendHeaders", |
+ event: "onSendHeaders", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ } |
+ }, |
+ { |
+ label: "onHeadersReceived", |
+ event: "onHeadersReceived", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ statusLine: "HTTP/1.1 200 OK", |
+ } |
+ }, |
+ { label: "onResponseStarted", |
+ event: "onResponseStarted", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ fromCache: false, |
+ statusCode: 200, |
+ ip: "127.0.0.1", |
+ statusLine: "HTTP/1.1 200 OK", |
+ } |
+ }, |
+ { label: "onCompleted", |
+ event: "onCompleted", |
+ details: { |
+ type: "image", |
+ url: redirectTarget, |
+ fromCache: false, |
+ statusCode: 200, |
+ ip: "127.0.0.1", |
+ statusLine: "HTTP/1.1 200 OK", |
+ } |
+ }, |
+ // After the image loads, the test will load the following URL |
+ // to signal that the test succeeded. |
+ { |
+ label: "onBeforeRequest-3", |
+ event: "onBeforeRequest", |
+ details: { |
+ type: "image", |
+ url: getServerURL("signal_that_image_loaded_successfully"), |
+ // Frame URL unavailable because requests are filtered by type=image. |
+ frameUrl: "unknown frame URL", |
+ }, |
+ retval: {cancel: true} |
+ }, |
+ { label: "onErrorOccurred", |
+ event: "onErrorOccurred", |
+ details: { |
+ type: "image", |
+ url: getServerURL("signal_that_image_loaded_successfully"), |
+ fromCache: false, |
+ error: "net::ERR_BLOCKED_BY_CLIENT", |
+ } |
+ }, |
+ ], |
+ [ // event order |
+ ["onBeforeRequest-1", "onBeforeRedirect", "onBeforeRequest-2", |
+ "onBeforeSendHeaders", "onSendHeaders", "onHeadersReceived", |
+ "onResponseStarted", "onCompleted", |
+ "onBeforeRequest-3", "onErrorOccurred"], |
+ ], |
+ {urls: ["<all_urls>"], types: ['image']}, // filter |
+ ["blocking"]); |
+ navigateAndWait(frameUrl); |
+} |