tor-browser

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

test_fetch.html (5019B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Service worker performance test: fetch</title>
      5 </head>
      6 <script src="/tests/SimpleTest/SimpleTest.js"></script>
      7 <script src="../utils.js"></script>
      8 <script src="perfutils.js"></script>
      9 <script>
     10 
     11  "use strict";
     12 
     13  const COLD_FETCH = "Cold fetch";
     14  const UNDISTURBED_FETCH = "Undisturbed fetch";
     15  const INTERCEPTED_FETCH = "Intercepted fetch";
     16  const LIBERATED_FETCH = "Liberated fetch";
     17  const UNDISTURBED_XHR = "Undisturbed XHR";
     18  const INTERCEPTED_XHR = "Intercepted XHR";
     19  const LIBERATED_XHR = "Liberated XHR";
     20 
     21  var journal = {};
     22  journal[COLD_FETCH] = [];
     23  journal[UNDISTURBED_FETCH] = [];
     24  journal[INTERCEPTED_FETCH] = [];
     25  journal[LIBERATED_FETCH] = [];
     26  journal[UNDISTURBED_XHR] = [];
     27  journal[INTERCEPTED_XHR] = [];
     28  journal[LIBERATED_XHR] = [];
     29 
     30  const ITERATIONS = 10;
     31 
     32  var perfMetadata = {
     33    owner: "DOM LWS",
     34    name: "Service Worker Fetch",
     35    description: "Test cold and warm fetches.",
     36    options: {
     37      default: {
     38        perfherder: true,
     39        perfherder_metrics: [
     40          // Here, we can't use the constants defined above because perfherder
     41          // grabs data from the parse tree.
     42          { name: "Cold fetch", unit: "ms", shouldAlert: true },
     43          { name: "Undisturbed fetch", unit: "ms", shouldAlert: true },
     44          { name: "Intercepted fetch", unit: "ms", shouldAlert: true },
     45          { name: "Liberated fetch", unit: "ms", shouldAlert: true },
     46          { name: "Undisturbed XHR", unit: "ms", shouldAlert: true },
     47          { name: "Intercepted XHR", unit: "ms", shouldAlert: true },
     48          { name: "Liberated XHR", unit: "ms", shouldAlert: true },
     49        ],
     50        verbose: true,
     51        manifest: "perftest.toml",
     52        manifest_flavor: "plain",
     53      },
     54    },
     55  };
     56 
     57  function create_iframe(url) {
     58    return new Promise(function(res) {
     59      let iframe = document.createElement("iframe");
     60      iframe.src = url;
     61      iframe.onload = function() { res(iframe) }
     62      document.body.appendChild(iframe);
     63    });
     64  }
     65 
     66  add_task(async () => {
     67    await SpecialPowers.pushPrefEnv({
     68      set: [["dom.serviceWorkers.testing.enabled", true]]
     69    });
     70  });
     71 
     72  /**
     73   * Time fetch from a fresh service worker.
     74   */
     75  add_task(async () => {
     76    for (let i = 0; i < ITERATIONS; i++) {
     77      let reg = await navigator.serviceWorker.register("sw_intercept_target.js");
     78      await waitForState(reg.installing, "activated");
     79 
     80      let iframe = await create_iframe("time_fetch.html");
     81 
     82      let result = await iframe.contentWindow.time_fetch("target.txt");
     83      is(result.status, 200);
     84      is(result.data, "intercepted\n");
     85      journal[COLD_FETCH].push(result.elapsed_ms);
     86 
     87      ok(document.body.removeChild(iframe), "Failed to remove child iframe");
     88 
     89      await reg.unregister();
     90    }
     91  });
     92 
     93  /**
     94   * Time unintercepted fetch, intercepted fetch, then unintercepted
     95   * fetch again.
     96   */
     97  add_task(async () => {
     98    let reg = await navigator.serviceWorker.register("sw_intercept_target.js");
     99    await waitForState(reg.installing, "activated");
    100 
    101    async function measure(journal, sw_enabled) {
    102      await SpecialPowers.pushPrefEnv({
    103        set: [["dom.serviceWorkers.enabled", sw_enabled]]
    104      });
    105 
    106      let iframe = await create_iframe("time_fetch.html");
    107 
    108      for (let i = 0; i < ITERATIONS; i++) {
    109        let result = await iframe.contentWindow.time_fetch("target.txt");
    110        is(result.status, 200);
    111        is(result.data, sw_enabled ? "intercepted\n" : "target\n");
    112        journal.push(result.elapsed_ms);
    113      }
    114 
    115      ok(document.body.removeChild(iframe), "Failed to remove child iframe");
    116 
    117      await SpecialPowers.popPrefEnv();
    118    }
    119 
    120    await measure(journal[UNDISTURBED_FETCH], false);
    121    await measure(journal[INTERCEPTED_FETCH], true);
    122    await measure(journal[LIBERATED_FETCH], false);
    123 
    124    await reg.unregister();
    125  });
    126 
    127  /**
    128   * Time unintercepted XHR, intercepted XHR, then unintercepted
    129   * XHR again.
    130   */
    131  add_task(async () => {
    132    let reg = await navigator.serviceWorker.register("sw_intercept_target.js");
    133    await waitForState(reg.installing, "activated");
    134 
    135    async function measure(journal, sw_enabled) {
    136      await SpecialPowers.pushPrefEnv({
    137        set: [["dom.serviceWorkers.enabled", sw_enabled]]
    138      });
    139 
    140      let iframe = await create_iframe("time_fetch.html");
    141 
    142      for (let i = 0; i < ITERATIONS; i++) {
    143        let result = await iframe.contentWindow.time_xhr("target.txt");
    144        is(result.status, 200);
    145        is(result.data, sw_enabled ? "intercepted\n" : "target\n");
    146        journal.push(result.elapsed_ms);
    147      }
    148 
    149      ok(document.body.removeChild(iframe), "Failed to remove child iframe");
    150 
    151      await SpecialPowers.popPrefEnv();
    152    }
    153 
    154    await measure(journal[UNDISTURBED_XHR], false);
    155    await measure(journal[INTERCEPTED_XHR], true);
    156    await measure(journal[LIBERATED_XHR], false);
    157 
    158    await reg.unregister();
    159  });
    160 
    161  add_task(() => {
    162    reportMetrics(journal);
    163  });
    164 
    165 </script>
    166 <body>
    167 </body>
    168 </html>