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 |