|
1 <!-- |
|
2 Any copyright is dedicated to the Public Domain. |
|
3 http://creativecommons.org/publicdomain/zero/1.0/ |
|
4 --> |
|
5 <!DOCTYPE HTML> |
|
6 <html> |
|
7 <head> |
|
8 <title>Test for SharedWorker</title> |
|
9 <script src="/tests/SimpleTest/SimpleTest.js"></script> |
|
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"> |
|
11 <script class="testbody" type="text/javascript;version=1.7"> |
|
12 "use strict"; |
|
13 |
|
14 const swPref = "dom.workers.sharedWorkers.enabled"; |
|
15 |
|
16 const basePath = |
|
17 location.pathname.substring(0, |
|
18 location.pathname.lastIndexOf("/") + 1); |
|
19 const baseURL = location.origin + basePath; |
|
20 |
|
21 const frameRelativeURL = "multi_sharedWorker_frame.html"; |
|
22 const frameAbsoluteURL = baseURL + frameRelativeURL; |
|
23 const workerAbsoluteURL = |
|
24 baseURL + "multi_sharedWorker_sharedWorker.js"; |
|
25 |
|
26 const storedData = "0123456789abcdefghijklmnopqrstuvwxyz"; |
|
27 const errorMessage = "Error: Expected"; |
|
28 const errorLineno = 34; |
|
29 |
|
30 let testGenerator = (function() { |
|
31 SimpleTest.waitForExplicitFinish(); |
|
32 |
|
33 if (!SpecialPowers.getBoolPref(swPref)) { |
|
34 ok(!("SharedWorker" in window), "No SharedWorker without pref set"); |
|
35 } |
|
36 |
|
37 SpecialPowers.pushPrefEnv({ set: [[swPref, true]] }, sendToGenerator); |
|
38 yield undefined; |
|
39 |
|
40 window.addEventListener("message", function(event) { |
|
41 if (typeof(event.data) == "string") { |
|
42 info(event.data); |
|
43 } else { |
|
44 sendToGenerator(event); |
|
45 } |
|
46 }); |
|
47 |
|
48 let frame1 = document.getElementById("frame1"); |
|
49 frame1.src = frameRelativeURL; |
|
50 frame1.onload = sendToGenerator; |
|
51 |
|
52 yield undefined; |
|
53 |
|
54 frame1 = frame1.contentWindow; |
|
55 |
|
56 let frame2 = document.getElementById("frame2"); |
|
57 frame2.src = frameAbsoluteURL; |
|
58 frame2.onload = sendToGenerator; |
|
59 |
|
60 yield undefined; |
|
61 |
|
62 frame2 = frame2.contentWindow; |
|
63 |
|
64 let data = { |
|
65 command: "start" |
|
66 }; |
|
67 |
|
68 frame1.postMessage(data, "*"); |
|
69 frame2.postMessage(data, "*"); |
|
70 |
|
71 let event = yield undefined; |
|
72 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
73 is(event.source, frame1, "First window got the event"); |
|
74 is(event.data.type, "connect", "Got a connect message"); |
|
75 |
|
76 data = { |
|
77 command: "retrieve" |
|
78 }; |
|
79 frame1.postMessage(data, "*"); |
|
80 |
|
81 event = yield undefined; |
|
82 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
83 is(event.source, frame1, "First window got the event"); |
|
84 is(event.data.type, "result", "Got a result message"); |
|
85 is(event.data.data, undefined, "No data stored yet"); |
|
86 |
|
87 frame2.postMessage(data, "*"); |
|
88 |
|
89 event = yield undefined; |
|
90 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
91 is(event.source, frame2, "Second window got the event"); |
|
92 is(event.data.type, "result", "Got a result message"); |
|
93 is(event.data.data, undefined, "No data stored yet"); |
|
94 |
|
95 data = { |
|
96 command: "store", |
|
97 data: storedData |
|
98 }; |
|
99 frame2.postMessage(data, "*"); |
|
100 |
|
101 data = { |
|
102 command: "retrieve" |
|
103 }; |
|
104 frame1.postMessage(data, "*"); |
|
105 |
|
106 event = yield undefined; |
|
107 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
108 is(event.source, frame1, "First window got the event"); |
|
109 is(event.data.type, "result", "Got a result message"); |
|
110 is(event.data.data, storedData, "Got stored data"); |
|
111 |
|
112 // This will generate two MessageEvents, one for each window. |
|
113 let sawFrame1Error = false; |
|
114 let sawFrame2Error = false; |
|
115 |
|
116 data = { |
|
117 command: "error" |
|
118 }; |
|
119 frame1.postMessage(data, "*"); |
|
120 |
|
121 // First event. |
|
122 event = yield undefined; |
|
123 |
|
124 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
125 is(event.data.type, "worker-error", "Got an error message"); |
|
126 is(event.data.message, errorMessage, "Got correct error message"); |
|
127 is(event.data.filename, workerAbsoluteURL, "Got correct filename"); |
|
128 is(event.data.lineno, errorLineno, "Got correct lineno"); |
|
129 if (event.source == frame1) { |
|
130 is(sawFrame1Error, false, "Haven't seen error for frame1 yet"); |
|
131 sawFrame1Error = true; |
|
132 } else if (event.source == frame2) { |
|
133 is(sawFrame2Error, false, "Haven't seen error for frame1 yet"); |
|
134 sawFrame2Error = true; |
|
135 } else { |
|
136 ok(false, "Saw error from unknown window"); |
|
137 } |
|
138 |
|
139 // Second event |
|
140 event = yield undefined; |
|
141 |
|
142 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
143 is(event.data.type, "worker-error", "Got an error message"); |
|
144 is(event.data.message, errorMessage, "Got correct error message"); |
|
145 is(event.data.filename, workerAbsoluteURL, "Got correct filename"); |
|
146 is(event.data.lineno, errorLineno, "Got correct lineno"); |
|
147 if (event.source == frame1) { |
|
148 is(sawFrame1Error, false, "Haven't seen error for frame1 yet"); |
|
149 sawFrame1Error = true; |
|
150 } else if (event.source == frame2) { |
|
151 is(sawFrame2Error, false, "Haven't seen error for frame1 yet"); |
|
152 sawFrame2Error = true; |
|
153 } else { |
|
154 ok(false, "Saw error from unknown window"); |
|
155 } |
|
156 |
|
157 is(sawFrame1Error, true, "Saw error for frame1"); |
|
158 is(sawFrame2Error, true, "Saw error for frame2"); |
|
159 |
|
160 // This will generate two MessageEvents, one for each window. |
|
161 sawFrame1Error = false; |
|
162 sawFrame2Error = false; |
|
163 |
|
164 data = { |
|
165 command: "error" |
|
166 }; |
|
167 frame1.postMessage(data, "*"); |
|
168 |
|
169 // First event. |
|
170 event = yield undefined; |
|
171 |
|
172 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
173 is(event.data.type, "error", "Got an error message"); |
|
174 is(event.data.message, errorMessage, "Got correct error message"); |
|
175 is(event.data.filename, workerAbsoluteURL, "Got correct filename"); |
|
176 is(event.data.lineno, errorLineno, "Got correct lineno"); |
|
177 is(event.data.isErrorEvent, true, "Frame got an ErrorEvent"); |
|
178 if (event.source == frame1) { |
|
179 is(sawFrame1Error, false, "Haven't seen error for frame1 yet"); |
|
180 sawFrame1Error = true; |
|
181 } else if (event.source == frame2) { |
|
182 is(sawFrame2Error, false, "Haven't seen error for frame1 yet"); |
|
183 sawFrame2Error = true; |
|
184 } else { |
|
185 ok(false, "Saw error from unknown window"); |
|
186 } |
|
187 |
|
188 // Second event |
|
189 event = yield undefined; |
|
190 |
|
191 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
192 is(event.data.type, "error", "Got an error message"); |
|
193 is(event.data.message, errorMessage, "Got correct error message"); |
|
194 is(event.data.filename, workerAbsoluteURL, "Got correct filename"); |
|
195 is(event.data.lineno, errorLineno, "Got correct lineno"); |
|
196 is(event.data.isErrorEvent, true, "Frame got an ErrorEvent"); |
|
197 if (event.source == frame1) { |
|
198 is(sawFrame1Error, false, "Haven't seen error for frame1 yet"); |
|
199 sawFrame1Error = true; |
|
200 } else if (event.source == frame2) { |
|
201 is(sawFrame2Error, false, "Haven't seen error for frame1 yet"); |
|
202 sawFrame2Error = true; |
|
203 } else { |
|
204 ok(false, "Saw error from unknown window"); |
|
205 } |
|
206 |
|
207 is(sawFrame1Error, true, "Saw error for frame1"); |
|
208 is(sawFrame2Error, true, "Saw error for frame2"); |
|
209 |
|
210 // Try a shared worker in a different origin. |
|
211 frame1 = document.getElementById("frame1"); |
|
212 frame1.src = "http://example.org" + basePath + frameRelativeURL; |
|
213 frame1.onload = sendToGenerator; |
|
214 yield undefined; |
|
215 |
|
216 frame1 = frame1.contentWindow; |
|
217 |
|
218 data = { |
|
219 command: "retrieve" |
|
220 }; |
|
221 frame1.postMessage(data, "*"); |
|
222 |
|
223 event = yield undefined; |
|
224 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
225 is(event.source, frame1, "First window got the event"); |
|
226 is(event.data.type, "result", "Got a result message"); |
|
227 is(event.data.data, undefined, "No data stored yet"); |
|
228 |
|
229 frame2.postMessage(data, "*"); |
|
230 |
|
231 event = yield undefined; |
|
232 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
233 is(event.source, frame2, "First window got the event"); |
|
234 is(event.data.type, "result", "Got a result message"); |
|
235 is(event.data.data, storedData, "Got stored data"); |
|
236 |
|
237 window.removeEventListener("message", sendToGenerator); |
|
238 |
|
239 SimpleTest.finish(); |
|
240 yield undefined; |
|
241 })(); |
|
242 |
|
243 let sendToGenerator = testGenerator.send.bind(testGenerator); |
|
244 |
|
245 </script> |
|
246 </head> |
|
247 <body onload="testGenerator.next();"> |
|
248 <iframe id="frame1"></iframe> |
|
249 <iframe id="frame2"></iframe> |
|
250 </body> |
|
251 </html> |