tor-browser

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

test_claim.html (5418B)


      1 <!--
      2  Any copyright is dedicated to the Public Domain.
      3  http://creativecommons.org/publicdomain/zero/1.0/
      4 -->
      5 <!DOCTYPE HTML>
      6 <html>
      7 <head>
      8  <title>Bug 1130684 - Test service worker clients claim onactivate </title>
      9  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     10  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     11 </head>
     12 <body>
     13 <p id="display"></p>
     14 <div id="content" style="display: none"></div>
     15 <pre id="test"></pre>
     16 <script class="testbody" type="text/javascript">
     17  var registration_1;
     18  var registration_2;
     19  var client;
     20 
     21  function register_1() {
     22    return navigator.serviceWorker.register("claim_worker_1.js",
     23                                            { scope: "./" })
     24      .then((swr) => registration_1 = swr);
     25  }
     26 
     27  function register_2() {
     28    return navigator.serviceWorker.register("claim_worker_2.js",
     29                                            { scope: "./claim_clients/client.html" })
     30      .then((swr) => registration_2 = swr);
     31  }
     32 
     33  function unregister(reg) {
     34    return reg.unregister().then(function(result) {
     35      ok(result, "Unregister should return true.");
     36    });
     37  }
     38 
     39  function createClient() {
     40    var p = new Promise(function(res, rej) {
     41      window.onmessage = function(e) {
     42        if (e.data === "READY") {
     43          res();
     44        }
     45      }
     46    });
     47 
     48    content = document.getElementById("content");
     49    ok(content, "parent exists.");
     50 
     51    client = document.createElement("iframe");
     52    client.setAttribute('src', "claim_clients/client.html");
     53    content.appendChild(client);
     54 
     55    return p;
     56  }
     57 
     58  function testController() {
     59    ok(navigator.serviceWorker.controller.scriptURL.match("claim_worker_1"),
     60        "Controlling service worker has the correct url.");
     61  }
     62 
     63  function testClientWasClaimed(expected) {
     64    var resolveClientMessage, resolveClientControllerChange;
     65    var messageFromClient = new Promise(function(res, rej) {
     66      resolveClientMessage = res;
     67    });
     68    var controllerChangeFromClient = new Promise(function(res, rej) {
     69      resolveClientControllerChange = res;
     70    });
     71    window.onmessage = function(e) {
     72      if (!e.data.event) {
     73        ok(false, "Unknown message received: " + e.data);
     74      }
     75 
     76      if (e.data.event === "controllerchange") {
     77        ok(e.data.controller,
     78           "Client was claimed and received controllerchange event.");
     79        resolveClientControllerChange();
     80      }
     81 
     82      if (e.data.event === "message") {
     83        ok(e.data.data.resolve_value === undefined,
     84            "Claim should resolve with undefined.");
     85        ok(e.data.data.message === expected.message,
     86           "Client received message from claiming worker.");
     87        ok(e.data.data.match_count_before === expected.match_count_before,
     88            "MatchAll clients count before claim should be " + expected.match_count_before);
     89        ok(e.data.data.match_count_after === expected.match_count_after,
     90            "MatchAll clients count after claim should be " + expected.match_count_after);
     91        resolveClientMessage();
     92      }
     93    }
     94 
     95    return Promise.all([messageFromClient, controllerChangeFromClient])
     96      .then(() => window.onmessage = null);
     97  }
     98 
     99  function testClaimFirstWorker() {
    100    // wait for the worker to control us
    101    var controllerChange = new Promise(function(res, rej) {
    102      navigator.serviceWorker.oncontrollerchange = function(e) {
    103        ok(true, "controller changed event received.");
    104        res();
    105      };
    106    });
    107 
    108    var messageFromWorker = new Promise(function(res, rej) {
    109      navigator.serviceWorker.onmessage = function(e) {
    110        ok(e.data.resolve_value === undefined,
    111            "Claim should resolve with undefined.");
    112        ok(e.data.message === "claim_worker_1",
    113            "Received message from claiming worker.");
    114        ok(e.data.match_count_before === 0,
    115            "Worker doesn't control any client before claim.");
    116        ok(e.data.match_count_after === 2, "Worker should claim 2 clients.");
    117        res();
    118      }
    119    });
    120 
    121    var clientClaim = testClientWasClaimed({
    122      message: "claim_worker_1",
    123      match_count_before: 0,
    124      match_count_after: 2
    125    });
    126 
    127    return Promise.all([controllerChange, messageFromWorker, clientClaim])
    128      .then(testController);
    129  }
    130 
    131  function testClaimSecondWorker() {
    132    navigator.serviceWorker.oncontrollerchange = function(e) {
    133      ok(false, "Claim_worker_2 shouldn't claim this window.");
    134    }
    135 
    136    navigator.serviceWorker.onmessage = function(e) {
    137      ok(false, "Claim_worker_2 shouldn't claim this window.");
    138    }
    139 
    140    var clientClaim = testClientWasClaimed({
    141      message: "claim_worker_2",
    142      match_count_before: 0,
    143      match_count_after: 1
    144    });
    145 
    146    return clientClaim.then(testController);
    147  }
    148 
    149  function runTest() {
    150    createClient()
    151      .then(register_1)
    152      .then(testClaimFirstWorker)
    153      .then(register_2)
    154      .then(testClaimSecondWorker)
    155      .then(function() { return unregister(registration_1); })
    156      .then(function() { return unregister(registration_2); })
    157      .catch(function(e) {
    158        ok(false, "Some test failed with error " + e);
    159      }).then(SimpleTest.finish);
    160  }
    161 
    162  SimpleTest.waitForExplicitFinish();
    163  SpecialPowers.pushPrefEnv({"set": [
    164    ["dom.serviceWorkers.exemptFromPerDomainMax", true],
    165    ["dom.serviceWorkers.enabled", true],
    166    ["dom.serviceWorkers.testing.enabled", true]
    167  ]}, runTest);
    168 </script>
    169 </pre>
    170 </body>
    171 </html>