<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Stale Revalidation Requests don't get sent to service worker</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script> <script src="/common/utils.js"></script> </head> <body> <script> // Duplicating this resource to make service worker scoping simpler. async function setupRegistrationAndWaitToBeControlled(t, scope) { const controlled = new Promise((resolve) => { navigator.serviceWorker.oncontrollerchange = () => { resolve(); }; }); const reg = await navigator.serviceWorker.register('sw-intercept.js'); await wait_for_state(t, reg.installing, 'activated'); await controlled; add_completion_callback(_ => reg.unregister()); return reg; } // Using 250ms polling interval to provide enough 'network calmness' to give // the background low priority revalidation request a chance to kick in. function wait250ms(test) { return new Promise(resolve => { test.step_timeout(() => { resolve(); }, 250); }); } promise_test(async (test) => { var request_token = token(); const uri = 'resources/stale-script.py?token=' + request_token; await setupRegistrationAndWaitToBeControlled(test, 'resources/stale-script.py'); var service_worker_count = 0; navigator.serviceWorker.addEventListener('message', function once(event) { if (event.data.endsWith(uri)) { service_worker_count++; } }); const response = await fetch(uri); const response2 = await fetch(uri); assert_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id')); while(true) { const revalidation_check = await fetch(`resources/stale-script.py?query&token=` + request_token); if (revalidation_check.headers.get('Count') == '2') { // The service worker should not see the revalidation request. assert_equals(service_worker_count, 2); break; } await wait250ms(test); } }, 'Second fetch returns same response'); </script> </body> </html>