tor-browser

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

postmessage.https.html (7973B)


      1 <!DOCTYPE html>
      2 <title>Service Worker: postMessage</title>
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="resources/test-helpers.sub.js"></script>
      6 <script>
      7 promise_test(t => {
      8    var script = 'resources/postmessage-worker.js';
      9    var scope = 'resources/blank.html';
     10    var registration;
     11    var worker;
     12    var port;
     13 
     14    return service_worker_unregister_and_register(t, script, scope)
     15      .then(r => {
     16          t.add_cleanup(() => r.unregister());
     17          registration = r;
     18          worker = registration.installing;
     19 
     20          var messageChannel = new MessageChannel();
     21          port = messageChannel.port1;
     22          return new Promise(resolve => {
     23              port.onmessage = resolve;
     24              worker.postMessage({port: messageChannel.port2},
     25                                 [messageChannel.port2]);
     26              worker.postMessage({value: 1});
     27              worker.postMessage({value: 2});
     28              worker.postMessage({done: true});
     29            });
     30        })
     31      .then(e => {
     32          assert_equals(e.data, 'Acking value: 1');
     33          return new Promise(resolve => { port.onmessage = resolve; });
     34        })
     35      .then(e => {
     36          assert_equals(e.data, 'Acking value: 2');
     37          return new Promise(resolve => { port.onmessage = resolve; });
     38        })
     39      .then(e => {
     40          assert_equals(e.data, 'quit');
     41          return registration.unregister(scope);
     42        });
     43  }, 'postMessage to a ServiceWorker (and back via MessagePort)');
     44 
     45 promise_test(t => {
     46    var script = 'resources/postmessage-transferables-worker.js';
     47    var scope = 'resources/blank.html';
     48    var sw = navigator.serviceWorker;
     49 
     50    var message = 'Hello, world!';
     51    var text_encoder = new TextEncoder;
     52    var text_decoder = new TextDecoder;
     53 
     54    return service_worker_unregister_and_register(t, script, scope)
     55      .then(r => {
     56          t.add_cleanup(() => r.unregister());
     57 
     58          var ab = text_encoder.encode(message);
     59          assert_equals(ab.byteLength, message.length);
     60          r.installing.postMessage(ab, [ab.buffer]);
     61          assert_equals(text_decoder.decode(ab), '');
     62          assert_equals(ab.byteLength, 0);
     63 
     64          return new Promise(resolve => { sw.onmessage = resolve; });
     65        })
     66      .then(e => {
     67          // Verify the integrity of the transferred array buffer.
     68          assert_equals(e.data.content, message);
     69          assert_equals(e.data.byteLength, message.length);
     70          return new Promise(resolve => { sw.onmessage = resolve; });
     71        })
     72      .then(e => {
     73          // Verify the integrity of the array buffer sent back from
     74          // ServiceWorker via Client.postMessage.
     75          assert_equals(text_decoder.decode(e.data), message);
     76          assert_equals(e.data.byteLength, message.length);
     77          return new Promise(resolve => { sw.onmessage = resolve; });
     78        })
     79      .then(e => {
     80          // Verify that the array buffer on ServiceWorker is neutered.
     81          assert_equals(e.data.content, '');
     82          assert_equals(e.data.byteLength, 0);
     83        });
     84  }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client');
     85 
     86 promise_test(t => {
     87    var script = 'resources/postmessage-transferables-worker.js';
     88    var scope = 'resources/blank.html';
     89    var message = 'Hello, world!';
     90    var text_encoder = new TextEncoder;
     91    var text_decoder = new TextDecoder;
     92    var port;
     93 
     94    return service_worker_unregister_and_register(t, script, scope)
     95      .then(r => {
     96          t.add_cleanup(() => r.unregister());
     97 
     98          var channel = new MessageChannel;
     99          port = channel.port1;
    100          r.installing.postMessage(undefined, [channel.port2]);
    101 
    102          var ab = text_encoder.encode(message);
    103          assert_equals(ab.byteLength, message.length);
    104          port.postMessage(ab, [ab.buffer]);
    105          assert_equals(text_decoder.decode(ab), '');
    106          assert_equals(ab.byteLength, 0);
    107 
    108          return new Promise(resolve => { port.onmessage = resolve; });
    109        })
    110      .then(e => {
    111          // Verify the integrity of the transferred array buffer.
    112          assert_equals(e.data.content, message);
    113          assert_equals(e.data.byteLength, message.length);
    114          return new Promise(resolve => { port.onmessage = resolve; });
    115        })
    116      .then(e => {
    117          // Verify the integrity of the array buffer sent back from
    118          // ServiceWorker via Client.postMessage.
    119          assert_equals(text_decoder.decode(e.data), message);
    120          assert_equals(e.data.byteLength, message.length);
    121          return new Promise(resolve => { port.onmessage = resolve; });
    122        })
    123      .then(e => {
    124          // Verify that the array buffer on ServiceWorker is neutered.
    125          assert_equals(e.data.content, '');
    126          assert_equals(e.data.byteLength, 0);
    127        });
    128  }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client' +
    129     ' over MessagePort');
    130 
    131  promise_test(t => {
    132    var script = 'resources/postmessage-dictionary-transferables-worker.js';
    133    var scope = 'resources/blank.html';
    134    var sw = navigator.serviceWorker;
    135 
    136    var message = 'Hello, world!';
    137    var text_encoder = new TextEncoder;
    138    var text_decoder = new TextDecoder;
    139 
    140    return service_worker_unregister_and_register(t, script, scope)
    141      .then(r => {
    142          t.add_cleanup(() => r.unregister());
    143 
    144          var ab = text_encoder.encode(message);
    145          assert_equals(ab.byteLength, message.length);
    146          r.installing.postMessage(ab, {transfer: [ab.buffer]});
    147          assert_equals(text_decoder.decode(ab), '');
    148          assert_equals(ab.byteLength, 0);
    149 
    150          return new Promise(resolve => { sw.onmessage = resolve; });
    151        })
    152      .then(e => {
    153          // Verify the integrity of the transferred array buffer.
    154          assert_equals(e.data.content, message);
    155          assert_equals(e.data.byteLength, message.length);
    156          return new Promise(resolve => { sw.onmessage = resolve; });
    157        })
    158      .then(e => {
    159          // Verify the integrity of the array buffer sent back from
    160          // ServiceWorker via Client.postMessage.
    161          assert_equals(text_decoder.decode(e.data), message);
    162          assert_equals(e.data.byteLength, message.length);
    163          return new Promise(resolve => { sw.onmessage = resolve; });
    164        })
    165      .then(e => {
    166          // Verify that the array buffer on ServiceWorker is neutered.
    167          assert_equals(e.data.content, '');
    168          assert_equals(e.data.byteLength, 0);
    169        });
    170  }, 'postMessage with dictionary a transferable ArrayBuffer between ServiceWorker and Client');
    171 
    172  promise_test(async t => {
    173    const firstScript = 'resources/postmessage-echo-worker.js?one';
    174    const secondScript = 'resources/postmessage-echo-worker.js?two';
    175    const scope = 'resources/';
    176 
    177    const registration = await service_worker_unregister_and_register(t, firstScript, scope);
    178    t.add_cleanup(() => registration.unregister());
    179    const firstWorker = registration.installing;
    180 
    181    const messagePromise = new Promise(resolve => {
    182      navigator.serviceWorker.addEventListener('message', (event) => {
    183        resolve(event.data);
    184      }, {once: true});
    185    });
    186 
    187    await wait_for_state(t, firstWorker, 'activated');
    188    await navigator.serviceWorker.register(secondScript, {scope});
    189    const secondWorker = registration.installing;
    190    await wait_for_state(t, firstWorker, 'redundant');
    191 
    192    // postMessage() to a redundant worker should be dropped silently.
    193    // Historically, this threw an exception.
    194    firstWorker.postMessage('firstWorker');
    195 
    196    // To test somewhat that it was not received, send a message to another
    197    // worker and check that we get a reply for that one.
    198    secondWorker.postMessage('secondWorker');
    199    const data = await messagePromise;
    200    assert_equals(data, 'secondWorker');
    201  }, 'postMessage to a redundant worker');
    202 </script>