registration-end-to-end.https.html (3347B)
1 <!DOCTYPE html> 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.sub.js"></script> 6 <script> 7 var t = async_test('Registration: end-to-end'); 8 t.step(function() { 9 10 var scope = 'resources/in-scope/'; 11 var serviceWorkerStates = []; 12 var lastServiceWorkerState = ''; 13 var receivedMessageFromPort = ''; 14 15 assert_true(navigator.serviceWorker instanceof ServiceWorkerContainer); 16 assert_equals(typeof navigator.serviceWorker.register, 'function'); 17 assert_equals(typeof navigator.serviceWorker.getRegistration, 'function'); 18 19 service_worker_unregister_and_register( 20 t, 'resources/end-to-end-worker.js', scope) 21 .then(onRegister) 22 .catch(unreached_rejection(t)); 23 24 function sendMessagePort(worker, from) { 25 var messageChannel = new MessageChannel(); 26 worker.postMessage({from:from, port:messageChannel.port2}, [messageChannel.port2]); 27 return messageChannel.port1; 28 } 29 30 function onRegister(registration) { 31 var sw = registration.installing; 32 serviceWorkerStates.push(sw.state); 33 lastServiceWorkerState = sw.state; 34 35 var sawMessage = new Promise(t.step_func(function(resolve) { 36 sendMessagePort(sw, 'registering doc').onmessage = t.step_func(function (e) { 37 receivedMessageFromPort = e.data; 38 resolve(); 39 }); 40 })); 41 42 var sawActive = new Promise(t.step_func(function(resolve) { 43 sw.onstatechange = t.step_func(function() { 44 serviceWorkerStates.push(sw.state); 45 46 switch (sw.state) { 47 case 'installed': 48 assert_equals(lastServiceWorkerState, 'installing'); 49 break; 50 case 'activating': 51 assert_equals(lastServiceWorkerState, 'installed'); 52 break; 53 case 'activated': 54 assert_equals(lastServiceWorkerState, 'activating'); 55 break; 56 default: 57 // We won't see 'redundant' because onstatechange is 58 // overwritten before calling unregister. 59 assert_unreached('Unexpected state: ' + sw.state); 60 } 61 62 lastServiceWorkerState = sw.state; 63 if (sw.state === 'activated') 64 resolve(); 65 }); 66 })); 67 68 Promise.all([sawMessage, sawActive]).then(t.step_func(function() { 69 assert_array_equals(serviceWorkerStates, 70 ['installing', 'installed', 'activating', 'activated'], 71 'Service worker should pass through all states'); 72 73 assert_equals(receivedMessageFromPort, 'Ack for: registering doc'); 74 75 var sawRedundant = new Promise(t.step_func(function(resolve) { 76 sw.onstatechange = t.step_func(function() { 77 assert_equals(sw.state, 'redundant'); 78 resolve(); 79 }); 80 })); 81 registration.unregister(); 82 sawRedundant.then(t.step_func(function() { 83 t.done(); 84 })); 85 })); 86 } 87 }); 88 </script>