tor-browser

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

fetch-sw.https.html (2220B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <title>Stale Revalidation Requests don't get sent to service worker</title>
      6  <script src="/resources/testharness.js"></script>
      7  <script src="/resources/testharnessreport.js"></script>
      8  <script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script>
      9  <script src="/common/utils.js"></script>
     10 </head>
     11 <body>
     12 <script>
     13 
     14  // Duplicating this resource to make service worker scoping simpler.
     15  async function setupRegistrationAndWaitToBeControlled(t, scope) {
     16    const controlled = new Promise((resolve) => {
     17      navigator.serviceWorker.oncontrollerchange = () => { resolve(); };
     18    });
     19    const reg = await navigator.serviceWorker.register('sw-intercept.js');
     20    await wait_for_state(t, reg.installing, 'activated');
     21    await controlled;
     22    add_completion_callback(_ => reg.unregister());
     23    return reg;
     24  }
     25 
     26  // Using 250ms polling interval to provide enough 'network calmness' to give
     27  // the background low priority revalidation request a chance to kick in.
     28  function wait250ms(test) {
     29    return new Promise(resolve => {
     30      test.step_timeout(() => {
     31        resolve();
     32      }, 250);
     33    });
     34  }
     35 
     36  promise_test(async (test) => {
     37    var request_token = token();
     38    const uri = 'resources/stale-script.py?token=' + request_token;
     39 
     40    await setupRegistrationAndWaitToBeControlled(test, 'resources/stale-script.py');
     41 
     42    var service_worker_count = 0;
     43    navigator.serviceWorker.addEventListener('message', function once(event) {
     44      if (event.data.endsWith(uri)) {
     45        service_worker_count++;
     46      }
     47    });
     48 
     49    const response = await fetch(uri);
     50    const response2 = await fetch(uri);
     51    assert_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id'));
     52    while(true) {
     53      const revalidation_check = await fetch(`resources/stale-script.py?query&token=` + request_token);
     54      if (revalidation_check.headers.get('Count') == '2') {
     55        // The service worker should not see the revalidation request.
     56        assert_equals(service_worker_count, 2);
     57        break;
     58      }
     59      await wait250ms(test);
     60    }
     61  }, 'Second fetch returns same response');
     62 
     63 </script>
     64 </body>
     65 </html>