browser_referrer_telemetry.js (3325B)
1 /** 2 * Bug 1720869 - Testing the referrer policy telemetry. 3 */ 4 5 "use strict"; 6 7 const TEST_DOMAIN = "https://example.com/"; 8 const TEST_CROSS_SITE_DOMAIN = "https://test1.example.org/"; 9 10 const TEST_PATH = "browser/dom/security/test/referrer-policy/"; 11 12 const TEST_PAGE = `${TEST_DOMAIN}${TEST_PATH}referrer_page.sjs`; 13 const TEST_CROSS_SITE_PAGE = `${TEST_CROSS_SITE_DOMAIN}${TEST_PATH}referrer_page.sjs`; 14 15 // This matches to the order in ReferrerPolicy.webidl 16 const REFERRER_POLICY_INDEX = { 17 empty: 0, 18 "no-referrer": 1, 19 "no-referrer-when-downgrade": 2, 20 origin: 3, 21 "origin-when-cross-origin": 4, 22 "unsafe-url": 5, 23 "same-origin": 6, 24 "strict-origin": 7, 25 "strict-origin-when-cross-origin": 8, 26 }; 27 28 const TEST_CASES = [ 29 { 30 policy: "", 31 expected: REFERRER_POLICY_INDEX.empty, 32 }, 33 { 34 policy: "no-referrer", 35 expected: REFERRER_POLICY_INDEX["no-referrer"], 36 }, 37 { 38 policy: "no-referrer-when-downgrade", 39 expected: REFERRER_POLICY_INDEX["no-referrer-when-downgrade"], 40 }, 41 { 42 policy: "origin", 43 expected: REFERRER_POLICY_INDEX.origin, 44 }, 45 { 46 policy: "origin-when-cross-origin", 47 expected: REFERRER_POLICY_INDEX["origin-when-cross-origin"], 48 }, 49 { 50 policy: "same-origin", 51 expected: REFERRER_POLICY_INDEX["same-origin"], 52 }, 53 { 54 policy: "strict-origin", 55 expected: REFERRER_POLICY_INDEX["strict-origin"], 56 }, 57 { 58 policy: "strict-origin-when-cross-origin", 59 expected: REFERRER_POLICY_INDEX["strict-origin-when-cross-origin"], 60 }, 61 { 62 policy: "unsafe-url", 63 expected: REFERRER_POLICY_INDEX["unsafe-url"], 64 }, 65 ]; 66 67 function clearTelemetry() { 68 Services.telemetry.getSnapshotForHistograms("main", true /* clear */); 69 Services.telemetry.getHistogramById("REFERRER_POLICY_COUNT").clear(); 70 } 71 72 add_setup(async function () { 73 // Clear Telemetry probes before testing. 74 clearTelemetry(); 75 }); 76 77 function verifyTelemetry(expected, isSameSite) { 78 // The record of cross-site loads is placed in the second half of the 79 // telemetry. 80 const offset = isSameSite ? 0 : Object.keys(REFERRER_POLICY_INDEX).length; 81 82 let histograms = Services.telemetry.getSnapshotForHistograms( 83 "main", 84 false /* clear */ 85 ).parent; 86 87 let referrerPolicyCountProbe = histograms.REFERRER_POLICY_COUNT; 88 89 ok(referrerPolicyCountProbe, "The telemetry probe has been recorded."); 90 is( 91 referrerPolicyCountProbe.values[expected + offset], 92 1, 93 "The telemetry is added correctly." 94 ); 95 } 96 97 add_task(async function run_tests() { 98 for (let test of TEST_CASES) { 99 for (let sameSite of [true, false]) { 100 clearTelemetry(); 101 let referrerURL = `${TEST_PAGE}?header=${test.policy}`; 102 103 await BrowserTestUtils.withNewTab(referrerURL, async browser => { 104 let iframeURL = sameSite 105 ? TEST_PAGE + "?show" 106 : TEST_CROSS_SITE_PAGE + "?show"; 107 108 // Create an iframe and load the url. 109 await SpecialPowers.spawn(browser, [iframeURL], async url => { 110 let iframe = content.document.createElement("iframe"); 111 iframe.src = url; 112 113 await new content.Promise(resolve => { 114 iframe.onload = () => { 115 resolve(); 116 }; 117 118 content.document.body.appendChild(iframe); 119 }); 120 }); 121 122 verifyTelemetry(test.expected, sameSite); 123 }); 124 } 125 } 126 });