Chromium Code Reviews| Index: LayoutTests/http/tests/serviceworker/register-same-scope-different-script-url.html |
| diff --git a/LayoutTests/http/tests/serviceworker/register-same-scope-different-script-url.html b/LayoutTests/http/tests/serviceworker/register-same-scope-different-script-url.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..faf1ebb9b55f03d31bb9ed4e074bad2fb0324930 |
| --- /dev/null |
| +++ b/LayoutTests/http/tests/serviceworker/register-same-scope-different-script-url.html |
| @@ -0,0 +1,254 @@ |
| +<!DOCTYPE html> |
| +<script src="../resources/testharness.js"></script> |
| +<script src="../resources/testharnessreport.js"></script> |
| +<script src="resources/test-helpers.js"></script> |
| +<script> |
| +var script1 = normalizeURL('resources/empty-worker.js'); |
| +var script2 = normalizeURL('resources/empty-worker.js?new'); |
| + |
| +// FIXME: The spec is in flux, this test's asserts may not be as per-spec. |
| +async_test(function(t) { |
| + var scope = 'scope/register-new-script-concurrently'; |
| + var registration; |
| + var register_promise1; |
| + var register_promise2; |
| + |
| + navigator.serviceWorker.unregister(scope) |
| + .then(function() { |
| + register_promise1 = navigator.serviceWorker.register(script1, |
| + {scope: scope}); |
| + register_promise2 = navigator.serviceWorker.register(script2, |
| + {scope: scope}); |
| + return register_promise1; |
| + }) |
| + .then(function(r) { |
| + registration = r; |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing.scriptURL, script1, |
| + 'on first update, first script should be installing'); |
| + assert_equals(registration.waiting, null, |
| + 'on first update, waiting should be null'); |
| + assert_equals(registration.active, null, |
| + 'on first update, active should be null'); |
| + return register_promise2; |
| + }) |
| + .then(function(r) { |
| + assert_equals(r, registration); |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing.scriptURL, script2, |
| + 'on second update, second script should be installing'); |
| + assert_equals(registration.waiting, null, |
| + 'on second update, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on second update, first script should be active'); |
| + return registration.unregister(); |
| + }) |
| + .then(function() { |
| + t.done(); |
| + }) |
| + .catch(unreached_rejection(t)); |
| + }, 'Register different scripts concurrently'); |
| + |
| +async_test(function(t) { |
| + var scope = 'scope/register-then-register-new-script'; |
| + var registration; |
| + |
| + service_worker_unregister_and_register(t, script1, scope) |
| + .then(function(r) { |
| + registration = r; |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + return wait_for_state(t, registration.installing, 'activated'); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing, null, |
| + 'on activated, installing should be null'); |
| + assert_equals(registration.waiting, null, |
| + 'on activated, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on activated, the first script should be active'); |
| + return navigator.serviceWorker.register(script2, {scope:scope}); |
| + }) |
| + .then(function(r) { |
| + assert_equals(r, registration, |
| + 'register() should resolve to the same registration'); |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing.scriptURL, script2, |
| + 'on update, the second script should be installing'); |
| + assert_equals(registration.waiting, null, |
| + 'on update waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on update, the first script should be active'); |
| + return wait_for_state(t, registration.installing, 'installed'); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing, null, |
| + 'on installed, installing should be null'); |
| + assert_equals(registration.waiting.scriptURL, script2, |
| + 'on installed, the second script should be waiting'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on installed, the first script should be active'); |
| + return registration.unregister(); |
| + }) |
| + .then(function() { |
| + t.done(); |
| + }) |
| + .catch(unreached_rejection(t)); |
| + }, 'Register then register new script URL'); |
| + |
| +async_test(function(t) { |
| + var scope = 'scope/register-then-register-new-script-404'; |
| + var registration; |
| + |
| + service_worker_unregister_and_register(t, script1, scope) |
| + .then(function(r) { |
| + registration = r; |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + return wait_for_state(t, registration.installing, 'activated'); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing, null, |
| + 'on activated, installing should be null'); |
| + assert_equals(registration.waiting, null, |
| + 'on activated, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on activated, the first script should be active'); |
| + return navigator.serviceWorker.register('this-will-404.js', |
| + {scope:scope}); |
| + }) |
| + .then( |
| + function() { assert_unreached('register should reject'); }, |
| + function(error) { |
| + assert_equals(registration.installing, null, |
| + 'on rejected, installing should be null'); |
| + assert_equals(registration.waiting, null, |
| + 'on rejected, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on rejected, the first script should be active'); |
| + return registration.unregister(); |
| + }) |
| + .then(function() { |
| + t.done(); |
| + }) |
| + .catch(unreached_rejection(t)); |
| + }, 'Register then register new script URL that 404s'); |
| + |
| +async_test(function(t) { |
| + var scope = 'scope/register-then-register-new-script-reject-install'; |
| + var reject_script = normalizeURL('resources/reject-install-worker.js'); |
| + var registration; |
| + |
| + service_worker_unregister_and_register(t, script1, scope) |
| + .then(function(r) { |
| + registration = r; |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + return wait_for_state(t, registration.installing, 'activated'); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing, null, |
| + 'on activated, installing should be null'); |
| + assert_equals(registration.waiting, null, |
| + 'on activated, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on activated, the first script should be active'); |
| + return navigator.serviceWorker.register(reject_script, {scope:scope}); |
| + }) |
| + .then(function(r) { |
| + assert_equals(r, registration, |
| + 'register() should resolve to the same registration'); |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing.scriptURL, reject_script, |
| + 'on update, the second script should be installing'); |
| + assert_equals(registration.waiting, null, |
| + 'on update, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on update, the first script should be active'); |
| + return wait_for_state(t, registration.installing, 'redundant'); |
| + }) |
| + .then(function() { |
| + assert_equals(registration.installing, null, |
| + 'on redundant, installing should be null'); |
| + assert_equals(registration.waiting, null, |
| + 'on redundant, waiting should be null'); |
| + assert_equals(registration.active.scriptURL, script1, |
| + 'on redundant, the first script should be active'); |
| + return registration.unregister(); |
| + }) |
| + .then(function() { |
| + t.done(); |
| + }) |
| + .catch(unreached_rejection(t)); |
| + }, 'Register then register new script that does not install'); |
| + |
| +async_test(function(t) { |
| + var scope = 'scope/register-new-script-controller'; |
| + var iframe; |
| + var registration; |
| + |
| + service_worker_unregister_and_register(t, script1, scope) |
| + .then(function(r) { |
| + registration = r; |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + return wait_for_state(t, registration.installing, 'activated'); |
| + }) |
| + .then(function() { |
| + return with_iframe(scope); |
| + }) |
| + .then(function(frame) { |
| + iframe = frame; |
| + return navigator.serviceWorker.register(script2, { scope: scope }) |
| + }) |
| + .then(function() { |
| + return wait_for_update(t, registration); |
| + }) |
| + .then(function() { |
| + return wait_for_state(t, registration.installing, 'installed'); |
| + }) |
| + .then(function() { |
| + var sw_container = iframe.contentWindow.navigator.serviceWorker; |
| + assert_equals(sw_container.controller.scriptURL, script1, |
| + 'the old version should control the old doc'); |
| + return with_iframe(scope); |
| + }) |
| + .then(function(frame) { |
| + var sw_container = frame.contentWindow.navigator.serviceWorker; |
| + assert_equals(sw_container.controller.scriptURL, script1, |
| + 'the old version should control a new doc'); |
| + var active_seen = wait_for_state(t, |
|
michaeln
2014/08/26 23:17:05
nit: rename this to something c'oser to onactivate
falken
2014/08/27 04:19:40
Agreed that was an odd name. We have "saw_xxx" in
|
| + registration.waiting, |
| + 'activated'); |
| + unload_iframe(frame); |
| + unload_iframe(iframe); |
| + return active_seen; |
| + }) |
| + .then(function() { |
| + return with_iframe(scope); |
| + }) |
| + .then(function(frame) { |
| + var sw_container = frame.contentWindow.navigator.serviceWorker; |
| + assert_equals(sw_container.controller.scriptURL, script2, |
| + 'the new version should control a new doc'); |
| + unload_iframe(frame); |
| + return registration.unregister(); |
| + }) |
| + .then(function() { |
| + t.done(); |
| + }) |
| + .catch(unreached_rejection(t)); |
| + }, 'Register same-scope new script url effect on controller'); |
| +</script> |