tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });