OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <title>ServiceWorkerGlobalScope: ExtendableMessageEvent</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(function(t) { | |
9 var script = 'resources/extendable-message-event-constructor-worker.js'; | |
10 var scope = 'resources/scope/extendable-message-event-constructor'; | |
11 var registration; | |
12 | |
13 return service_worker_unregister_and_register(t, script, scope) | |
14 .then(function(r) { | |
15 registration = r; | |
16 add_completion_callback(function() { registration.unregister(); }); | |
17 return wait_for_state(t, registration.installing, 'activated'); | |
18 }) | |
19 .then(function() { | |
20 var saw_message = new Promise(function(resolve) { | |
21 navigator.serviceWorker.onmessage = | |
22 function(event) { resolve(event.data); }; | |
23 }); | |
24 registration.active.postMessage(''); | |
25 return saw_message; | |
26 }) | |
27 .then(function(result) { | |
28 assert_equals(result, 'success'); | |
29 }); | |
30 }, 'Test the constructor for ExtendableMessageEvent'); | |
31 | |
32 promise_test(function(t) { | |
33 var script = 'resources/extendable-message-event-worker.js'; | |
34 var scope = 'resources/scope/extendable-message-event-from-toplevel'; | |
35 var registration; | |
36 | |
37 return service_worker_unregister_and_register(t, script, scope) | |
38 .then(function(r) { | |
39 registration = r; | |
40 add_completion_callback(function() { registration.unregister(); }); | |
41 return wait_for_state(t, registration.installing, 'activated'); | |
42 }) | |
43 .then(function() { | |
44 var saw_message = new Promise(function(resolve) { | |
45 navigator.serviceWorker.onmessage = | |
46 function(event) { resolve(event.data); } | |
47 }); | |
48 var channel = new MessageChannel; | |
49 registration.active.postMessage('', [channel.port1]); | |
50 return saw_message; | |
51 }) | |
52 .then(function(results) { | |
53 var expected_results = [ | |
54 'Client message: [object ExtendableMessageEvent]', | |
55 ' event.origin: ' + location.origin, | |
56 ' event.lastEventId: ', | |
57 ' event.source: [object WindowClient]', | |
58 ' event.source.url: ' + location.href, | |
59 ' event.source.frameType: top-level', | |
60 ' event.source.visibilityState: visible', | |
61 ' event.source.focused: true', | |
62 ' event.ports: [object MessagePort]', | |
63 ]; | |
64 assert_array_equals(results, expected_results); | |
65 }); | |
66 }, 'Post an extendable message from a top-level client'); | |
67 | |
68 promise_test(function(t) { | |
69 var script = 'resources/extendable-message-event-worker.js'; | |
70 var scope = 'resources/scope/extendable-message-event-from-nested'; | |
71 var frame; | |
72 | |
73 return service_worker_unregister_and_register(t, script, scope) | |
74 .then(function(registration) { | |
75 add_completion_callback(function() { registration.unregister(); }); | |
76 return wait_for_state(t, registration.installing, 'activated'); | |
77 }) | |
78 .then(function() { return with_iframe(scope); }) | |
79 .then(function(f) { | |
80 frame = f; | |
81 add_completion_callback(function() { frame.remove(); }); | |
82 var saw_message = new Promise(function(resolve) { | |
83 frame.contentWindow.navigator.serviceWorker.onmessage = | |
84 function(event) { resolve(event.data); } | |
85 }); | |
86 f.contentWindow.navigator.serviceWorker.controller.postMessage(''); | |
87 return saw_message; | |
88 }) | |
89 .then(function(results) { | |
90 var expected_results = [ | |
91 'Client message: [object ExtendableMessageEvent]', | |
92 ' event.origin: ' + frame.contentWindow.location.origin, | |
93 ' event.lastEventId: ', | |
94 ' event.source: [object WindowClient]', | |
95 ' event.source.url: ' + frame.contentWindow.location.href, | |
96 ' event.source.frameType: nested', | |
97 ' event.source.visibilityState: visible', | |
98 ' event.source.focused: false', | |
99 ' event.ports: ', | |
100 ]; | |
101 assert_array_equals(results, expected_results); | |
102 }); | |
103 }, 'Post an extendable message from a nested client'); | |
104 | |
105 promise_test(function(t) { | |
106 var script = 'resources/extendable-message-event-loopback-worker.js'; | |
107 var scope = 'resources/scope/extendable-message-event-loopback'; | |
108 var registration; | |
109 | |
110 return service_worker_unregister_and_register(t, script, scope) | |
111 .then(function(r) { | |
112 registration = r; | |
113 add_completion_callback(function() { registration.unregister(); }); | |
114 return wait_for_state(t, registration.installing, 'activated'); | |
115 }) | |
116 .then(function() { | |
117 var results = []; | |
118 var saw_message = new Promise(function(resolve) { | |
119 navigator.serviceWorker.onmessage = function(event) { | |
120 switch (event.data.type) { | |
121 case 'record': | |
122 Array.prototype.push.apply(results, event.data.results); | |
123 break; | |
124 case 'finish': | |
125 resolve(results); | |
126 break; | |
127 } | |
128 }; | |
129 }); | |
130 registration.active.postMessage({type: 'start'}); | |
131 return saw_message; | |
132 }) | |
133 .then(function(results) { | |
134 var expected_results = [ | |
135 '1st loopback: [object ExtendableMessageEvent]', | |
136 ' event.origin: ' + location.origin, | |
137 ' event.lastEventId: ', | |
138 ' event.source: [object ServiceWorker]', | |
139 ' event.source.scriptURL: ' + normalizeURL(script), | |
140 ' event.source.state: activated', | |
141 ' event.ports: ', | |
142 '2nd loopback: [object ExtendableMessageEvent]', | |
143 ' event.origin: ' + location.origin, | |
144 ' event.lastEventId: ', | |
145 ' event.source: [object ServiceWorker]', | |
146 ' event.source.scriptURL: ' + normalizeURL(script), | |
147 ' event.source.state: activated', | |
148 ' event.ports: ', | |
149 ]; | |
150 assert_array_equals(results, expected_results); | |
151 }); | |
152 }, 'Post loopback extendable messages'); | |
153 | |
154 promise_test(function(t) { | |
155 var script1 = 'resources/extendable-message-event-ping-worker.js'; | |
156 var script2 = 'resources/extendable-message-event-pong-worker.js'; | |
157 var scope = 'resources/scope/extendable-message-event-pingpong'; | |
158 var registration; | |
159 | |
160 return service_worker_unregister_and_register(t, script1, scope) | |
161 .then(function(r) { | |
162 registration = r; | |
163 add_completion_callback(function() { registration.unregister(); }); | |
164 return wait_for_state(t, registration.installing, 'activated'); | |
165 }) | |
166 .then(function() { | |
167 // A controlled frame is necessary for keeping a waiting worker. | |
168 return with_iframe(scope); | |
169 }) | |
170 .then(function(frame) { | |
171 add_completion_callback(function() { frame.remove(); }); | |
172 return navigator.serviceWorker.register(script2, {scope: scope}); | |
173 }) | |
174 .then(function(r) { | |
175 return wait_for_state(t, r.installing, 'installed'); | |
176 }) | |
177 .then(function() { | |
178 var results = []; | |
179 var saw_message = new Promise(function(resolve) { | |
180 navigator.serviceWorker.onmessage = function(event) { | |
181 switch (event.data.type) { | |
182 case 'record': | |
183 Array.prototype.push.apply(results, event.data.results); | |
184 break; | |
185 case 'finish': | |
186 resolve(results); | |
187 break; | |
188 } | |
189 }; | |
190 }); | |
191 registration.active.postMessage({type: 'start'}); | |
192 return saw_message; | |
193 }) | |
194 .then(function(results) { | |
195 var expected_results = [ | |
196 'Ping message: [object ExtendableMessageEvent]', | |
197 ' event.origin: ' + location.origin, | |
198 ' event.lastEventId: ', | |
199 ' event.source: [object ServiceWorker]', | |
200 ' event.source.scriptURL: ' + normalizeURL(script1), | |
201 ' event.source.state: activated', | |
202 ' event.ports: ', | |
203 'Pong message: [object ExtendableMessageEvent]', | |
204 ' event.origin: ' + location.origin, | |
205 ' event.lastEventId: ', | |
206 ' event.source: [object ServiceWorker]', | |
207 ' event.source.scriptURL: ' + normalizeURL(script2), | |
208 ' event.source.state: installed', | |
209 ' event.ports: ', | |
210 ]; | |
211 assert_array_equals(results, expected_results); | |
212 }); | |
213 }, 'Post extendable messages among service workers'); | |
214 | |
215 </script> | |
OLD | NEW |