| <!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> |