| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Test that cache is being bypassed/validated in no-cache mode on update</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script> |
| // Tests a service worker script fetch during an update check which |
| // bypasses/validates the browser cache. The fetch should have the |
| // 'if-none-match' request header. |
| // |
| // This tests the Update step: |
| // "Set request’s cache mode to "no-cache" if any of the following are true..." |
| // https://w3c.github.io/ServiceWorker/#update-algorithm |
| // |
| // The test works by registering a service worker with |updateViaCache| |
| // set to "none". It then does an update. The test server responds with |
| // an updated worker script that remembers the http request headers. |
| // The updated worker reports back these headers to the test page. |
| promise_test(async (t) => { |
| const script = "resources/test-request-headers-worker.py"; |
| const scope = "resources/"; |
| |
| // Register the service worker. |
| await service_worker_unregister(t, scope); |
| const registration = await navigator.serviceWorker.register( |
| script, {scope, updateViaCache: 'none'}); |
| await wait_for_state(t, registration.installing, 'activated'); |
| |
| // Do an update. |
| await registration.update(); |
| |
| // Ask the new worker what the request headers were. |
| const newWorker = registration.installing; |
| const sawMessage = new Promise((resolve) => { |
| navigator.serviceWorker.onmessage = (event) => { |
| resolve(event.data); |
| }; |
| }); |
| newWorker.postMessage('getHeaders'); |
| const result = await sawMessage; |
| |
| // Test the result. |
| assert_equals(result['service-worker'], 'script'); |
| assert_equals(result['if-none-match'], 'etag'); |
| }, 'headers in no-cache mode'); |
| |
| </script> |