tor-browser

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

fetch_test_framework.js (5026B)


      1 function testScript(script) {
      2  var mode = location.href.includes("http2") ? "?mode=http2&" : "?";
      3  function makeWrapperUrl(wrapper) {
      4    return wrapper + mode + "script=" + script;
      5  }
      6  let workerWrapperUrl = makeWrapperUrl("worker_wrapper.js");
      7 
      8  // The framework runs the entire test in many different configurations.
      9  // On slow platforms and builds this can make the tests likely to
     10  // timeout while they are still running.  Lengthen the timeout to
     11  // accomodate this.
     12  SimpleTest.requestLongerTimeout(4);
     13 
     14  // reroute.html should have set this variable if a service worker is present!
     15  if (!("isSWPresent" in window)) {
     16    window.isSWPresent = false;
     17  }
     18 
     19  function setupPrefs() {
     20    return new Promise(function (resolve, reject) {
     21      SpecialPowers.pushPrefEnv(
     22        {
     23          set: [
     24            ["dom.serviceWorkers.enabled", true],
     25            ["dom.serviceWorkers.testing.enabled", true],
     26            ["dom.serviceWorkers.idle_timeout", 60000],
     27            ["dom.serviceWorkers.exemptFromPerDomainMax", true],
     28          ],
     29        },
     30        resolve
     31      );
     32    });
     33  }
     34 
     35  function workerTest() {
     36    return new Promise(function (resolve, reject) {
     37      var worker = new Worker(workerWrapperUrl);
     38      worker.onmessage = function (event) {
     39        if (event.data.context != "Worker") {
     40          return;
     41        }
     42        if (event.data.type == "finish") {
     43          resolve();
     44        } else if (event.data.type == "status") {
     45          ok(event.data.status, event.data.context + ": " + event.data.msg);
     46        }
     47      };
     48      worker.onerror = function (event) {
     49        reject("Worker error: " + event.message);
     50      };
     51 
     52      worker.postMessage({ script });
     53    });
     54  }
     55 
     56  function nestedWorkerTest() {
     57    return new Promise(function (resolve, reject) {
     58      var worker = new Worker(makeWrapperUrl("nested_worker_wrapper.js"));
     59      worker.onmessage = function (event) {
     60        if (event.data.context != "NestedWorker") {
     61          return;
     62        }
     63        if (event.data.type == "finish") {
     64          resolve();
     65        } else if (event.data.type == "status") {
     66          ok(event.data.status, event.data.context + ": " + event.data.msg);
     67        }
     68      };
     69      worker.onerror = function (event) {
     70        reject("Nested Worker error: " + event.message);
     71      };
     72 
     73      worker.postMessage({ script });
     74    });
     75  }
     76 
     77  function serviceWorkerTest() {
     78    var isB2G =
     79      !navigator.userAgent.includes("Android") &&
     80      /Mobile|Tablet/.test(navigator.userAgent);
     81    if (isB2G) {
     82      // TODO B2G doesn't support running service workers for now due to bug 1137683.
     83      dump("Skipping running the test in SW until bug 1137683 gets fixed.\n");
     84      return Promise.resolve();
     85    }
     86    return new Promise(function (resolve, reject) {
     87      function setupSW(registration) {
     88        var worker =
     89          registration.installing ||
     90          registration.waiting ||
     91          registration.active;
     92        var iframe;
     93 
     94        window.addEventListener("message", function onMessage(event) {
     95          if (event.data.context != "ServiceWorker") {
     96            return;
     97          }
     98          if (event.data.type == "finish") {
     99            window.removeEventListener("message", onMessage);
    100            iframe.remove();
    101            registration.unregister().then(resolve).catch(reject);
    102          } else if (event.data.type == "status") {
    103            ok(event.data.status, event.data.context + ": " + event.data.msg);
    104          }
    105        });
    106 
    107        worker.onerror = reject;
    108 
    109        iframe = document.createElement("iframe");
    110        iframe.src = "message_receiver.html";
    111        iframe.onload = function () {
    112          worker.postMessage({ script });
    113        };
    114        document.body.appendChild(iframe);
    115      }
    116 
    117      navigator.serviceWorker
    118        .register(workerWrapperUrl, { scope: "." })
    119        .then(setupSW);
    120    });
    121  }
    122 
    123  function windowTest() {
    124    return new Promise(function (resolve, reject) {
    125      var scriptEl = document.createElement("script");
    126      scriptEl.setAttribute("src", script);
    127      scriptEl.onload = function () {
    128        runTest().then(resolve, reject);
    129      };
    130      document.body.appendChild(scriptEl);
    131    });
    132  }
    133 
    134  SimpleTest.waitForExplicitFinish();
    135  // We have to run the window, worker and service worker tests sequentially
    136  // since some tests set and compare cookies and running in parallel can lead
    137  // to conflicting values.
    138  setupPrefs()
    139    .then(function () {
    140      return windowTest();
    141    })
    142    .then(function () {
    143      return workerTest();
    144    })
    145    .then(function () {
    146      return nestedWorkerTest();
    147    })
    148    .then(function () {
    149      return serviceWorkerTest();
    150    })
    151    .catch(function (e) {
    152      ok(false, "Some test failed in " + script);
    153      info(e);
    154      info(e.message);
    155      return Promise.resolve();
    156    })
    157    .then(function () {
    158      try {
    159        if (parent && parent.finishTest) {
    160          parent.finishTest();
    161          return;
    162        }
    163      } catch {}
    164      SimpleTest.finish();
    165    });
    166 }