<!DOCTYPE html>
<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>
  setup(() => assertSpeculationRulesIsSupported());

  // Test that Clear-Site-Data header value "prefetchCache" clears prefetch cache
  promise_test(async t => {
    let agent = await spawnWindow(t, { protocol: 'https' });
    let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
    await agent.forceSinglePrefetch(nextUrl);

    // Open new window with url to clear cache data through Clear-Site-Data header.
    // Ensure that the cache is cleared before the navigation.
    const gotMessage = new Promise(resolve => {
      window.addEventListener('message', e => {
        resolve(e.data);
      }, {
        once: true
      });
    });
    window.open("/../../clear-site-data/support/clear-site-data-prefetchCache.py");
    await gotMessage;

    await agent.navigate(nextUrl);
    // Because Clear-Site-Data response header is sent, prefetches are expected
    // to be evicted.
    // The navigation to nextURL is not expected to use the prefetch cache.
    assert_not_prefetched(await agent.getRequestHeaders());
  }, "clear-site-data prefetchCache headers should prevent it from being fetched");

    // Test that Clear-Site-Data header value "cache" clears prefetch cache
  promise_test(async t => {
    let agent = await spawnWindow(t, { protocol: 'https' });
    let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
    await agent.forceSinglePrefetch(nextUrl);

    // Open new window with url to clear cache data through Clear-Site-Data header.
    // Ensure that the cache is cleared before the navigation.
    const gotMessage = new Promise(resolve => {
      window.addEventListener('message', e => {
        resolve(e.data);
      }, {
        once: true
      });
    });
    let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
    window.open("/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
    await gotMessage;

    await agent.navigate(nextUrl);
    // Because Clear-Site-Data response header is sent, prefetches are expected
    // to be evicted.
    // The navigation to nextURL is not expected to use the prefetch cache.
    assert_not_prefetched(await agent.getRequestHeaders());
  }, "clear-site-data cache headers should prevent it from being fetched");
</script>
