2 <title>Service Worker: registration end-to-end</title>
3 <script src="../resources/testharness.js"></script>
4 <script src="../resources/testharnessreport.js"></script>
5 <script src="resources/test-helpers.js"></script>
7 var t = async_test('Registration: end-to-end');
10 var serviceWorkerStates = [];
11 var lastServiceWorkerState = '';
12 var receivedMessageFromPort = '';
13 var currentChangeCount = 0;
15 assert_true(navigator.serviceWorker instanceof ServiceWorkerContainer);
16 assert_equals(typeof navigator.serviceWorker.register, 'function');
17 assert_equals(typeof navigator.serviceWorker.unregister, 'function');
19 navigator.serviceWorker.oncurrentchange = function() {
23 // This always tests fresh registration, so unregister it first.
24 navigator.serviceWorker.unregister('/in-scope/*').then(
25 t.step_func(doRegister),
26 unreached_func(t, 'unregister should not reject')
29 function doRegister() {
30 navigator.serviceWorker.register(
31 'resources/end-to-end-worker.js',
32 {scope: '/in-scope/*'}
34 t.step_func(onRegister)
36 unreached_func(t, 'Registration failed')
40 function sendMessagePort(worker, from) {
41 var messageChannel = new MessageChannel();
42 worker.postMessage({from:from, port:messageChannel.port2}, [messageChannel.port2]);
43 return messageChannel.port1;
47 var sawMessage, sawActive;
48 var messagePromise = new Promise(function(resolve) { sawMessage = resolve; });
49 var activePromise = new Promise(function(resolve) { sawActive = resolve; });
51 function onRegister(sw) {
52 serviceWorkerStates.push(sw.state);
53 lastServiceWorkerState = sw.state;
55 var sawMessage = new Promise(t.step_func(function(resolve) {
56 sendMessagePort(sw, 'registering doc').onmessage = t.step_func(function (e) {
57 receivedMessageFromPort = e.data;
62 var sawActive = new Promise(t.step_func(function(resolve) {
63 sw.onstatechange = t.step_func(function() {
64 serviceWorkerStates.push(sw.state);
68 assert_equals(lastServiceWorkerState, 'parsed');
71 assert_equals(lastServiceWorkerState, 'installing');
74 assert_equals(lastServiceWorkerState, 'installed');
77 assert_equals(lastServiceWorkerState, 'activating');
80 unreached_func(t, 'Unexpected state: ' + sw.state);
83 lastServiceWorkerState = sw.state;
84 if (sw.state === 'active')
89 Promise.all([sawMessage, sawActive]).then(t.step_func(function() {
90 assert_array_equals(serviceWorkerStates,
91 ['parsed', 'installing', 'installed', 'activating', 'active'],
92 'Service worker should pass through four states');
94 assert_equals(currentChangeCount, 0,
95 'Should not see current changes since document is out of scope');
97 assert_equals(receivedMessageFromPort, 'Ack for: registering doc');