| <!DOCTYPE html> | |
| <meta name="timeout" content="long"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/utils.js"></script> | |
| <script src="/common/dispatcher/dispatcher.js"></script> | |
| <script src="../resources/utils.js"></script> | |
| <script src="resources/utils.sub.js"></script> | |
| <meta name="variant" content="?same-site"> | |
| <meta name="variant" content="?cross-site"> | |
| <script> | |
| setup(() => assertSpeculationRulesIsSupported()); | |
| promise_test(async t => { | |
| const is_same_site = location.search === '?same-site'; | |
| const initiator = await spawnWindow(t); | |
| const url1 = initiator.getExecutorURL({ | |
| hostname: is_same_site ? undefined : '{{hosts[alt][www]}}', | |
| page: 1, | |
| pipe: 'header(Cache-Control,private\\,max-age=604800)' | |
| }); | |
| const url2 = initiator.getExecutorURL({ | |
| hostname: is_same_site ? undefined : '{{hosts[][]}}', | |
| page: 2, | |
| pipe: 'header(Cache-Control,private\\,max-age=604800)' | |
| }); | |
| await initiator.forceSinglePrefetch(url1); | |
| initiator.navigate(url2); | |
| assert_equals(await initiator.getDeliveryType(), ''); | |
| assert_not_prefetched(await initiator.getRequestHeaders(), | |
| 'Content should not have been prefetched.'); | |
| initiator.navigate(url1); | |
| if (is_same_site) { | |
| assert_equals(await initiator.getDeliveryType(), 'cache', | |
| 'Navigation should have retrieved the response from the HTTP Cache.'); | |
| // Note: Even though we didn't use a prefetch, the cached response for | |
| // |url1| was obtained using a prefetch request, and the recorded headers | |
| // at the time of the first request would have Sec-Purpose: 'prefetch'. | |
| assert_prefetched(await initiator.getRequestHeaders(), | |
| 'The cached response should have been from the initial prefetch request.'); | |
| } else { | |
| assert_equals(await initiator.getDeliveryType(), '', | |
| 'Navigation response should not have been from the HTTP Cache.'); | |
| } | |
| await initiator.forceSinglePrefetch(url2); | |
| initiator.navigate(url2); | |
| assert_equals(await initiator.getDeliveryType(), 'navigational-prefetch', | |
| 'Navigation should have used the prefetch'); | |
| if (is_same_site) { | |
| // Note: Even though we did use a prefetch, the recorded request headers in | |
| // the response will not be prefetch headers. This is because the prefetch | |
| // request retrieved its response from the HTTP cache, and the response in | |
| // the cache was initially obtained from the first navigation to |url2|, | |
| // which was not a prefetch. | |
| assert_not_prefetched(await initiator.getRequestHeaders(), | |
| 'The prefetch request should have used a response from the HTTP cache.'); | |
| } else { | |
| assert_prefetched(await initiator.getRequestHeaders(), | |
| 'The prefetch request should have used a fresh response'); | |
| } | |
| }, 'Test that prefetches use/store responses to/from the HTTP cache.'); | |
| </script> |