clients-get.https.html (5468B)
1 <!DOCTYPE html> 2 <title>Service Worker: Clients.get</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 function wait_for_clientId() { 8 return new Promise(function(resolve, reject) { 9 window.onmessage = e => { 10 resolve(e.data.clientId); 11 }; 12 }); 13 } 14 15 promise_test(async t => { 16 // Register service worker. 17 const scope = 'resources/clients-get-frame.html'; 18 const client_ids = []; 19 const registration = await service_worker_unregister_and_register( 20 t, 'resources/clients-get-worker.js', scope); 21 t.add_cleanup(() => registration.unregister()); 22 await wait_for_state(t, registration.installing, 'activated'); 23 24 // Prepare for test cases. 25 // Case 1: frame1 which is focused. 26 const frame1 = await with_iframe(scope + '#1'); 27 t.add_cleanup(() => frame1.remove()); 28 frame1.focus(); 29 client_ids.push(await wait_for_clientId()); 30 // Case 2: frame2 which is not focused. 31 const frame2 = await with_iframe(scope + '#2'); 32 t.add_cleanup(() => frame2.remove()); 33 client_ids.push(await wait_for_clientId()); 34 // Case 3: invalid id. 35 client_ids.push('invalid-id'); 36 37 // Call clients.get() for each id on the service worker. 38 const message_event = await new Promise(resolve => { 39 navigator.serviceWorker.onmessage = resolve; 40 registration.active.postMessage({clientIds: client_ids}); 41 }); 42 43 const expected = [ 44 // visibilityState, focused, url, type, frameType 45 ['visible', true, normalizeURL(scope) + '#1', 'window', 'nested'], 46 ['visible', false, normalizeURL(scope) + '#2', 'window', 'nested'], 47 undefined 48 ]; 49 assert_equals(message_event.data.length, 3); 50 assert_array_equals(message_event.data[0], expected[0]); 51 assert_array_equals(message_event.data[1], expected[1]); 52 assert_equals(message_event.data[2], expected[2]); 53 }, 'Test Clients.get()'); 54 55 promise_test(async t => { 56 // Register service worker. 57 const scope = 'resources/simple.html'; 58 const registration = await service_worker_unregister_and_register( 59 t, 'resources/clients-get-resultingClientId-worker.js', scope) 60 t.add_cleanup(() => registration.unregister()); 61 await wait_for_state(t, registration.installing, 'activated'); 62 const worker = registration.active; 63 64 // Load frame within the scope. 65 const frame = await with_iframe(scope); 66 t.add_cleanup(() => frame.remove()); 67 frame.focus(); 68 69 // Get resulting client id. 70 const resultingClientId = await new Promise(resolve => { 71 navigator.serviceWorker.onmessage = e => { 72 if (e.data.msg == 'getResultingClientId') { 73 resolve(e.data.resultingClientId); 74 } 75 }; 76 worker.postMessage({msg: 'getResultingClientId'}); 77 }); 78 79 // Query service worker for clients.get(resultingClientId). 80 const isResultingClientUndefined = await new Promise(resolve => { 81 navigator.serviceWorker.onmessage = e => { 82 if (e.data.msg == 'getIsResultingClientUndefined') { 83 resolve(e.data.isResultingClientUndefined); 84 } 85 }; 86 worker.postMessage({msg: 'getIsResultingClientUndefined', 87 resultingClientId}); 88 }); 89 90 assert_false( 91 isResultingClientUndefined, 92 'Clients.get(FetchEvent.resultingClientId) resolved with a Client'); 93 }, 'Test successful Clients.get(FetchEvent.resultingClientId)'); 94 95 promise_test(async t => { 96 // Register service worker. 97 const scope = 'resources/simple.html?fail'; 98 const registration = await service_worker_unregister_and_register( 99 t, 'resources/clients-get-resultingClientId-worker.js', scope); 100 t.add_cleanup(() => registration.unregister()); 101 await wait_for_state(t, registration.installing, 'activated'); 102 103 // Load frame, and destroy it while loading. 104 const worker = registration.active; 105 let frame = document.createElement('iframe'); 106 frame.src = scope; 107 t.add_cleanup(() => { 108 if (frame) { 109 frame.remove(); 110 } 111 }); 112 113 await new Promise(resolve => { 114 navigator.serviceWorker.onmessage = e => { 115 // The service worker posts a message to remove the iframe during fetch 116 // event. 117 if (e.data.msg == 'destroyResultingClient') { 118 frame.remove(); 119 frame = null; 120 worker.postMessage({msg: 'resultingClientDestroyed'}); 121 resolve(); 122 } 123 }; 124 document.body.appendChild(frame); 125 }); 126 127 resultingDestroyedClientId = await new Promise(resolve => { 128 navigator.serviceWorker.onmessage = e => { 129 // The worker sends a message back when it receives the message 130 // 'resultingClientDestroyed' with the resultingClientId. 131 if (e.data.msg == 'resultingClientDestroyedAck') { 132 assert_equals(frame, null, 'Frame should be destroyed at this point.'); 133 resolve(e.data.resultingDestroyedClientId); 134 } 135 }; 136 }); 137 138 // Query service worker for clients.get(resultingDestroyedClientId). 139 const isResultingClientUndefined = await new Promise(resolve => { 140 navigator.serviceWorker.onmessage = e => { 141 if (e.data.msg == 'getIsResultingClientUndefined') { 142 resolve(e.data.isResultingClientUndefined); 143 } 144 }; 145 worker.postMessage({msg: 'getIsResultingClientUndefined', 146 resultingClientId: resultingDestroyedClientId }); 147 }); 148 149 assert_true( 150 isResultingClientUndefined, 151 'Clients.get(FetchEvent.resultingClientId) resolved with `undefined`'); 152 }, 'Test unsuccessful Clients.get(FetchEvent.resultingClientId)'); 153 154 </script>