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