<!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>
