| OLD | NEW |
| (Empty) |
| 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.js"></script> | |
| 6 <script> | |
| 7 | |
| 8 promise_test(t => { | |
| 9 var script = 'resources/postmessage-worker.js'; | |
| 10 var scope = 'resources/blank.html'; | |
| 11 var registration; | |
| 12 var worker; | |
| 13 var port; | |
| 14 | |
| 15 return service_worker_unregister_and_register(t, script, scope) | |
| 16 .then(r => { | |
| 17 add_completion_callback(() => r.unregister()); | |
| 18 registration = r; | |
| 19 worker = registration.installing; | |
| 20 | |
| 21 var messageChannel = new MessageChannel(); | |
| 22 port = messageChannel.port1; | |
| 23 return new Promise(resolve => { | |
| 24 port.onmessage = resolve; | |
| 25 worker.postMessage({port: messageChannel.port2}, | |
| 26 [messageChannel.port2]); | |
| 27 worker.postMessage({value: 1}); | |
| 28 worker.postMessage({value: 2}); | |
| 29 worker.postMessage({done: true}); | |
| 30 }); | |
| 31 }) | |
| 32 .then(e => { | |
| 33 assert_equals(e.data, 'Acking value: 1'); | |
| 34 return new Promise(resolve => { port.onmessage = resolve; }); | |
| 35 }) | |
| 36 .then(e => { | |
| 37 assert_equals(e.data, 'Acking value: 2'); | |
| 38 return new Promise(resolve => { port.onmessage = resolve; }); | |
| 39 }) | |
| 40 .then(e => { | |
| 41 assert_equals(e.data, 'quit'); | |
| 42 return registration.unregister(scope); | |
| 43 }) | |
| 44 .then(() => { return wait_for_state(t, worker, 'redundant'); }) | |
| 45 .then(() => { | |
| 46 assert_equals(worker.state, 'redundant'); | |
| 47 assert_throws( | |
| 48 {name:'InvalidStateError'}, | |
| 49 function() { worker.postMessage(''); }, | |
| 50 'Calling postMessage on a redundant ServiceWorker should ' + | |
| 51 'throw InvalidStateError.'); | |
| 52 }); | |
| 53 }, 'postMessage to a ServiceWorker (and back via MessagePort)'); | |
| 54 | |
| 55 promise_test(t => { | |
| 56 var script = 'resources/postmessage-transferables-worker.js'; | |
| 57 var scope = 'resources/blank.html'; | |
| 58 var sw = navigator.serviceWorker; | |
| 59 | |
| 60 var message = 'Hello, world!'; | |
| 61 var text_encoder = new TextEncoder; | |
| 62 var text_decoder = new TextDecoder; | |
| 63 | |
| 64 return service_worker_unregister_and_register(t, script, scope) | |
| 65 .then(r => { | |
| 66 add_completion_callback(() => r.unregister()); | |
| 67 | |
| 68 var ab = text_encoder.encode(message); | |
| 69 assert_equals(ab.byteLength, message.length); | |
| 70 r.installing.postMessage(ab, [ab.buffer]); | |
| 71 assert_equals(text_decoder.decode(ab), ''); | |
| 72 assert_equals(ab.byteLength, 0); | |
| 73 | |
| 74 return new Promise(resolve => { sw.onmessage = resolve; }); | |
| 75 }) | |
| 76 .then(e => { | |
| 77 // Verify the integrity of the transferred array buffer. | |
| 78 assert_equals(e.data.content, message); | |
| 79 assert_equals(e.data.byteLength, message.length); | |
| 80 return new Promise(resolve => { sw.onmessage = resolve; }); | |
| 81 }) | |
| 82 .then(e => { | |
| 83 // Verify the integrity of the array buffer sent back from | |
| 84 // ServiceWorker via Client.postMessage. | |
| 85 assert_equals(text_decoder.decode(e.data), message); | |
| 86 assert_equals(e.data.byteLength, message.length); | |
| 87 return new Promise(resolve => { sw.onmessage = resolve; }); | |
| 88 }) | |
| 89 .then(e => { | |
| 90 // Verify that the array buffer on ServiceWorker is neutered. | |
| 91 assert_equals(e.data.content, ''); | |
| 92 assert_equals(e.data.byteLength, 0); | |
| 93 }); | |
| 94 }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client'); | |
| 95 | |
| 96 promise_test(t => { | |
| 97 var script = 'resources/postmessage-transferables-worker.js'; | |
| 98 var scope = 'resources/blank.html'; | |
| 99 var message = 'Hello, world!'; | |
| 100 var text_encoder = new TextEncoder; | |
| 101 var text_decoder = new TextDecoder; | |
| 102 var port; | |
| 103 | |
| 104 return service_worker_unregister_and_register(t, script, scope) | |
| 105 .then(r => { | |
| 106 add_completion_callback(() => r.unregister()); | |
| 107 | |
| 108 var channel = new MessageChannel; | |
| 109 port = channel.port1; | |
| 110 r.installing.postMessage(undefined, [channel.port2]); | |
| 111 | |
| 112 var ab = text_encoder.encode(message); | |
| 113 assert_equals(ab.byteLength, message.length); | |
| 114 port.postMessage(ab, [ab.buffer]); | |
| 115 assert_equals(text_decoder.decode(ab), ''); | |
| 116 assert_equals(ab.byteLength, 0); | |
| 117 | |
| 118 return new Promise(resolve => { port.onmessage = resolve; }); | |
| 119 }) | |
| 120 .then(e => { | |
| 121 // Verify the integrity of the transferred array buffer. | |
| 122 assert_equals(e.data.content, message); | |
| 123 assert_equals(e.data.byteLength, message.length); | |
| 124 return new Promise(resolve => { port.onmessage = resolve; }); | |
| 125 }) | |
| 126 .then(e => { | |
| 127 // Verify the integrity of the array buffer sent back from | |
| 128 // ServiceWorker via Client.postMessage. | |
| 129 assert_equals(text_decoder.decode(e.data), message); | |
| 130 assert_equals(e.data.byteLength, message.length); | |
| 131 return new Promise(resolve => { port.onmessage = resolve; }); | |
| 132 }) | |
| 133 .then(e => { | |
| 134 // Verify that the array buffer on ServiceWorker is neutered. | |
| 135 assert_equals(e.data.content, ''); | |
| 136 assert_equals(e.data.byteLength, 0); | |
| 137 }); | |
| 138 }, 'postMessage a transferable ArrayBuffer between ServiceWorker and Client' + | |
| 139 ' over MessagePort'); | |
| 140 | |
| 141 </script> | |
| OLD | NEW |