|
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 const scrollbarPref = "layout.testing.overlay-scrollbars.always-visible"; |
|
16 const bfCacheEnabledPref = "browser.sessionhistory.cache_subframes"; |
|
17 const bfCacheDepthPref = "browser.sessionhistory.max_total_viewers"; |
|
18 const bfCacheDepth = 10; |
|
19 |
|
20 const frameRelativeURL = "multi_sharedWorker_frame.html"; |
|
21 const storedData = "0123456789abcdefghijklmnopqrstuvwxyz"; |
|
22 |
|
23 let testGenerator = (function() { |
|
24 SimpleTest.waitForExplicitFinish(); |
|
25 |
|
26 if (!SpecialPowers.getBoolPref(swPref)) { |
|
27 ok(!("SharedWorker" in window), "No SharedWorker without pref set"); |
|
28 } |
|
29 |
|
30 // Enable SharedWorkers and force scrollbar to always be shown. The |
|
31 // scrollbar setting is necessary to avoid the fade-in/fade-out from |
|
32 // evicting our document from the BF cache below. If bug 1049277 |
|
33 // is fixed, then we can stop setting the scrollbar pref here. |
|
34 SpecialPowers.pushPrefEnv({ set: [[swPref, true], |
|
35 [scrollbarPref, true]] }, |
|
36 sendToGenerator); |
|
37 yield undefined; |
|
38 |
|
39 window.addEventListener("message", function(event) { |
|
40 if (typeof(event.data) == "string") { |
|
41 info(event.data); |
|
42 } else { |
|
43 sendToGenerator(event); |
|
44 } |
|
45 }); |
|
46 |
|
47 let frame = document.getElementById("frame"); |
|
48 frame.src = frameRelativeURL; |
|
49 frame.onload = sendToGenerator; |
|
50 |
|
51 yield undefined; |
|
52 |
|
53 frame = frame.contentWindow; |
|
54 frame.postMessage({ command: "retrieve" }, "*"); |
|
55 |
|
56 let event = yield undefined; |
|
57 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
58 is(event.source, frame, "Correct window got the event"); |
|
59 is(event.data.type, "result", "Got a result message"); |
|
60 is(event.data.data, undefined, "No data stored yet"); |
|
61 |
|
62 frame.postMessage({ command: "store", data: storedData }, "*"); |
|
63 frame.postMessage({ command: "retrieve" }, "*"); |
|
64 |
|
65 event = yield undefined; |
|
66 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
67 is(event.source, frame, "Correct window got the event"); |
|
68 is(event.data.type, "result", "Got a result message"); |
|
69 is(event.data.data, storedData, "Got stored data"); |
|
70 |
|
71 // Navigate when the bfcache is disabled. |
|
72 info("Navigating to about:blank"); |
|
73 let frame = document.getElementById("frame"); |
|
74 frame.onload = sendToGenerator; |
|
75 frame.src = "about:blank"; |
|
76 frame.contentWindow.document.body.offsetTop; |
|
77 |
|
78 yield undefined; |
|
79 |
|
80 info("Navigating to " + frameRelativeURL); |
|
81 frame.src = frameRelativeURL; |
|
82 frame.contentWindow.document.body.offsetTop; |
|
83 |
|
84 yield undefined; |
|
85 |
|
86 frame = frame.contentWindow; |
|
87 frame.postMessage({ command: "retrieve" }, "*"); |
|
88 |
|
89 let event = yield undefined; |
|
90 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
91 is(event.source, frame, "Correct window got the event"); |
|
92 is(event.data.type, "result", "Got a result message"); |
|
93 is(event.data.data, undefined, "No data stored"); |
|
94 |
|
95 frame.postMessage({ command: "store", data: storedData }, "*"); |
|
96 frame.postMessage({ command: "retrieve" }, "*"); |
|
97 |
|
98 event = yield undefined; |
|
99 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
100 is(event.source, frame, "Correct window got the event"); |
|
101 is(event.data.type, "result", "Got a result message"); |
|
102 is(event.data.data, storedData, "Got stored data"); |
|
103 |
|
104 info("Enabling '" + bfCacheEnabledPref + "' pref"); |
|
105 SpecialPowers.pushPrefEnv({ set: [[bfCacheEnabledPref, true], |
|
106 [bfCacheDepthPref, bfCacheDepth]] }, |
|
107 sendToGenerator); |
|
108 yield undefined; |
|
109 |
|
110 // Navigate when the bfcache is enabled. |
|
111 let frame = document.getElementById("frame"); |
|
112 frame.onload = sendToGenerator; |
|
113 |
|
114 info("Navigating to about:blank"); |
|
115 frame.src = "about:blank"; |
|
116 frame.contentWindow.document.body.offsetTop; |
|
117 |
|
118 yield undefined; |
|
119 |
|
120 for (let i = 0; i < 3; i++) { |
|
121 info("Running GC"); |
|
122 SpecialPowers.exactGC(window, sendToGenerator); |
|
123 yield undefined; |
|
124 |
|
125 info("Waiting the event queue to clear"); |
|
126 SpecialPowers.executeSoon(sendToGenerator); |
|
127 yield undefined; |
|
128 } |
|
129 |
|
130 info("Navigating to " + frameRelativeURL); |
|
131 frame.src = frameRelativeURL; |
|
132 frame.contentWindow.document.body.offsetTop; |
|
133 |
|
134 yield undefined; |
|
135 |
|
136 frame = frame.contentWindow; |
|
137 frame.postMessage({ command: "retrieve" }, "*"); |
|
138 |
|
139 let event = yield undefined; |
|
140 ok(event instanceof MessageEvent, "Got a MessageEvent"); |
|
141 is(event.source, frame, "Correct window got the event"); |
|
142 is(event.data.type, "result", "Got a result message"); |
|
143 is(event.data.data, storedData, "Still have data stored"); |
|
144 |
|
145 info("Resetting '" + bfCacheEnabledPref + "' pref"); |
|
146 SpecialPowers.popPrefEnv(sendToGenerator); |
|
147 yield undefined; |
|
148 |
|
149 window.removeEventListener("message", sendToGenerator); |
|
150 |
|
151 SimpleTest.finish(); |
|
152 yield undefined; |
|
153 })(); |
|
154 |
|
155 let sendToGenerator = testGenerator.send.bind(testGenerator); |
|
156 |
|
157 </script> |
|
158 </head> |
|
159 <body onload="testGenerator.next();"> |
|
160 <iframe id="frame"></iframe> |
|
161 </body> |
|
162 </html> |