| <!doctype html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>HTTP Cache - Partioning by site</title> | |
| <meta name="help" href="https://fetch.spec.whatwg.org/#http-cache-partitions"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/utils.js"></script> | |
| <script src="/common/get-host-info.sub.js"></script> | |
| <script src="http-cache.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| const host = get_host_info(); | |
| // We run this entire test four times, varying the following two booleans: | |
| // - is_cross_site_test, which controls whether the popup is cross-site. | |
| // - load_resource_in_iframe, which controls whether the popup loads the | |
| // resource in an iframe or the top-level frame. Note that the iframe is | |
| // always same-site to the opener. | |
| function performFullTest(is_cross_site_test, load_resource_in_iframe, name) { | |
| const POPUP_HTTP_ORIGIN = is_cross_site_test ? host.HTTP_NOTSAMESITE_ORIGIN : host.HTTP_ORIGIN | |
| const LOCAL_HTTP_ORIGIN = host.HTTP_ORIGIN | |
| const popupBaseURL = POPUP_HTTP_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ; | |
| const localBaseURL = LOCAL_HTTP_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ; | |
| // Note: Navigation requests are requested with credentials. Make sure the | |
| // fetch requests are also requested with credentials. This ensures passing | |
| // this test is not simply the consequence of discriminating anonymous and | |
| // credentialled request in the HTTP cache. | |
| // | |
| // See https://github.com/whatwg/fetch/issues/1253 | |
| var test = { | |
| requests: [ | |
| { | |
| response_headers: [ | |
| ["Expires", (30 * 24 * 60 * 60)], | |
| ["Access-Control-Allow-Origin", POPUP_HTTP_ORIGIN], | |
| ], | |
| base_url: localBaseURL, | |
| credentials: "include", | |
| }, | |
| { | |
| response_headers: [ | |
| ["Access-Control-Allow-Origin", POPUP_HTTP_ORIGIN], | |
| ], | |
| base_url: localBaseURL, | |
| credentials: "include", | |
| }, | |
| { | |
| request_headers: [ | |
| ["Cache-Control", "no-cache"] | |
| ], | |
| response_headers: [ | |
| ["Access-Control-Allow-Origin", POPUP_HTTP_ORIGIN], | |
| ], | |
| // If the popup's request was a cache hit, we would only expect 2 | |
| // requests to the server. If it was a cache miss, we would expect 3. | |
| // load_resource_in_iframe does not affect the expectation as, even | |
| // though the iframe (if present) is same-site, we expect a cache miss | |
| // when the popup's top-level frame is a different site. | |
| expected_response_headers: [ | |
| ["server-request-count", is_cross_site_test ? "3" : "2"] | |
| ], | |
| base_url: localBaseURL, | |
| credentials: "include", | |
| } | |
| ] | |
| } | |
| var uuid = token() | |
| var local_requests = expandTemplates(test) | |
| var fetchFns = makeFetchFunctions(local_requests, uuid) | |
| var popup_requests = expandTemplates(test) | |
| // Request the resource with a long cache expiry | |
| function local_fetch() { | |
| return fetchFns[0].code(0) | |
| } | |
| function popup_fetch() { | |
| return new Promise(function(resolve, reject) { | |
| var relativeUrl = load_resource_in_iframe | |
| ? "resources/split-cache-popup-with-iframe.html" | |
| : "resources/split-cache-popup.html"; | |
| var win = window.open(popupBaseURL + relativeUrl); | |
| // Post a message to initiate the popup's request and give the necessary | |
| // information. Posted repeatedly to account for dropped messages as the | |
| // popup is loading. | |
| function postMessage(event) { | |
| var payload = { | |
| index: 1, | |
| requests: popup_requests, | |
| uuid: uuid | |
| } | |
| win.postMessage(payload, POPUP_HTTP_ORIGIN) | |
| } | |
| var messagePoster = setInterval(postMessage, 100) | |
| // Listen for the result | |
| function messageListener(event) { | |
| if (event.origin !== POPUP_HTTP_ORIGIN) { | |
| reject("Unknown error") | |
| } else if (event.data === "success") { | |
| resolve() | |
| } else if (event.data === "error") { | |
| reject("Error in popup") | |
| } else { | |
| return; // Ignore testharness.js internal messages | |
| } | |
| window.removeEventListener("message", messageListener) | |
| clearInterval(messagePoster) | |
| win.close() | |
| } | |
| window.addEventListener("message", messageListener) | |
| }) | |
| } | |
| function local_fetch2() { | |
| return fetchFns[2].code(2) | |
| } | |
| // Final checks. | |
| function check_server_info() { | |
| return getServerState(uuid) | |
| .then(function (testState) { | |
| checkRequests(local_requests, testState) | |
| return Promise.resolve() | |
| }) | |
| } | |
| promise_test(() => { | |
| return local_fetch() | |
| .then(popup_fetch) | |
| .then(local_fetch2) | |
| .then(check_server_info) | |
| }, name) | |
| } | |
| performFullTest( | |
| false /* is_cross_site_test */, false /* load_resource_in_iframe */, | |
| "HTTP cache is shared between same-site top-level frames"); | |
| performFullTest( | |
| true /* is_cross_site_test */, false /* load_resource_in_iframe */, | |
| "HTTP cache is not shared between cross-site top-level frames"); | |
| performFullTest( | |
| false /* is_cross_site_test */, true /* load_resource_in_iframe */, | |
| "HTTP cache is shared between same-site frames with same-site top-level frames"); | |
| performFullTest( | |
| true /* is_cross_site_test */, true /* load_resource_in_iframe */, | |
| "HTTP cache is not shared between same-site frames with cross-site top-level frames"); | |
| </script> | |
| </body> | |
| </html> |