postmessage.https.html (7973B)
1 <!DOCTYPE html> 2 <title>Service Worker: postMessage</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 promise_test(t => { 8 var script = 'resources/postmessage-worker.js'; 9 var scope = 'resources/blank.html'; 10 var registration; 11 var worker; 12 var port; 13 14 return service_worker_unregister_and_register(t, script, scope) 15 .then(r => { 16 t.add_cleanup(() => r.unregister()); 17 registration = r; 18 worker = registration.installing; 19 20 var messageChannel = new MessageChannel(); 21 port = messageChannel.port1; 22 return new Promise(resolve => { 23 port.onmessage = resolve; 24 worker.postMessage({port: messageChannel.port2}, 25 [messageChannel.port2]); 26 worker.postMessage({value: 1}); 27 worker.postMessage({value: 2}); 28 worker.postMessage({done: true}); 29 }); 30 }) 31 .then(e => { 32 assert_equals(e.data, 'Acking value: 1'); 33 return new Promise(resolve => { port.onmessage = resolve; }); 34 }) 35 .then(e => { 36 assert_equals(e.data, 'Acking value: 2'); 37 return new Promise(resolve => { port.onmessage = resolve; }); 38 }) 39 .then(e => { 40 assert_equals(e.data, 'quit'); 41 return registration.unregister(scope); 42 }); 43 }, 'postMessage to a ServiceWorker (and back via MessagePort)'); 44 45 promise_test(t => { 46 var script = 'resources/postmessage-transferables-worker.js'; 47 var scope = 'resources/blank.html'; 48 var sw = navigator.serviceWorker; 49 50 var message = 'Hello, world!'; 51 var text_encoder = new TextEncoder; 52 var text_decoder = new TextDecoder; 53 54 return service_worker_unregister_and_register(t, script, scope) 55 .then(r => { 56 t.add_cleanup(() => r.unregister()); 57 58 var ab = text_encoder.encode(message); 59 assert_equals(ab.byteLength, message.length); 60 r.installing.postMessage(ab, [ab.buffer]); 61 assert_equals(text_decoder.decode(ab), ''); 62 assert_equals(ab.byteLength, 0); 63 64 return new Promise(resolve => { sw.onmessage = resolve; }); 65 }) 66 .then(e => { 67 // Verify the integrity of the transferred array buffer. 68 assert_equals(e.data.content, message); 69 assert_equals(e.data.byteLength, message.length); 70 return new Promise(resolve => { sw.onmessage = resolve; }); 71 }) 72 .then(e => { 73 // Verify the integrity of the array buffer sent back from 74 // ServiceWorker via Client.postMessage. 75 assert_equals(text_decoder.decode(e.data), message); 76 assert_equals(e.data.byteLength, message.length); 77 return new Promise(resolve => { sw.onmessage = resolve; }); 78 }) 79 .then(e => { 80 // Verify that the array buffer on ServiceWorker is neutered. 81 assert_equals(e.data.content, ''); 82 assert_equals(e.data.byteLength, 0); 83 }); 84 }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client'); 85 86 promise_test(t => { 87 var script = 'resources/postmessage-transferables-worker.js'; 88 var scope = 'resources/blank.html'; 89 var message = 'Hello, world!'; 90 var text_encoder = new TextEncoder; 91 var text_decoder = new TextDecoder; 92 var port; 93 94 return service_worker_unregister_and_register(t, script, scope) 95 .then(r => { 96 t.add_cleanup(() => r.unregister()); 97 98 var channel = new MessageChannel; 99 port = channel.port1; 100 r.installing.postMessage(undefined, [channel.port2]); 101 102 var ab = text_encoder.encode(message); 103 assert_equals(ab.byteLength, message.length); 104 port.postMessage(ab, [ab.buffer]); 105 assert_equals(text_decoder.decode(ab), ''); 106 assert_equals(ab.byteLength, 0); 107 108 return new Promise(resolve => { port.onmessage = resolve; }); 109 }) 110 .then(e => { 111 // Verify the integrity of the transferred array buffer. 112 assert_equals(e.data.content, message); 113 assert_equals(e.data.byteLength, message.length); 114 return new Promise(resolve => { port.onmessage = resolve; }); 115 }) 116 .then(e => { 117 // Verify the integrity of the array buffer sent back from 118 // ServiceWorker via Client.postMessage. 119 assert_equals(text_decoder.decode(e.data), message); 120 assert_equals(e.data.byteLength, message.length); 121 return new Promise(resolve => { port.onmessage = resolve; }); 122 }) 123 .then(e => { 124 // Verify that the array buffer on ServiceWorker is neutered. 125 assert_equals(e.data.content, ''); 126 assert_equals(e.data.byteLength, 0); 127 }); 128 }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client' + 129 ' over MessagePort'); 130 131 promise_test(t => { 132 var script = 'resources/postmessage-dictionary-transferables-worker.js'; 133 var scope = 'resources/blank.html'; 134 var sw = navigator.serviceWorker; 135 136 var message = 'Hello, world!'; 137 var text_encoder = new TextEncoder; 138 var text_decoder = new TextDecoder; 139 140 return service_worker_unregister_and_register(t, script, scope) 141 .then(r => { 142 t.add_cleanup(() => r.unregister()); 143 144 var ab = text_encoder.encode(message); 145 assert_equals(ab.byteLength, message.length); 146 r.installing.postMessage(ab, {transfer: [ab.buffer]}); 147 assert_equals(text_decoder.decode(ab), ''); 148 assert_equals(ab.byteLength, 0); 149 150 return new Promise(resolve => { sw.onmessage = resolve; }); 151 }) 152 .then(e => { 153 // Verify the integrity of the transferred array buffer. 154 assert_equals(e.data.content, message); 155 assert_equals(e.data.byteLength, message.length); 156 return new Promise(resolve => { sw.onmessage = resolve; }); 157 }) 158 .then(e => { 159 // Verify the integrity of the array buffer sent back from 160 // ServiceWorker via Client.postMessage. 161 assert_equals(text_decoder.decode(e.data), message); 162 assert_equals(e.data.byteLength, message.length); 163 return new Promise(resolve => { sw.onmessage = resolve; }); 164 }) 165 .then(e => { 166 // Verify that the array buffer on ServiceWorker is neutered. 167 assert_equals(e.data.content, ''); 168 assert_equals(e.data.byteLength, 0); 169 }); 170 }, 'postMessage with dictionary a transferable ArrayBuffer between ServiceWorker and Client'); 171 172 promise_test(async t => { 173 const firstScript = 'resources/postmessage-echo-worker.js?one'; 174 const secondScript = 'resources/postmessage-echo-worker.js?two'; 175 const scope = 'resources/'; 176 177 const registration = await service_worker_unregister_and_register(t, firstScript, scope); 178 t.add_cleanup(() => registration.unregister()); 179 const firstWorker = registration.installing; 180 181 const messagePromise = new Promise(resolve => { 182 navigator.serviceWorker.addEventListener('message', (event) => { 183 resolve(event.data); 184 }, {once: true}); 185 }); 186 187 await wait_for_state(t, firstWorker, 'activated'); 188 await navigator.serviceWorker.register(secondScript, {scope}); 189 const secondWorker = registration.installing; 190 await wait_for_state(t, firstWorker, 'redundant'); 191 192 // postMessage() to a redundant worker should be dropped silently. 193 // Historically, this threw an exception. 194 firstWorker.postMessage('firstWorker'); 195 196 // To test somewhat that it was not received, send a message to another 197 // worker and check that we get a reply for that one. 198 secondWorker.postMessage('secondWorker'); 199 const data = await messagePromise; 200 assert_equals(data, 'secondWorker'); 201 }, 'postMessage to a redundant worker'); 202 </script>