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
= 'resources/state/';
12 service_worker_unregister_and_register(
13 t
, 'resources/empty-worker.js', scope
)
14 .then(t
.step_func(function(registration
) {
15 var sw
= registration
.installing
;
16 sw
.addEventListener('statechange', t
.step_func(onStateChange(sw
)));
17 assert_equals(sw
.state
, 'installing',
18 'the service worker should be in "installing" state.');
19 checkStateTransition(sw
.state
);
21 .catch(unreached_rejection(t
));
23 function checkStateTransition(newState
) {
24 switch (currentState
) {
25 case 'test-is-starting':
26 break; // anything goes
28 assert_in_array(newState
, ['installed', 'redundant']);
31 assert_in_array(newState
, ['activating', 'redundant']);
34 assert_in_array(newState
, ['activated', 'redundant']);
37 assert_equals(newState
, 'redundant');
40 assert_unreached('a ServiceWorker should not transition out of ' +
41 'the "redundant" state');
44 assert_unreached('should not transition into unknown state "' +
48 currentState
= newState
;
51 function onStateChange(expectedTarget
) {
52 return function(event
) {
53 assert_true(event
.target
instanceof ServiceWorker
,
54 'the target of the statechange event should be a ' +
56 assert_equals(event
.target
, expectedTarget
,
57 'the target of the statechange event should be ' +
58 'the installing ServiceWorker');
59 assert_equals(event
.type
, 'statechange',
60 'the type of the event should be "statechange".');
62 checkStateTransition(event
.target
.state
);
64 if (event
.target
.state
== 'activated')
65 service_worker_unregister_and_done(t
, scope
);