<!DOCTYPE html>
<title>Prefetch request's Sec-Fetch-* request headers</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/utils.js"></script>
<script src="../resources/utils.js"></script>
<script src="resources/utils.sub.js"></script>

<script>
"use strict";

setup(() => assertSpeculationRulesIsSupported());

// https://wicg.github.io/nav-speculation/prefetch.html#create-a-navigation-request

promise_test(async t => {
  const agent = await spawnWindow(t);
  const nextUrl = agent.getExecutorURL({ page: 2 });
  await agent.forceSinglePrefetch(nextUrl);
  await agent.navigate(nextUrl);

  const headers = await agent.getRequestHeaders();
  assert_prefetched(headers, "must be prefetched");
  assert_equals(headers['sec-fetch-dest'], "document", "Sec-Fetch-Dest");
}, 'Sec-Fetch-Dest');

promise_test(async t => {
  const agent = await spawnWindow(t);
  const nextUrl = agent.getExecutorURL({ page: 2 });
  await agent.forceSinglePrefetch(nextUrl);
  await agent.navigate(nextUrl);

  const headers = await agent.getRequestHeaders();
  assert_prefetched(headers, "must be prefetched");
  assert_equals(headers['sec-fetch-mode'], "navigate", "Sec-Fetch-Mode");
}, 'Sec-Fetch-Mode');

promise_test(async t => {
  const agent = await spawnWindow(t);
  const nextUrl = new URL('/common/redirect.py', location.href);
  const finalUrl = agent.getExecutorURL({ page: 2 });
  nextUrl.searchParams.set('location', finalUrl);
  await agent.forceSinglePrefetch(nextUrl);
  await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});

  const headers = await agent.getRequestHeaders();
  assert_prefetched(headers, "must be prefetched");
  assert_equals(headers['sec-fetch-dest'], "document", "Sec-Fetch-Dest");
}, 'Sec-Fetch-Dest with redirects');

promise_test(async t => {
  const agent = await spawnWindow(t);
  const nextUrl = new URL('/common/redirect.py', location.href);
  const finalUrl = agent.getExecutorURL({ page: 2 });
  nextUrl.searchParams.set('location', finalUrl);
  await agent.forceSinglePrefetch(nextUrl);
  await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});

  const headers = await agent.getRequestHeaders();
  assert_prefetched(headers, "must be prefetched");
  assert_equals(headers['sec-fetch-mode'], "navigate", "Sec-Fetch-Mode");
}, 'Sec-Fetch-Mode with redirects');
</script>
