mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 19:55:39 +00:00
Bug 1569851 [wpt PR 18160] - Service worker update check handles 404 imported scripts appropriately, a=testonly
Automatic update from web-platform-tests Service worker update check handles 404 imported scripts appropriately Previously 404 was just treated as a identical scripts, but it's wrong because if a new worker tries to import the script during the initial script evaluation for a update, it should fail due to the network error. This CL adds code to capture the network failure in ServiceWorkerSingleScriptUpdateChecker and replay the network failure in ServiceWorkerNewScriptLoader. The failure in update-import-scripts.https.html will be fixed once ServiceWorkerImprotedScriptUpdateCheck is enabled. Bug: 648295 Change-Id: Ibcd879cc4c46b9878b1f6df1a6983c110f606fe7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1715414 Commit-Queue: Makoto Shimazu <shimazu@chromium.org> Auto-Submit: Makoto Shimazu <shimazu@chromium.org> Reviewed-by: Kenichi Ishibashi <bashi@chromium.org> Cr-Commit-Position: refs/heads/master@{#682189} -- wpt-commits: e5d044d1d420973cd707ec7832e664e0e3d1fd6c wpt-pr: 18160
This commit is contained in:
parent
e56908502a
commit
6941937dac
@ -0,0 +1,8 @@
|
||||
// This worker imports a script that returns 200 on the first request and 404
|
||||
// on the second request, and a script that is updated every time when
|
||||
// requesting it.
|
||||
const params = new URLSearchParams(location.search);
|
||||
const key = params.get('Key');
|
||||
const additional_key = params.get('AdditionalKey');
|
||||
importScripts(`update-worker.py?Key=${key}&Mode=not_found`,
|
||||
`update-worker.py?Key=${additional_key}&Mode=normal`);
|
@ -0,0 +1,6 @@
|
||||
// This worker imports a script that returns 200 on the first request and 404
|
||||
// on the second request. The resulting body also changes each time it is
|
||||
// requested.
|
||||
const params = new URLSearchParams(location.search);
|
||||
const key = params.get('Key');
|
||||
importScripts(`update-worker.py?Key=${key}&Mode=not_found`);
|
@ -0,0 +1 @@
|
||||
importScripts('404.py');
|
@ -15,6 +15,9 @@ def redirect_response(request, response, visited_count):
|
||||
],
|
||||
'/* %s */' % str(visited_count))
|
||||
|
||||
def not_found_response():
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
|
||||
def ok_response(request, response, visited_count,
|
||||
extra_body='', mime_type='application/javascript'):
|
||||
# |visited_count| is used as a unique id to differentiate responses
|
||||
@ -45,10 +48,13 @@ def main(request, response):
|
||||
return ok_response(request, response, visited_count)
|
||||
if mode == 'bad_mime_type':
|
||||
return ok_response(request, response, visited_count, mime_type='text/html')
|
||||
if mode == 'not_found':
|
||||
return not_found_response()
|
||||
if mode == 'redirect':
|
||||
return redirect_response(request, response, visited_count)
|
||||
if mode == 'syntax_error':
|
||||
return ok_response(request, response, visited_count, extra_body='badsyntax(isbad;')
|
||||
if mode == 'throw_install':
|
||||
return ok_response(request, response, visited_count, extra_body="addEventListener('install', function(e) { throw new Error('boom'); });")
|
||||
|
||||
return ok_response(request, response, visited_count)
|
||||
|
@ -0,0 +1,127 @@
|
||||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Tests for importScripts: import scripts ignored error</title>
|
||||
<script src="/common/utils.js"></script>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-helpers.sub.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
// This file contains tests to check if imported scripts appropriately updated.
|
||||
|
||||
const SCOPE = 'resources/simple.txt';
|
||||
|
||||
// Create a service worker (update-worker-from-file.py), which is initially
|
||||
// |initial_worker| and |updated_worker| later.
|
||||
async function prepare_ready_update_worker_from_file(
|
||||
t, initial_worker, updated_worker) {
|
||||
const key = token();
|
||||
const worker_url = `resources/update-worker-from-file.py?` +
|
||||
`First=${initial_worker}&Second=${updated_worker}&Key=${key}`;
|
||||
const expected_url = normalizeURL(worker_url);
|
||||
|
||||
const registration = await service_worker_unregister_and_register(
|
||||
t, worker_url, SCOPE);
|
||||
await wait_for_state(t, registration.installing, 'activated');
|
||||
assert_equals(registration.installing, null,
|
||||
'prepare_ready: installing');
|
||||
assert_equals(registration.waiting, null,
|
||||
'prepare_ready: waiting');
|
||||
assert_equals(registration.active.scriptURL, expected_url,
|
||||
'prepare_ready: active');
|
||||
return [registration, expected_url];
|
||||
}
|
||||
|
||||
// Create a service worker using the script under resources/.
|
||||
async function prepare_ready_normal_worker(t, filename, additional_params='') {
|
||||
const key = token();
|
||||
const worker_url = `resources/${filename}?Key=${key}&${additional_params}`;
|
||||
const expected_url = normalizeURL(worker_url);
|
||||
|
||||
const registration = await service_worker_unregister_and_register(
|
||||
t, worker_url, SCOPE);
|
||||
await wait_for_state(t, registration.installing, 'activated');
|
||||
assert_equals(registration.installing, null,
|
||||
'prepare_ready: installing');
|
||||
assert_equals(registration.waiting, null,
|
||||
'prepare_ready: waiting');
|
||||
assert_equals(registration.active.scriptURL, expected_url,
|
||||
'prepare_ready: active');
|
||||
return [registration, expected_url];
|
||||
}
|
||||
|
||||
function assert_installing_and_active(registration, expected_url) {
|
||||
assert_equals(registration.installing.scriptURL, expected_url,
|
||||
'assert_installing_and_active: installing');
|
||||
assert_equals(registration.waiting, null,
|
||||
'assert_installing_and_active: waiting');
|
||||
assert_equals(registration.active.scriptURL, expected_url,
|
||||
'assert_installing_and_active: active');
|
||||
}
|
||||
|
||||
function assert_waiting_and_active(registration, expected_url) {
|
||||
assert_equals(registration.installing, null,
|
||||
'assert_waiting_and_active: installing');
|
||||
assert_equals(registration.waiting.scriptURL, expected_url,
|
||||
'assert_waiting_and_active: waiting');
|
||||
assert_equals(registration.active.scriptURL, expected_url,
|
||||
'assert_waiting_and_active: active');
|
||||
}
|
||||
|
||||
function assert_active_only(registration, expected_url) {
|
||||
assert_equals(registration.installing, null,
|
||||
'assert_active_only: installing');
|
||||
assert_equals(registration.waiting, null,
|
||||
'assert_active_only: waiting');
|
||||
assert_equals(registration.active.scriptURL, expected_url,
|
||||
'assert_active_only: active');
|
||||
}
|
||||
|
||||
promise_test(async t => {
|
||||
const [registration, expected_url] =
|
||||
await prepare_ready_update_worker_from_file(
|
||||
t, 'empty.js', 'import-scripts-404.js');
|
||||
t.add_cleanup(() => registration.unregister());
|
||||
|
||||
await promise_rejects(t, new TypeError(), registration.update());
|
||||
assert_active_only(registration, expected_url);
|
||||
}, 'update() should fail when a new worker imports an unavailable script.');
|
||||
|
||||
promise_test(async t => {
|
||||
const [registration, expected_url] =
|
||||
await prepare_ready_update_worker_from_file(
|
||||
t, 'import-scripts-404-after-update.js', 'empty.js');
|
||||
t.add_cleanup(() => registration.unregister());
|
||||
|
||||
await Promise.all([registration.update(), wait_for_update(t, registration)]);
|
||||
assert_installing_and_active(registration, expected_url);
|
||||
|
||||
await wait_for_state(t, registration.installing, 'installed');
|
||||
assert_waiting_and_active(registration, expected_url);
|
||||
|
||||
await wait_for_state(t, registration.waiting, 'activated');
|
||||
assert_active_only(registration, expected_url);
|
||||
}, 'update() should succeed when the old imported script no longer exist but ' +
|
||||
"the new worker doesn't import it.");
|
||||
|
||||
promise_test(async t => {
|
||||
const [registration, expected_url] = await prepare_ready_normal_worker(
|
||||
t, 'import-scripts-404-after-update.js');
|
||||
t.add_cleanup(() => registration.unregister());
|
||||
|
||||
await registration.update();
|
||||
assert_active_only(registration, expected_url);
|
||||
}, 'update() should treat 404 on imported scripts as no change.');
|
||||
|
||||
promise_test(async t => {
|
||||
const [registration, expected_url] = await prepare_ready_normal_worker(
|
||||
t, 'import-scripts-404-after-update-plus-update-worker.js',
|
||||
`AdditionalKey=${token()}`);
|
||||
t.add_cleanup(() => registration.unregister());
|
||||
|
||||
await promise_rejects(t, new TypeError(), registration.update());
|
||||
assert_active_only(registration, expected_url);
|
||||
}, 'update() should find an update in an imported script but update() should ' +
|
||||
'result in failure due to missing the other imported script.');
|
||||
</script>
|
||||
</body>
|
Loading…
Reference in New Issue
Block a user