tor-browser

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

extendable-message-event.https.html (8539B)


      1 <!DOCTYPE html>
      2 <title>ServiceWorkerGlobalScope: ExtendableMessageEvent</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 src='./resources/extendable-message-event-utils.js'></script>
      7 <script>
      8 promise_test(function(t) {
      9    var script = 'resources/extendable-message-event-worker.js';
     10    var scope = 'resources/scope/extendable-message-event-from-toplevel';
     11    var registration;
     12 
     13    return service_worker_unregister_and_register(t, script, scope)
     14      .then(function(r) {
     15          registration = r;
     16          add_completion_callback(function() { registration.unregister(); });
     17          return wait_for_state(t, registration.installing, 'activated');
     18        })
     19      .then(function() {
     20          var saw_message = new Promise(function(resolve) {
     21              navigator.serviceWorker.onmessage =
     22                  function(event) { resolve(event.data); }
     23            });
     24          var channel = new MessageChannel;
     25          registration.active.postMessage('', [channel.port1]);
     26          return saw_message;
     27        })
     28      .then(function(results) {
     29          var expected = {
     30            constructor: { name: 'ExtendableMessageEvent' },
     31            origin: location.origin,
     32            lastEventId: '',
     33            source: {
     34                constructor: { name: 'WindowClient' },
     35                frameType: 'top-level',
     36                url: location.href,
     37                visibilityState: 'visible',
     38                focused: true
     39            },
     40            ports: [ { constructor: { name: 'MessagePort' } } ]
     41          };
     42          ExtendableMessageEventUtils.assert_equals(results, expected);
     43        });
     44  }, 'Post an extendable message from a top-level client');
     45 
     46 promise_test(function(t) {
     47    var script = 'resources/extendable-message-event-worker.js';
     48    var scope = 'resources/scope/extendable-message-event-from-nested';
     49    var frame;
     50 
     51    return service_worker_unregister_and_register(t, script, scope)
     52      .then(function(registration) {
     53          add_completion_callback(function() { registration.unregister(); });
     54          return wait_for_state(t, registration.installing, 'activated');
     55        })
     56      .then(function() { return with_iframe(scope); })
     57      .then(function(f) {
     58          frame = f;
     59          add_completion_callback(function() { frame.remove(); });
     60          var saw_message = new Promise(function(resolve) {
     61              frame.contentWindow.navigator.serviceWorker.onmessage =
     62                  function(event) { resolve(event.data); }
     63            });
     64          f.contentWindow.navigator.serviceWorker.controller.postMessage('');
     65          return saw_message;
     66        })
     67      .then(function(results) {
     68          var expected = {
     69              constructor: { name: 'ExtendableMessageEvent' },
     70              origin: location.origin,
     71              lastEventId: '',
     72              source: {
     73                  constructor: { name: 'WindowClient' },
     74                  url: frame.contentWindow.location.href,
     75                  frameType: 'nested',
     76                  visibilityState: 'visible',
     77                  focused: false
     78              },
     79              ports: []
     80            };
     81          ExtendableMessageEventUtils.assert_equals(results, expected);
     82        });
     83  }, 'Post an extendable message from a nested client');
     84 
     85 promise_test(function(t) {
     86    var script = 'resources/extendable-message-event-loopback-worker.js';
     87    var scope = 'resources/scope/extendable-message-event-loopback';
     88    var registration;
     89 
     90    return service_worker_unregister_and_register(t, script, scope)
     91      .then(function(r) {
     92          registration = r;
     93          add_completion_callback(function() { registration.unregister(); });
     94          return wait_for_state(t, registration.installing, 'activated');
     95        })
     96      .then(function() {
     97          var results = [];
     98          var saw_message = new Promise(function(resolve) {
     99              navigator.serviceWorker.onmessage = function(event) {
    100                switch (event.data.type) {
    101                  case 'record':
    102                    results.push(event.data.results);
    103                    break;
    104                  case 'finish':
    105                    resolve(results);
    106                    break;
    107                }
    108              };
    109            });
    110          registration.active.postMessage({type: 'start'});
    111          return saw_message;
    112        })
    113      .then(function(results) {
    114          assert_equals(results.length, 2);
    115 
    116          var expected_trial_1 = {
    117              constructor: { name: 'ExtendableMessageEvent' },
    118              origin: location.origin,
    119              lastEventId: '',
    120              source: {
    121                  constructor: { name: 'ServiceWorker' },
    122                  scriptURL: normalizeURL(script),
    123                  state: 'activated'
    124              },
    125              ports: []
    126          };
    127          assert_equals(results[0].trial, 1);
    128          ExtendableMessageEventUtils.assert_equals(
    129              results[0].event, expected_trial_1
    130          );
    131 
    132          var expected_trial_2 = {
    133              constructor: { name: 'ExtendableMessageEvent' },
    134              origin: location.origin,
    135              lastEventId: '',
    136              source: {
    137                  constructor: { name: 'ServiceWorker' },
    138                  scriptURL: normalizeURL(script),
    139                  state: 'activated'
    140              },
    141              ports: [],
    142          };
    143          assert_equals(results[1].trial, 2);
    144          ExtendableMessageEventUtils.assert_equals(
    145              results[1].event, expected_trial_2
    146          );
    147        });
    148  }, 'Post loopback extendable messages');
    149 
    150 promise_test(function(t) {
    151    var script1 = 'resources/extendable-message-event-ping-worker.js';
    152    var script2 = 'resources/extendable-message-event-pong-worker.js';
    153    var scope = 'resources/scope/extendable-message-event-pingpong';
    154    var registration;
    155 
    156    return service_worker_unregister_and_register(t, script1, scope)
    157      .then(function(r) {
    158          registration = r;
    159          add_completion_callback(function() { registration.unregister(); });
    160          return wait_for_state(t, registration.installing, 'activated');
    161        })
    162      .then(function() {
    163          // A controlled frame is necessary for keeping a waiting worker.
    164          return with_iframe(scope);
    165        })
    166      .then(function(frame) {
    167          add_completion_callback(function() { frame.remove(); });
    168          return navigator.serviceWorker.register(script2, {scope: scope});
    169        })
    170      .then(function(r) {
    171          return wait_for_state(t, r.installing, 'installed');
    172        })
    173      .then(function() {
    174          var results = [];
    175          var saw_message = new Promise(function(resolve) {
    176              navigator.serviceWorker.onmessage = function(event) {
    177                switch (event.data.type) {
    178                  case 'record':
    179                    results.push(event.data.results);
    180                    break;
    181                  case 'finish':
    182                    resolve(results);
    183                    break;
    184                }
    185              };
    186            });
    187          registration.active.postMessage({type: 'start'});
    188          return saw_message;
    189        })
    190      .then(function(results) {
    191          assert_equals(results.length, 2);
    192 
    193          var expected_ping = {
    194              constructor: { name: 'ExtendableMessageEvent' },
    195              origin: location.origin,
    196              lastEventId: '',
    197              source: {
    198                  constructor: { name: 'ServiceWorker' },
    199                  scriptURL: normalizeURL(script1),
    200                  state: 'activated'
    201              },
    202              ports: []
    203          };
    204          assert_equals(results[0].pingOrPong, 'ping');
    205          ExtendableMessageEventUtils.assert_equals(
    206              results[0].event, expected_ping
    207          );
    208 
    209          var expected_pong = {
    210              constructor: { name: 'ExtendableMessageEvent' },
    211              origin: location.origin,
    212              lastEventId: '',
    213              source: {
    214                  constructor: { name: 'ServiceWorker' },
    215                  scriptURL: normalizeURL(script2),
    216                  state: 'installed'
    217              },
    218              ports: []
    219          };
    220          assert_equals(results[1].pingOrPong, 'pong');
    221          ExtendableMessageEventUtils.assert_equals(
    222              results[1].event, expected_pong
    223          );
    224        });
    225  }, 'Post extendable messages among service workers');
    226 </script>