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