1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/power/test/browser_wakelocks.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,236 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +waitForExplicitFinish(); 1.11 + 1.12 +let kUrlSource = "http://mochi.test:8888/"; 1.13 +let kDataSource = "data:text/html,"; 1.14 + 1.15 +let gOldPref; 1.16 +let gWin, gWin1, gWin2; 1.17 +let gTab, gTab1, gTab2; 1.18 +let gLock, gLock1, gLock2; 1.19 +let gCurStepIndex = -1; 1.20 +let gSteps = [ 1.21 + function basicWakeLock() { 1.22 + gTab = gBrowser.addTab(kUrlSource); 1.23 + gWin = gBrowser.getBrowserForTab(gTab).contentWindow; 1.24 + let browser = gBrowser.getBrowserForTab(gTab); 1.25 + 1.26 + browser.addEventListener("load", function onLoad(e) { 1.27 + browser.removeEventListener("load", onLoad, true); 1.28 + let nav = gWin.navigator; 1.29 + let power = nav.mozPower; 1.30 + gLock = nav.requestWakeLock("test"); 1.31 + 1.32 + ok(gLock != null, 1.33 + "navigator.requestWakeLock should return a wake lock"); 1.34 + is(gLock.topic, "test", 1.35 + "wake lock should remember the locked topic"); 1.36 + isnot(power.getWakeLockState("test"), "unlocked", 1.37 + "topic is locked"); 1.38 + 1.39 + gLock.unlock(); 1.40 + 1.41 + is(gLock.topic, "test", 1.42 + "wake lock should remember the locked topic even after unlock"); 1.43 + is(power.getWakeLockState("test"), "unlocked", 1.44 + "topic is unlocked"); 1.45 + 1.46 + try { 1.47 + gLock.unlock(); 1.48 + ok(false, "Should have thrown an error."); 1.49 + } catch (e) { 1.50 + is(e.name, "InvalidStateError", "double unlock should throw InvalidStateError"); 1.51 + is(e.code, DOMException.INVALID_STATE_ERR, "double unlock should throw InvalidStateError"); 1.52 + } 1.53 + 1.54 + gBrowser.removeTab(gTab); 1.55 + 1.56 + executeSoon(runNextStep); 1.57 + }, true); 1.58 + }, 1.59 + function multiWakeLock() { 1.60 + gTab = gBrowser.addTab(kUrlSource); 1.61 + gWin = gBrowser.getBrowserForTab(gTab).contentWindow; 1.62 + let browser = gBrowser.getBrowserForTab(gTab); 1.63 + 1.64 + browser.addEventListener("load", function onLoad(e) { 1.65 + browser.removeEventListener("load", onLoad, true); 1.66 + let nav = gWin.navigator; 1.67 + let power = nav.mozPower; 1.68 + let count = 0; 1.69 + power.addWakeLockListener(function onWakeLockEvent(topic, state) { 1.70 + is(topic, "test", "gLock topic is test"); 1.71 + ok(state == "unlocked" || 1.72 + state == "locked-foreground" || 1.73 + state == "locked-background", 1.74 + "wake lock should be either locked or unlocked"); 1.75 + count++; 1.76 + if (state == "locked-foreground" || 1.77 + state == "locked-background") { 1.78 + is(count, 1, 1.79 + "wake lock should be locked and the listener should only fire once"); 1.80 + } 1.81 + if (state == "unlocked") { 1.82 + is(count, 2, 1.83 + "wake lock should be unlocked and the listener should only fire once"); 1.84 + 1.85 + ok(power.getWakeLockState("test") == "unlocked", 1.86 + "topic is unlocked"); 1.87 + power.removeWakeLockListener(onWakeLockEvent); 1.88 + gBrowser.removeTab(gTab); 1.89 + executeSoon(runNextStep); 1.90 + } 1.91 + }); 1.92 + 1.93 + gLock1 = nav.requestWakeLock("test"); 1.94 + isnot(power.getWakeLockState("test"), "unlocked", 1.95 + "topic is locked"); 1.96 + 1.97 + gLock2 = nav.requestWakeLock("test"); 1.98 + isnot(power.getWakeLockState("test"), "unlocked", 1.99 + "topic is locked"); 1.100 + 1.101 + gLock1.unlock(); 1.102 + isnot(power.getWakeLockState("test"), "unlocked", 1.103 + "topic is locked"); 1.104 + 1.105 + gLock2.unlock(); 1.106 + }, true); 1.107 + }, 1.108 + function crossTabWakeLock1() { 1.109 + gTab1 = gBrowser.addTab(kUrlSource); 1.110 + gWin1 = gBrowser.getBrowserForTab(gTab1).contentWindow; 1.111 + gTab2 = gBrowser.addTab(kUrlSource); 1.112 + gWin2 = gBrowser.getBrowserForTab(gTab2).contentWindow; 1.113 + 1.114 + gBrowser.selectedTab = gTab1; 1.115 + let browser = gBrowser.getBrowserForTab(gTab2); 1.116 + 1.117 + browser.addEventListener("load", function onLoad(e) { 1.118 + browser.removeEventListener("load", onLoad, true); 1.119 + gLock2 = gWin2.navigator.requestWakeLock("test"); 1.120 + is(gWin2.document.hidden, true, 1.121 + "window is background") 1.122 + is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-background", 1.123 + "wake lock is background"); 1.124 + let doc2 = gWin2.document; 1.125 + doc2.addEventListener("visibilitychange", function onVisibilityChange(e) { 1.126 + if (!doc2.hidden) { 1.127 + doc2.removeEventListener("visibilitychange", onVisibilityChange); 1.128 + executeSoon(runNextStep); 1.129 + } 1.130 + }); 1.131 + gBrowser.selectedTab = gTab2; 1.132 + }, true); 1.133 + }, 1.134 + function crossTabWakeLock2() { 1.135 + is(gWin2.document.hidden, false, 1.136 + "window is foreground") 1.137 + is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-foreground", 1.138 + "wake lock is foreground"); 1.139 + gWin2.addEventListener("pagehide", function onPageHide(e) { 1.140 + gWin2.removeEventListener("pagehide", onPageHide, true); 1.141 + executeSoon(runNextStep); 1.142 + }, true); 1.143 + gWin2.addEventListener("pageshow", function onPageShow(e) { 1.144 + gWin2.removeEventListener("pageshow", onPageShow, true); 1.145 + executeSoon(runNextStep); 1.146 + }, true); 1.147 + gWin2.location = kDataSource; 1.148 + }, 1.149 + function crossTabWakeLock3() { 1.150 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "unlocked", 1.151 + "wake lock should auto-unlock when page is unloaded"); 1.152 + gWin2.back(); 1.153 + // runNextStep called in onPageShow 1.154 + }, 1.155 + function crossTabWakeLock4() { 1.156 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", 1.157 + "wake lock should auto-reacquire when page is available again"); 1.158 + gBrowser.selectedTab = gTab1; 1.159 + executeSoon(runNextStep); 1.160 + }, 1.161 + function crossTabWakeLock5() { 1.162 + // Test again in background tab 1.163 + is(gWin2.document.hidden, true, 1.164 + "window is background") 1.165 + is(gWin2.navigator.mozPower.getWakeLockState("test"), "locked-background", 1.166 + "wake lock is background"); 1.167 + gWin2.addEventListener("pagehide", function onPageHide(e) { 1.168 + gWin2.removeEventListener("pagehide", onPageHide, true); 1.169 + executeSoon(runNextStep); 1.170 + }, true); 1.171 + gWin2.addEventListener("pageshow", function onPageShow(e) { 1.172 + gWin2.removeEventListener("pageshow", onPageShow, true); 1.173 + executeSoon(runNextStep); 1.174 + }, true); 1.175 + gWin2.location = kDataSource; 1.176 + }, 1.177 + function crossTabWakeLock6() { 1.178 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "unlocked", 1.179 + "wake lock should auto-unlock when page is unloaded"); 1.180 + gWin2.back(); 1.181 + // runNextStep called in onPageShow 1.182 + }, 1.183 + function crossTabWakeLock7() { 1.184 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-background", 1.185 + "wake lock should auto-reacquire when page is available again"); 1.186 + gLock2.unlock(); 1.187 + gBrowser.selectedTab = gTab2; 1.188 + executeSoon(runNextStep); 1.189 + }, 1.190 + function crossTabWakeLock8() { 1.191 + is(gWin1.document.hidden, true, 1.192 + "gWin1 is background"); 1.193 + is(gWin2.document.hidden, false, 1.194 + "gWin2 is foreground"); 1.195 + 1.196 + gLock1 = gWin1.navigator.requestWakeLock("test"); 1.197 + gLock2 = gWin2.navigator.requestWakeLock("test"); 1.198 + 1.199 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", 1.200 + "topic is locked-foreground when one page is foreground and one is background"); 1.201 + 1.202 + gLock2.unlock(); 1.203 + 1.204 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-background", 1.205 + "topic is locked-background when all locks are background"); 1.206 + 1.207 + gLock2 = gWin2.navigator.requestWakeLock("test"); 1.208 + 1.209 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", 1.210 + "topic is locked-foreground when one page is foreground and one is background"); 1.211 + 1.212 + gLock1.unlock(); 1.213 + 1.214 + is(gWin1.navigator.mozPower.getWakeLockState("test"), "locked-foreground", 1.215 + "topic is locked-foreground"); 1.216 + 1.217 + gBrowser.removeTab(gTab1); 1.218 + gBrowser.removeTab(gTab2); 1.219 + executeSoon(runNextStep); 1.220 + }, 1.221 +]; 1.222 + 1.223 +function runNextStep() { 1.224 + gCurStepIndex++; 1.225 + if (gCurStepIndex < gSteps.length) { 1.226 + gSteps[gCurStepIndex](); 1.227 + } else { 1.228 + finish(); 1.229 + } 1.230 +} 1.231 + 1.232 +function test() { 1.233 + SpecialPowers.pushPermissions([ 1.234 + {type: "power", allow: true, context: kUrlSource} 1.235 + ], function () { 1.236 + SpecialPowers.pushPrefEnv({"set": [["dom.wakelock.enabled", true]]}, 1.237 + runNextStep); 1.238 + }); 1.239 +}