| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <body> |
| <script> |
| promise_test(function (t) { |
| var currentState = 'test-is-starting'; |
| var scope = 'resources/state/'; |
| |
| return service_worker_unregister_and_register( |
| t, 'resources/empty-worker.js', scope) |
| .then(function(registration) { |
| t.add_cleanup(function() { |
| return service_worker_unregister(t, scope); |
| }); |
| |
| var sw = registration.installing; |
| |
| assert_equals(sw.state, 'installing', |
| 'the service worker should be in "installing" state.'); |
| checkStateTransition(sw.state); |
| return onStateChange(sw); |
| }); |
| |
| function checkStateTransition(newState) { |
| switch (currentState) { |
| case 'test-is-starting': |
| break; // anything goes |
| case 'installing': |
| assert_in_array(newState, ['installed', 'redundant']); |
| break; |
| case 'installed': |
| assert_in_array(newState, ['activating', 'redundant']); |
| break; |
| case 'activating': |
| assert_in_array(newState, ['activated', 'redundant']); |
| break; |
| case 'activated': |
| assert_equals(newState, 'redundant'); |
| break; |
| case 'redundant': |
| assert_unreached('a ServiceWorker should not transition out of ' + |
| 'the "redundant" state'); |
| break; |
| default: |
| assert_unreached('should not transition into unknown state "' + |
| newState + '"'); |
| break; |
| } |
| currentState = newState; |
| } |
| |
| function onStateChange(expectedTarget) { |
| return new Promise(function(resolve) { |
| expectedTarget.addEventListener('statechange', resolve); |
| }).then(function(event) { |
| assert_true(event.target instanceof ServiceWorker, |
| 'the target of the statechange event should be a ' + |
| 'ServiceWorker.'); |
| assert_equals(event.target, expectedTarget, |
| 'the target of the statechange event should be ' + |
| 'the installing ServiceWorker'); |
| assert_equals(event.type, 'statechange', |
| 'the type of the event should be "statechange".'); |
| |
| checkStateTransition(event.target.state); |
| |
| if (event.target.state != 'activated') |
| return onStateChange(expectedTarget); |
| }); |
| } |
| }, 'Service Worker state property and "statechange" event'); |
| </script> |