tor-browser

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

test_async_waituntil.html (2895B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <!--
      4  Test that:
      5  1. waitUntil() waits for each individual promise separately, even if
      6     one of them was rejected.
      7  2. waitUntil() can be called asynchronously as long as there is still
      8     a pending extension promise.
      9  -->
     10 <head>
     11  <title>Test for Bug 1263304</title>
     12  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     13  <script src="error_reporting_helpers.js"></script>
     14  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     15  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
     16 </head>
     17 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1263304">Mozilla Bug 1263304</a>
     18 <p id="display"></p>
     19 <div id="content" style="display: none">
     20 
     21 </div>
     22 <pre id="test">
     23 </pre>
     24 
     25 <script src="utils.js"></script>
     26 <script class="testbody" type="text/javascript">
     27 add_task(function setupPrefs() {
     28  return SpecialPowers.pushPrefEnv({"set": [
     29    ["dom.serviceWorkers.enabled", true],
     30    ["dom.serviceWorkers.testing.enabled", true],
     31  ]});
     32 });
     33 
     34 function wait_for_message(expected_message) {
     35  return new Promise(function(resolve, reject) {
     36    navigator.serviceWorker.onmessage = function(event) {
     37      navigator.serviceWorker.onmessage = null;
     38      ok(event.data === expected_message, "Received expected message event: " + event.data);
     39      resolve();
     40    }
     41  });
     42 }
     43 
     44 add_task(async function async_wait_until() {
     45  var worker;
     46  let registration = await navigator.serviceWorker.register(
     47    "async_waituntil_worker.js", { scope: "./"} )
     48    .then(function(reg) {
     49      worker = reg.installing;
     50      return waitForState(worker, 'activated', reg);
     51    });
     52 
     53  // The service worker will claim us when it becomes active.
     54  ok(navigator.serviceWorker.controller, "Controlled");
     55 
     56  // This will make the service worker die immediately if there are no pending
     57  // waitUntil promises to keep it alive.
     58  await SpecialPowers.pushPrefEnv({"set": [
     59    ["dom.serviceWorkers.idle_timeout", 0],
     60    ["dom.serviceWorkers.idle_extended_timeout", 299999]]});
     61 
     62  // The service worker will wait on two promises, one of which
     63  // will be rejected. We check whether the SW is killed using
     64  // the value of a global variable.
     65  let waitForStart = wait_for_message("Started");
     66  worker.postMessage("Start");
     67  await waitForStart;
     68 
     69  await new Promise((res, rej) => {
     70    setTimeout(res, 0);
     71  });
     72 
     73  let waitResult = wait_for_message("Success");
     74  worker.postMessage("Result");
     75  await waitResult;
     76 
     77  // Test the behaviour of calling waitUntil asynchronously. The important
     78  // part is that we receive the message event.
     79  let waitForMessage = wait_for_message("Done");
     80  await fetch("doesnt_exist.html").then(() => {
     81    ok(true, "Fetch was successful.");
     82  });
     83  await waitForMessage;
     84 
     85  await SpecialPowers.popPrefEnv();
     86  await SpecialPowers.popPrefEnv();
     87  await registration.unregister();
     88 });
     89 </script>
     90 </body>
     91 </html>