154 lines
7.1 KiB
HTML
154 lines
7.1 KiB
HTML
<!DOCTYPE html>
|
|
<meta name="timeout" content="long">
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/resources/testdriver.js"></script>
|
|
<script src='/resources/testdriver-vendor.js'></script>
|
|
<script src="/common/dispatcher/dispatcher.js"></script>
|
|
<script src="/common/subset-tests-by-key.js"></script>
|
|
<script src="/common/utils.js"></script>
|
|
<script src="../resources/utils.js"></script>
|
|
<script src="resources/utils.sub.js"></script>
|
|
<meta name="variant" content="?include=unchanged">
|
|
<meta name="variant" content="?include=changed">
|
|
<meta name="variant" content="?include=unchangedWithRedirect">
|
|
<meta name="variant" content="?include=changedWithRedirect">
|
|
<meta name="variant" content="?include=changedWithRedirect2">
|
|
<meta name="variant" content="?include=changedWithRedirect3">
|
|
<script>
|
|
setup(() => assertSpeculationRulesIsSupported());
|
|
|
|
subsetTestByKey("unchanged", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
let nextUrl = agent.getExecutorURL({ executor: "cookies.py", cookieindices: "1" });
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
await agent.navigate(nextUrl);
|
|
|
|
assert_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "hello");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "hello");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "Cookie-Indices should not prevent a prefetch from succeeding if the cookie has not changed.");
|
|
|
|
subsetTestByKey("changed", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
let nextUrl = agent.getExecutorURL({ executor: "cookies.py", cookieindices: "1" });
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
document.cookie = 'vary1=two';
|
|
await agent.navigate(nextUrl);
|
|
|
|
assert_not_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "two");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "two");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "Cookie-Indices should prevent a prefetch from being used if the cookie has changed.");
|
|
|
|
subsetTestByKey("unchangedWithRedirect", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
let finalUrl = agent.getExecutorURL({ executor: "cookies.py", cookieindices: "1" });
|
|
let nextUrl = new URL("/common/redirect.py?location=" + encodeURIComponent(finalUrl), document.baseURI);
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
|
|
|
|
assert_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "hello");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "hello");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "Cookie-Indices should not prevent a prefetch from succeeding with unchanged cookies, even with redirect");
|
|
|
|
subsetTestByKey("changedWithRedirect", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
let finalUrl = agent.getExecutorURL({ executor: "cookies.py", cookieindices: "1" });
|
|
let nextUrl = new URL("/common/redirect.py?location=" + encodeURIComponent(finalUrl), document.baseURI);
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
document.cookie = 'vary1=two';
|
|
await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
|
|
|
|
assert_not_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "two");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "two");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "Cookie-Indices should prevent a prefetch from succeeding if the cookie changed, with a redirect");
|
|
|
|
subsetTestByKey("changedWithRedirect2", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
// One subtlety here: the wptserve pipe parser doesn't allow commas inside
|
|
// the header value (since that delimits the pipe arguments).
|
|
// There is currently no way around this, so we simply don't use a value with a comma.
|
|
let finalUrl = agent.getExecutorURL({ executor: "cookies.py" });
|
|
let pipe = "header(Cache-Control,no-store)|header(Vary,Cookie)|header(Cookie-Indices,\"vary1\")";
|
|
let nextUrl = new URL(`/common/redirect.py?location=${encodeURIComponent(finalUrl)}&pipe=${encodeURIComponent(pipe)}`, document.baseURI);
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
document.cookie = 'vary1=two';
|
|
await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
|
|
|
|
assert_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "hello");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "two");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "If the redirect needs to be rerequested but goes to the same place and that one doesn't vary, we actually can use the prefetched final response.");
|
|
|
|
subsetTestByKey("changedWithRedirect3", promise_test, async t => {
|
|
await test_driver.delete_all_cookies();
|
|
|
|
document.cookie = 'vary1=hello';
|
|
|
|
let agent = await spawnWindow(t);
|
|
|
|
// One subtlety here: the wptserve pipe parser doesn't allow commas inside
|
|
// the header value (since that delimits the pipe arguments).
|
|
// There is currently no way around this, so we simply don't use a value with a comma.
|
|
let finalUrl = agent.getExecutorURL({ executor: "cookies.py" });
|
|
let pipe = "header(Cache-Control,no-store)|header(Vary,Cookie)|header(Cookie-Indices,\"vary1\")";
|
|
let nextUrl = new URL(`resources/random_redirect.py?location=${encodeURIComponent(finalUrl)}&pipe=${encodeURIComponent(pipe)}`, document.baseURI);
|
|
await agent.forceSinglePrefetch(nextUrl);
|
|
document.cookie = 'vary1=two';
|
|
await agent.navigate(nextUrl, {expectedDestinationUrl: null});
|
|
|
|
assert_not_prefetched(await agent.getRequestHeaders());
|
|
let request_cookies = await agent.getRequestCookies();
|
|
let response_cookies = await agent.getResponseCookies();
|
|
assert_equals(request_cookies.vary1, "two");
|
|
assert_equals(request_cookies.vary2, undefined);
|
|
assert_equals(response_cookies.vary1, "two");
|
|
assert_equals(response_cookies.vary2, undefined);
|
|
}, "If the redirect needs to be rerequested and goes elsewhere, we cannot can use the prefetched final response.");
|
|
</script>
|