Commit 4555d7d4 authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Add tests for stale while revalidate handling with service workers.

Chrome currently fails these tests and it will be enabled in a
followup patch. The intent of this change is to add the wpt tests
and bring the code closer to the proposed specification.

BUG=348877

Change-Id: Ie9894c588b2cfe040be97905617b05c5b49fc4f8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1479576
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#638586}
parent 111b3dad
......@@ -493,9 +493,10 @@ ResourceFetcher::ResourceFetcher(const ResourceFetcherInit& init)
auto_load_images_(true),
images_enabled_(true),
allow_stale_resources_(false),
image_fetched_(false),
stale_while_revalidate_enabled_(false) {
image_fetched_(false) {
DCHECK(console_logger_);
stale_while_revalidate_enabled_ =
RuntimeEnabledFeatures::StaleWhileRevalidateEnabledByRuntimeFlag();
InstanceCounters::IncrementCounter(InstanceCounters::kResourceFetcherCounter);
if (IsMainThread())
MainThreadFetchersSet().insert(this);
......@@ -2078,6 +2079,7 @@ void ResourceFetcher::RevalidateStaleResource(Resource* stale_resource) {
// requests.
FetchParameters params(stale_resource->GetResourceRequest());
params.SetStaleRevalidation(true);
params.MutableResourceRequest().SetSkipServiceWorker(true);
RawResource::Fetch(
params, this,
MakeGarbageCollected<StaleRevalidationResourceClient>(stale_resource));
......
......@@ -4474,6 +4474,12 @@ crbug.com/831509 external/wpt/service-workers/service-worker/skip-waiting-instal
crbug.com/831509 virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/skip-waiting-installed.https.html [ Failure Pass ]
crbug.com/831509 virtual/outofblink-cors/external/wpt/service-workers/service-worker/skip-waiting-installed.https.html [ Failure Pass ]
# Stale While Revalidate
crbug.com/348877 external/wpt/fetch/stale-while-revalidate/fetch-sw.https.tentative.html [ Failure ]
crbug.com/348877 virtual/outofblink-cors/external/wpt/fetch/stale-while-revalidate/fetch-sw.https.tentative.html [ Failure ]
crbug.com/348877 external/wpt/fetch/stale-while-revalidate/fetch.tentative.html [ Failure ]
crbug.com/348877 virtual/outofblink-cors/external/wpt/fetch/stale-while-revalidate/fetch.tentative.html [ Failure ]
# Sheriff failures 2017-02-21
crbug.com/73609 http/tests/media/video-play-stall.html [ Pass Timeout ]
......
<!DOCTYPE html>
<!---
Tentative test against:
https://github.com/whatwg/fetch/pull/853
-->
<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 setupRegistration(t, scope) {
const reg = await navigator.serviceWorker.register('sw-intercept.js');
await wait_for_state(t, reg.installing, 'activated');
add_completion_callback(_ => reg.unregister());
return reg;
}
function wait25ms(test) {
return new Promise(resolve => {
test.step_timeout(() => {
resolve();
}, 25);
});
}
promise_test(async (test) => {
var request_token = token();
const uri = 'stale-script.py?token=' + request_token;
await setupRegistration(test, '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(`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 wait25ms(test);
}
}, 'Second fetch returns same response');
</script>
</body>
</html>
......@@ -9,12 +9,28 @@ https://github.com/whatwg/fetch/pull/853
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script>
function wait25ms(test) {
return new Promise(resolve => {
test.step_timeout(() => {
resolve();
}, 25);
});
}
promise_test(async (test) => {
var request_token = token();
const response = await fetch(`stale-script.py?token=` + request_token);
const response2 = await fetch(`stale-script.py?token=` + request_token);
assert_not_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id'));
}, 'Second fetch does not return same response');
assert_equals(response.headers.get('Unique-Id'), response2.headers.get('Unique-Id'));
while(true) {
const revalidation_check = await fetch(`stale-script.py?query&token=` + request_token);
if (revalidation_check.headers.get('Count') == '2') {
break;
}
await wait25ms(test);
}
}, 'Second fetch returns same response');
</script>
......@@ -8,6 +8,8 @@ def main(request, response):
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
if count < 2:
request.server.stash.put(token, count)
return 200, headers, content
else:
count = count + 1
......
......@@ -10,6 +10,8 @@ def main(request, response):
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
if count < 2:
request.server.stash.put(token, count)
return 200, headers, content
else:
count = count + 1
......
......@@ -13,6 +13,8 @@ def main(request, response):
if request.GET.first("query", None) != None:
headers = [("Count", count)]
content = ""
if count < 2:
request.server.stash.put(token, count)
return 200, headers, content
else:
count = count + 1
......
async function broadcast(msg) {
for (const client of await clients.matchAll()) {
client.postMessage(msg);
}
}
self.addEventListener('fetch', event => {
event.waitUntil(broadcast(event.request.url));
event.respondWith(fetch(event.request));
});
self.addEventListener('activate', event => {
self.clients.claim();
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment