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