tor-browser

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

test_postMessages_broadcastChannel.html (3719B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Test for postMessages cloning/transferring objects</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      7  <script src="common_postMessages.js"></script>
      8 </head>
      9 
     10 <body>
     11 <input id="fileList" type="file"></input>
     12 <script type="application/javascript">
     13 
     14 // PostMessage for BroadcastChannel
     15 tests.push(function test_broadcastChannel() {
     16  info("Testing broadcastChannel");
     17 
     18  var bc1 = new BroadcastChannel('postMessagesTest');
     19  var bc2 = new BroadcastChannel('postMessagesTest');
     20 
     21  var resolve;
     22 
     23  function resolvePromise(data) {
     24    if (!resolve) {
     25      ok(false, "Unexpected message!");
     26      return;
     27    }
     28 
     29    let tmp = resolve;
     30    resolve = null;
     31    tmp(data);
     32  }
     33 
     34  bc2.onmessage = function(e) {
     35    resolvePromise({ data: e.data, ports: [], error: false });
     36  }
     37 
     38  bc2.onmessageerror = function(e) {
     39    resolvePromise({ error: true });
     40  }
     41 
     42  runTests({
     43    clonableObjectsEveryWhere: true,
     44    clonableObjectsSameProcess: true,
     45    transferableObjects: false,
     46    send(what, ports) {
     47      return new Promise(function(r, rr) {
     48        if (ports.length) {
     49          rr();
     50          return;
     51        }
     52 
     53        resolve = r;
     54        bc1.postMessage(what);
     55      });
     56    },
     57 
     58    finished() {
     59      bc1.close();
     60      bc2.close();
     61      next();
     62    }
     63  });
     64 });
     65 
     66 // PostMessage for BroadcastChannel in workers
     67 tests.push(function test_broadcastChannel_inWorkers() {
     68  info("Testing broadcastChannel in Workers");
     69 
     70  var bc = new BroadcastChannel('postMessagesTest_inWorkers');
     71  var resolve;
     72 
     73  var w = new Worker('worker_postMessages.js');
     74  w.postMessage('broadcastChannel');
     75  w.onmessage = function(e) {
     76    is(e.data, 'ok', "Worker ready!");
     77 
     78    w.onmessage = function(e1) {
     79      if (!resolve) {
     80        ok(false, "Unexpected message!");
     81        return;
     82      }
     83 
     84      let tmp = resolve;
     85      resolve = null;
     86      tmp({ data: e1.data, ports: e1.ports, error: e1.data === "error" });
     87    }
     88 
     89    runTests({
     90      clonableObjectsEveryWhere: true,
     91      clonableObjectsSameProcess: true,
     92      transferableObjects: false,
     93      send(what, ports) {
     94        return new Promise(function(r, rr) {
     95          if (ports.length) {
     96            rr();
     97            return;
     98          }
     99 
    100          resolve = r;
    101          bc.postMessage(what);
    102        });
    103      },
    104 
    105      finished() {
    106        bc.close();
    107        w.terminate();
    108        next();
    109      }
    110    });
    111  }
    112 });
    113 
    114 // PostMessage for BroadcastChannel in SharedWorkers
    115 tests.push(function test_broadcastChannel_inSharedWorkers() {
    116  info("Testing broadcastChannel in SharedWorkers");
    117 
    118  var bc = new BroadcastChannel('postMessagesTest_inWorkers');
    119  var resolve;
    120 
    121  var w = new SharedWorker('worker_postMessages.js');
    122  w.port.postMessage('broadcastChannel');
    123  w.port.onmessage = function(e) {
    124    is(e.data, 'ok', "Worker ready!");
    125 
    126    w.port.onmessage = function(e1) {
    127      if (!resolve) {
    128        ok(false, "Unexpected message!");
    129        return;
    130      }
    131 
    132      let tmp = resolve;
    133      resolve = null;
    134      tmp({ data: e1.data, ports: e1.ports, error: e1.data === "error" });
    135    }
    136 
    137    runTests({
    138      clonableObjectsEveryWhere: true,
    139      clonableObjectsSameProcess: false,
    140      transferableObjects: false,
    141      send(what, ports) {
    142        return new Promise(function(r, rr) {
    143          if (ports.length) {
    144            rr();
    145            return;
    146          }
    147 
    148          resolve = r;
    149          bc.postMessage(what);
    150        });
    151      },
    152 
    153      finished() {
    154        bc.close();
    155        w.port.postMessage("terminate");
    156        next();
    157      }
    158    });
    159  }
    160 });
    161 
    162 SimpleTest.waitForExplicitFinish();
    163 next();
    164 
    165 </script>
    166 </body>
    167 </html>