tor-browser

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

clients-get.https.html (5468B)


      1 <!DOCTYPE html>
      2 <title>Service Worker: Clients.get</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 function wait_for_clientId() {
      8  return new Promise(function(resolve, reject) {
      9    window.onmessage = e => {
     10      resolve(e.data.clientId);
     11    };
     12  });
     13 }
     14 
     15 promise_test(async t => {
     16  // Register service worker.
     17  const scope = 'resources/clients-get-frame.html';
     18  const client_ids = [];
     19  const registration = await service_worker_unregister_and_register(
     20    t, 'resources/clients-get-worker.js', scope);
     21  t.add_cleanup(() => registration.unregister());
     22  await wait_for_state(t, registration.installing, 'activated');
     23 
     24  // Prepare for test cases.
     25  // Case 1: frame1 which is focused.
     26  const frame1 = await with_iframe(scope + '#1');
     27  t.add_cleanup(() => frame1.remove());
     28  frame1.focus();
     29  client_ids.push(await wait_for_clientId());
     30  // Case 2: frame2 which is not focused.
     31  const frame2 = await with_iframe(scope + '#2');
     32  t.add_cleanup(() =>  frame2.remove());
     33  client_ids.push(await wait_for_clientId());
     34  // Case 3: invalid id.
     35  client_ids.push('invalid-id');
     36 
     37  // Call clients.get() for each id on the service worker.
     38  const message_event = await new Promise(resolve => {
     39    navigator.serviceWorker.onmessage = resolve;
     40    registration.active.postMessage({clientIds: client_ids});
     41  });
     42 
     43  const expected = [
     44    // visibilityState, focused, url, type, frameType
     45    ['visible', true, normalizeURL(scope) + '#1', 'window', 'nested'],
     46    ['visible', false, normalizeURL(scope) + '#2', 'window', 'nested'],
     47    undefined
     48  ];
     49  assert_equals(message_event.data.length, 3);
     50  assert_array_equals(message_event.data[0], expected[0]);
     51  assert_array_equals(message_event.data[1], expected[1]);
     52  assert_equals(message_event.data[2], expected[2]);
     53 }, 'Test Clients.get()');
     54 
     55 promise_test(async t => {
     56  // Register service worker.
     57  const scope = 'resources/simple.html';
     58  const registration = await service_worker_unregister_and_register(
     59    t, 'resources/clients-get-resultingClientId-worker.js', scope)
     60  t.add_cleanup(() =>  registration.unregister());
     61  await wait_for_state(t, registration.installing, 'activated');
     62  const worker = registration.active;
     63 
     64  // Load frame within the scope.
     65  const frame = await with_iframe(scope);
     66  t.add_cleanup(() => frame.remove());
     67  frame.focus();
     68 
     69  // Get resulting client id.
     70  const resultingClientId = await new Promise(resolve => {
     71    navigator.serviceWorker.onmessage = e => {
     72      if (e.data.msg == 'getResultingClientId') {
     73        resolve(e.data.resultingClientId);
     74      }
     75    };
     76    worker.postMessage({msg: 'getResultingClientId'});
     77  });
     78 
     79  // Query service worker for clients.get(resultingClientId).
     80  const isResultingClientUndefined = await new Promise(resolve => {
     81    navigator.serviceWorker.onmessage = e => {
     82      if (e.data.msg == 'getIsResultingClientUndefined') {
     83        resolve(e.data.isResultingClientUndefined);
     84      }
     85    };
     86    worker.postMessage({msg: 'getIsResultingClientUndefined',
     87                        resultingClientId});
     88  });
     89 
     90  assert_false(
     91    isResultingClientUndefined,
     92    'Clients.get(FetchEvent.resultingClientId) resolved with a Client');
     93 }, 'Test successful Clients.get(FetchEvent.resultingClientId)');
     94 
     95 promise_test(async t => {
     96  // Register service worker.
     97  const scope = 'resources/simple.html?fail';
     98  const registration = await service_worker_unregister_and_register(
     99    t, 'resources/clients-get-resultingClientId-worker.js', scope);
    100  t.add_cleanup(() =>  registration.unregister());
    101  await wait_for_state(t, registration.installing, 'activated');
    102 
    103  // Load frame, and destroy it while loading.
    104  const worker = registration.active;
    105  let frame = document.createElement('iframe');
    106  frame.src = scope;
    107  t.add_cleanup(() => {
    108    if (frame) {
    109      frame.remove();
    110    }
    111  });
    112 
    113  await new Promise(resolve => {
    114    navigator.serviceWorker.onmessage = e => {
    115      // The service worker posts a message to remove the iframe during fetch
    116      // event.
    117      if (e.data.msg == 'destroyResultingClient') {
    118        frame.remove();
    119        frame = null;
    120        worker.postMessage({msg: 'resultingClientDestroyed'});
    121        resolve();
    122      }
    123    };
    124    document.body.appendChild(frame);
    125  });
    126 
    127  resultingDestroyedClientId = await new Promise(resolve => {
    128    navigator.serviceWorker.onmessage = e => {
    129      // The worker sends a message back when it receives the message
    130      // 'resultingClientDestroyed' with the resultingClientId.
    131      if (e.data.msg == 'resultingClientDestroyedAck') {
    132        assert_equals(frame, null, 'Frame should be destroyed at this point.');
    133        resolve(e.data.resultingDestroyedClientId);
    134      }
    135    };
    136  });
    137 
    138  // Query service worker for clients.get(resultingDestroyedClientId).
    139  const isResultingClientUndefined = await new Promise(resolve => {
    140    navigator.serviceWorker.onmessage = e => {
    141      if (e.data.msg == 'getIsResultingClientUndefined') {
    142        resolve(e.data.isResultingClientUndefined);
    143      }
    144    };
    145    worker.postMessage({msg: 'getIsResultingClientUndefined',
    146                        resultingClientId: resultingDestroyedClientId });
    147  });
    148 
    149  assert_true(
    150    isResultingClientUndefined,
    151    'Clients.get(FetchEvent.resultingClientId) resolved with `undefined`');
    152 }, 'Test unsuccessful Clients.get(FetchEvent.resultingClientId)');
    153 
    154 </script>