blob: ddc08d563c6c7fb6de92107a256c784b504b529a [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<body>
<script>
(function () {
var t = async_test('Service Worker state property and "statechange" event');
var currentState = 'test-is-starting';
var scope = 'resources/state/';
service_worker_unregister_and_register(
t, 'resources/empty-worker.js', scope)
.then(t.step_func(function(registration) {
var sw = registration.installing;
sw.addEventListener('statechange', t.step_func(onStateChange(sw)));
assert_equals(sw.state, 'installing',
'the service worker should be in "installing" state.');
checkStateTransition(sw.state);
}))
.catch(unreached_rejection(t));
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 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')
service_worker_unregister_and_done(t, scope);
};
}
}());
</script>