|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 waitForExplicitFinish(); |
|
8 |
|
9 let kUrlSource = "http://mochi.test:8888/"; |
|
10 let kDataSource = "data:text/html,"; |
|
11 |
|
12 let gOldPref; |
|
13 let gWin, gWin1, gWin2; |
|
14 let gTab, gTab1, gTab2; |
|
15 let gLock, gLock1, gLock2; |
|
16 let gCurStepIndex = -1; |
|
17 let gSteps = [ |
|
18 function basicWakeLock() { |
|
19 gTab = gBrowser.addTab(kUrlSource); |
|
20 gWin = gBrowser.getBrowserForTab(gTab).contentWindow; |
|
21 let browser = gBrowser.getBrowserForTab(gTab); |
|
22 |
|
23 browser.addEventListener("load", function onLoad(e) { |
|
24 browser.removeEventListener("load", onLoad, true); |
|
25 let nav = gWin.navigator; |
|
26 let power = nav.mozPower; |
|
27 gLock = nav.requestWakeLock("test"); |
|
28 |
|
29 ok(gLock != null, |
|
30 "navigator.requestWakeLock should return a wake lock"); |
|
31 is(gLock.topic, "test", |
|
32 "wake lock should remember the locked topic"); |
|
33 isnot(power.getWakeLockState("test"), "unlocked", |
|
34 "topic is locked"); |
|
35 |
|
36 gLock.unlock(); |
|
37 |
|
38 is(gLock.topic, "test", |
|
39 "wake lock should remember the locked topic even after unlock"); |
|
40 is(power.getWakeLockState("test"), "unlocked", |
|
41 "topic is unlocked"); |
|
42 |
|
43 try { |
|
44 gLock.unlock(); |
|
45 ok(false, "Should have thrown an error."); |
|
46 } catch (e) { |
|
47 is(e.name, "InvalidStateError", "double unlock should throw InvalidStateError"); |
|
48 is(e.code, DOMException.INVALID_STATE_ERR, "double unlock should throw InvalidStateError"); |
|
49 } |
|
50 |
|
51 gBrowser.removeTab(gTab); |
|
52 |
|
53 executeSoon(runNextStep); |
|
54 }, true); |
|
55 }, |
|
56 function multiWakeLock() { |
|
57 gTab = gBrowser.addTab(kUrlSource); |
|
58 gWin = gBrowser.getBrowserForTab(gTab).contentWindow; |
|
59 let browser = gBrowser.getBrowserForTab(gTab); |
|
60 |
|
61 browser.addEventListener("load", function onLoad(e) { |
|
62 browser.removeEventListener("load", onLoad, true); |
|
63 let nav = gWin.navigator; |
|
64 let power = nav.mozPower; |
|
65 let count = 0; |
|
66 power.addWakeLockListener(function onWakeLockEvent(topic, state) { |
|
67 is(topic, "test", "gLock topic is test"); |
|
68 ok(state == "unlocked" || |
|
69 state == "locked-foreground" || |
|
70 state == "locked-background", |
|
71 "wake lock should be either locked or unlocked"); |
|
72 count++; |
|
73 if (state == "locked-foreground" || |
|
74 state == "locked-background") { |
|
75 is(count, 1, |
|
76 "wake lock should be locked and the listener should only fire once"); |
|
77 } |
|
78 if (state == "unlocked") { |
|
79 is(count, 2, |
|
80 "wake lock should be unlocked and the listener should only fire once"); |
|
81 |
|
82 ok(power.getWakeLockState("test") == "unlocked", |
|
83 "topic is unlocked"); |
|
84 power.removeWakeLockListener(onWakeLockEvent); |
|
85 gBrowser.removeTab(gTab); |
|
86 executeSoon(runNextStep); |
|
87 } |
|
88 }); |
|
89 |
|
90 gLock1 = nav.requestWakeLock("test"); |
|
91 isnot(power.getWakeLockState("test"), "unlocked", |
|
92 "topic is locked"); |
|
93 |
|
94 gLock2 = nav.requestWakeLock("test"); |
|
95 isnot(power.getWakeLockState("test"), "unlocked", |
|
96 "topic is locked"); |
|
97 |
|
98 gLock1.unlock(); |
|
99 isnot(power.getWakeLockState("test"), "unlocked", |
|
100 "topic is locked"); |
|
101 |
|
102 gLock2.unlock(); |
|
103 }, true); |
|
104 }, |
|
105 function crossTabWakeLock1() { |
|
106 gTab1 = gBrowser.addTab(kUrlSource); |
|
107 gWin1 = gBrowser.getBrowserForTab(gTab1).contentWindow; |
|
108 gTab2 = gBrowser.addTab(kUrlSource); |
|
109 gWin2 = gBrowser.getBrowserForTab(gTab2).contentWindow; |
|
110 |
|
111 gBrowser.selectedTab = gTab1; |
|
112 let browser = gBrowser.getBrowserForTab(gTab2); |
|
113 |
|
114 browser.addEventListener("load", function onLoad(e) { |
|
115 browser.removeEventListener("load", onLoad, true); |
|
116 gLock2 = gWin2.navigator.requestWakeLock("test"); |
|
117 is(gWin2.document.hidden, true, |
|
118 "window is background") |
|
119 is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-background", |
|
120 "wake lock is background"); |
|
121 let doc2 = gWin2.document; |
|
122 doc2.addEventListener("visibilitychange", function onVisibilityChange(e) { |
|
123 if (!doc2.hidden) { |
|
124 doc2.removeEventListener("visibilitychange", onVisibilityChange); |
|
125 executeSoon(runNextStep); |
|
126 } |
|
127 }); |
|
128 gBrowser.selectedTab = gTab2; |
|
129 }, true); |
|
130 }, |
|
131 function crossTabWakeLock2() { |
|
132 is(gWin2.document.hidden, false, |
|
133 "window is foreground") |
|
134 is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-foreground", |
|
135 "wake lock is foreground"); |
|
136 gWin2.addEventListener("pagehide", function onPageHide(e) { |
|
137 gWin2.removeEventListener("pagehide", onPageHide, true); |
|
138 executeSoon(runNextStep); |
|
139 }, true); |
|
140 gWin2.addEventListener("pageshow", function onPageShow(e) { |
|
141 gWin2.removeEventListener("pageshow", onPageShow, true); |
|
142 executeSoon(runNextStep); |
|
143 }, true); |
|
144 gWin2.location = kDataSource; |
|
145 }, |
|
146 function crossTabWakeLock3() { |
|
147 is(gWin1.navigator.mozPower.getWakeLockState("test"), "unlocked", |
|
148 "wake lock should auto-unlock when page is unloaded"); |
|
149 gWin2.back(); |
|
150 // runNextStep called in onPageShow |
|
151 }, |
|
152 function crossTabWakeLock4() { |
|
153 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", |
|
154 "wake lock should auto-reacquire when page is available again"); |
|
155 gBrowser.selectedTab = gTab1; |
|
156 executeSoon(runNextStep); |
|
157 }, |
|
158 function crossTabWakeLock5() { |
|
159 // Test again in background tab |
|
160 is(gWin2.document.hidden, true, |
|
161 "window is background") |
|
162 is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-background", |
|
163 "wake lock is background"); |
|
164 gWin2.addEventListener("pagehide", function onPageHide(e) { |
|
165 gWin2.removeEventListener("pagehide", onPageHide, true); |
|
166 executeSoon(runNextStep); |
|
167 }, true); |
|
168 gWin2.addEventListener("pageshow", function onPageShow(e) { |
|
169 gWin2.removeEventListener("pageshow", onPageShow, true); |
|
170 executeSoon(runNextStep); |
|
171 }, true); |
|
172 gWin2.location = kDataSource; |
|
173 }, |
|
174 function crossTabWakeLock6() { |
|
175 is(gWin1.navigator.mozPower.getWakeLockState("test"), "unlocked", |
|
176 "wake lock should auto-unlock when page is unloaded"); |
|
177 gWin2.back(); |
|
178 // runNextStep called in onPageShow |
|
179 }, |
|
180 function crossTabWakeLock7() { |
|
181 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-background", |
|
182 "wake lock should auto-reacquire when page is available again"); |
|
183 gLock2.unlock(); |
|
184 gBrowser.selectedTab = gTab2; |
|
185 executeSoon(runNextStep); |
|
186 }, |
|
187 function crossTabWakeLock8() { |
|
188 is(gWin1.document.hidden, true, |
|
189 "gWin1 is background"); |
|
190 is(gWin2.document.hidden, false, |
|
191 "gWin2 is foreground"); |
|
192 |
|
193 gLock1 = gWin1.navigator.requestWakeLock("test"); |
|
194 gLock2 = gWin2.navigator.requestWakeLock("test"); |
|
195 |
|
196 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", |
|
197 "topic is locked-foreground when one page is foreground and one is background"); |
|
198 |
|
199 gLock2.unlock(); |
|
200 |
|
201 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-background", |
|
202 "topic is locked-background when all locks are background"); |
|
203 |
|
204 gLock2 = gWin2.navigator.requestWakeLock("test"); |
|
205 |
|
206 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", |
|
207 "topic is locked-foreground when one page is foreground and one is background"); |
|
208 |
|
209 gLock1.unlock(); |
|
210 |
|
211 is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", |
|
212 "topic is locked-foreground"); |
|
213 |
|
214 gBrowser.removeTab(gTab1); |
|
215 gBrowser.removeTab(gTab2); |
|
216 executeSoon(runNextStep); |
|
217 }, |
|
218 ]; |
|
219 |
|
220 function runNextStep() { |
|
221 gCurStepIndex++; |
|
222 if (gCurStepIndex < gSteps.length) { |
|
223 gSteps[gCurStepIndex](); |
|
224 } else { |
|
225 finish(); |
|
226 } |
|
227 } |
|
228 |
|
229 function test() { |
|
230 SpecialPowers.pushPermissions([ |
|
231 {type: "power", allow: true, context: kUrlSource} |
|
232 ], function () { |
|
233 SpecialPowers.pushPrefEnv({"set": [["dom.wakelock.enabled", true]]}, |
|
234 runNextStep); |
|
235 }); |
|
236 } |