2 <script src="../resources/testharness.js"></script>
3 <script src="../resources/testharnessreport.js"></script>
4 <script src="resources/test-helpers.js"></script>
8 var t = async_test('Service Worker state property and "statechange" event');
9 var currentState = 'test-is-starting';
10 var scope = '/state/*';
12 service_worker_unregister_and_register(
13 t, 'resources/worker-no-op.js', scope, onRegister);
15 function onRegister(sw) {
16 sw.addEventListener('statechange', t.step_func(onStateChange(sw)));
17 assert_in_array(sw.state, ['parsed', 'installing'],
18 'the service worker should be in a state up to ' +
20 checkStateTransition(sw.state);
23 function checkStateTransition(newState) {
24 switch (currentState) {
25 case 'test-is-starting':
26 break; // anything goes
28 assert_equals(newState, 'installing');
31 assert_in_array(newState, ['installed', 'deactivated']);
34 assert_in_array(newState, ['activating', 'deactivated']);
37 assert_in_array(newState, ['active', 'deactivated']);
40 assert_equals(newState, 'deactivated');
43 assert_unreached('a ServiceWorker should not transition out of ' +
44 'the "deactivated" state');
47 assert_unreached('should not transition into unknown state "' +
51 currentState = newState;
54 function onStateChange(expectedTarget) {
55 return function(event) {
56 assert_true(event.target instanceof ServiceWorker,
57 'the target of the statechange event should be a ' +
59 assert_equals(event.target, expectedTarget,
60 'the target of the statechange event should be ' +
61 'the installing ServiceWorker');
62 assert_equals(event.type, 'statechange',
63 'the type of the event should be "statechange".');
65 checkStateTransition(event.target.state);
67 if (event.target.state == 'active')
68 service_worker_unregister_and_done(t, scope);