OLD | NEW |
---|---|
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
falken
2017/05/15 05:10:33
It looks like the chromium-side postmessage.html w
mike3
2017/05/15 20:07:45
Done.
| |
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 add_completion_callback(() => 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 add_completion_callback(() => r.unregister()); |
falken
2017/05/15 05:10:33
t.add_cleanup?
mike3
2017/05/15 20:07:45
Done.
| |
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 add_completion_callback(() => 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 |