referrer-policy-from-rules.https.html (6584B)
1 <!DOCTYPE html> 2 <title>Prefetch with the referrer policy specified in speculation rules</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="/common/dispatcher/dispatcher.js"></script> 6 <script src="/common/subset-tests.js"></script> 7 <script src="/common/utils.js"></script> 8 <script src="/common/get-host-info.sub.js"></script> 9 <script src="../resources/utils.js"></script> 10 <script src="resources/utils.sub.js"></script> 11 12 <!--Split test cases due to the use of timeouts in speculation rules test utilities.--> 13 <meta name="variant" content="?1-1"> 14 <meta name="variant" content="?2-2"> 15 <meta name="variant" content="?3-3"> 16 <meta name="variant" content="?4-4"> 17 <meta name="variant" content="?5-5"> 18 <meta name="variant" content="?6-6"> 19 <meta name="variant" content="?7-7"> 20 <meta name="variant" content="?8-last"> 21 22 <script> 23 "use strict"; 24 25 setup(() => assertSpeculationRulesIsSupported()); 26 27 subsetTest(promise_test, async t => { 28 const agent = await spawnWindow(t); 29 await agent.setReferrerPolicy("strict-origin-when-cross-origin"); 30 const expectedReferrer = agent.getExecutorURL().origin + "/"; 31 32 const nextURL = agent.getExecutorURL({ page: 2 }); 33 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "strict-origin" }); 34 await agent.navigate(nextURL); 35 36 const headers = await agent.getRequestHeaders(); 37 assert_prefetched(headers, "must be prefetched"); 38 assert_equals(headers.referer, expectedReferrer, "must send the origin as the referrer"); 39 }, 'with "strict-origin" referrer policy in rule set overriding "strict-origin-when-cross-origin" of referring page'); 40 41 subsetTest(promise_test, async t => { 42 const agent = await spawnWindow(t); 43 const next_url = agent.getExecutorURL({ page: 2 }); 44 await agent.execute_script((url) => { 45 const a = addLink(url); 46 a.referrerPolicy = 'no-referrer'; 47 insertDocumentRule(undefined, { referrer_policy: 'strict-origin' }); 48 }, [next_url]); 49 await new Promise(resolve => t.step_timeout(resolve, 2000)); 50 await agent.navigate(next_url); 51 52 const headers = await agent.getRequestHeaders(); 53 assert_prefetched(headers, 'must be prefetched'); 54 const expected_referrer = next_url.origin + '/'; 55 assert_equals(headers.referer, expected_referrer, 'must send the origin as the referrer'); 56 }, 'with "strict-origin" referrer policy in rule set override "no-referrer" of link'); 57 58 subsetTest(promise_test, async t => { 59 const agent = await spawnWindow(t); 60 await agent.setReferrerPolicy("unsafe-url"); 61 62 const nextURL = agent.getExecutorURL({ hostname: get_host_info().NOTSAMESITE_HOST, page: 2 }); 63 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "no-referrer" }); 64 await agent.navigate(nextURL); 65 66 // This referring page's referrer policy would not be eligible for 67 // cross-site prefetching, but setting a sufficiently strict policy in the 68 // rule allows for prefetching. 69 const headers = await agent.getRequestHeaders(); 70 assert_prefetched(headers, "must be prefetched"); 71 assert_equals(headers.referer, undefined, "must send no referrer"); 72 }, 'with "no-referrer" referrer policy in rule set overriding "unsafe-url" of cross-site referring page'); 73 74 subsetTest(promise_test, async t => { 75 const agent = await spawnWindow(t); 76 await agent.setReferrerPolicy("strict-origin-when-cross-origin"); 77 78 const nextURL = agent.getExecutorURL({ page: 2 }); 79 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "no-referrrrrrrer" }); 80 await agent.navigate(nextURL); 81 82 const headers = await agent.getRequestHeaders(); 83 assert_not_prefetched(headers, "must not be prefetched"); 84 }, 'unrecognized policies invalidate the rule'); 85 86 subsetTest(promise_test, async t => { 87 const agent = await spawnWindow(t); 88 await agent.setReferrerPolicy("strict-origin"); 89 const expectedReferrer = agent.getExecutorURL().origin + "/"; 90 91 const nextURL = agent.getExecutorURL({ page: 2 }); 92 await agent.execute_script((url) => { 93 const a = addLink(url); 94 a.referrerPolicy = 'no-referrrrrrrer'; 95 insertDocumentRule(); 96 }, [nextURL]); 97 await new Promise(resolve => t.step_timeout(resolve, 2000)); 98 await agent.navigate(nextURL); 99 100 const headers = await agent.getRequestHeaders(); 101 assert_prefetched(headers, "must be prefetched"); 102 assert_equals(headers.referer, expectedReferrer, "must send the origin as the referrer"); 103 }, 'unrecognized policies in link referrerpolicy attribute are ignored'); 104 105 subsetTest(promise_test, async t => { 106 const agent = await spawnWindow(t); 107 await agent.setReferrerPolicy("strict-origin-when-cross-origin"); 108 109 const nextURL = agent.getExecutorURL({ page: 2 }); 110 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "never" }); 111 await agent.navigate(nextURL); 112 113 const headers = await agent.getRequestHeaders(); 114 assert_not_prefetched(headers, "must not be prefetched"); 115 }, 'treat legacy referrer policy values as invalid'); 116 117 subsetTest(promise_test, async t => { 118 const agent = await spawnWindow(t); 119 await agent.setReferrerPolicy("strict-origin"); 120 const expectedReferrer = agent.getExecutorURL().origin + "/"; 121 122 const nextURL = agent.getExecutorURL({ hostname: get_host_info().NOTSAMESITE_HOST, page: 2 }); 123 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "unsafe-url" }); 124 await agent.navigate(nextURL); 125 126 // This referring page's referrer policy would normally make it eligible for 127 // cross-site prefetching, but setting an unacceptable policy in the rule 128 // makes it ineligible. 129 const headers = await agent.getRequestHeaders(); 130 assert_not_prefetched(headers, "must not be prefetched"); 131 assert_equals(headers.referer, expectedReferrer, "must send the origin as the referrer"); 132 }, 'with "unsafe-url" referrer policy in rule set overriding "strict-origin" of cross-site referring page'); 133 134 subsetTest(promise_test, async t => { 135 const agent = await spawnWindow(t); 136 await agent.setReferrerPolicy("strict-origin"); 137 const expectedReferrer = agent.getExecutorURL().origin + "/"; 138 139 const nextURL = agent.getExecutorURL({ page: 2 }); 140 // The empty string is a valid value for "referrer_policy" and will be 141 // treated as if the key were omitted. 142 await agent.forceSinglePrefetch(nextURL, { referrer_policy: "" }); 143 await agent.navigate(nextURL); 144 145 const headers = await agent.getRequestHeaders(); 146 assert_prefetched(headers, "must be prefetched"); 147 assert_equals(headers.referer, expectedReferrer, "must send the origin as the referrer"); 148 }, 'with empty string referrer policy in rule set defaulting to "strict-origin" of referring page'); 149 </script>