diff --git a/dom/power/PowerManagerService.cpp b/dom/power/PowerManagerService.cpp index 7716c093ba8b..d622c2ad457d 100644 --- a/dom/power/PowerManagerService.cpp +++ b/dom/power/PowerManagerService.cpp @@ -139,7 +139,7 @@ PowerManagerService::NewWakeLock(const nsAString& aTopic, NS_IMETHODIMP PowerManagerService::NewWakeLock(const nsAString &aTopic, mozIDOMWindow *aWindow, - nsISupports **aWakeLock) + nsIWakeLock **aWakeLock) { mozilla::ErrorResult rv; RefPtr wakelock = @@ -148,8 +148,7 @@ PowerManagerService::NewWakeLock(const nsAString &aTopic, return rv.StealNSResult(); } - nsCOMPtr eventListener = wakelock.get(); - eventListener.forget(aWakeLock); + wakelock.forget(aWakeLock); return NS_OK; } diff --git a/dom/power/WakeLock.cpp b/dom/power/WakeLock.cpp index 50746b9973e7..3d99edf5726d 100644 --- a/dom/power/WakeLock.cpp +++ b/dom/power/WakeLock.cpp @@ -25,6 +25,7 @@ NS_INTERFACE_MAP_BEGIN(WakeLock) NS_INTERFACE_MAP_ENTRY(nsIDOMEventListener) NS_INTERFACE_MAP_ENTRY(nsIObserver) NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) + NS_INTERFACE_MAP_ENTRY(nsIWakeLock) NS_INTERFACE_MAP_END NS_IMPL_ADDREF(WakeLock) @@ -258,6 +259,14 @@ WakeLock::HandleEvent(Event *aEvent) return NS_OK; } +NS_IMETHODIMP +WakeLock::Unlock() +{ + ErrorResult error; + Unlock(error); + return error.StealNSResult(); +} + nsPIDOMWindowInner* WakeLock::GetParentObject() const { diff --git a/dom/power/WakeLock.h b/dom/power/WakeLock.h index dd31e6c7f14a..5f17c41e7781 100644 --- a/dom/power/WakeLock.h +++ b/dom/power/WakeLock.h @@ -10,6 +10,7 @@ #include "nsCOMPtr.h" #include "nsIDOMEventListener.h" #include "nsIObserver.h" +#include "nsIWakeLock.h" #include "nsString.h" #include "nsWeakReference.h" #include "nsWrapperCache.h" @@ -26,10 +27,12 @@ class WakeLock final : public nsIDOMEventListener , public nsIObserver , public nsSupportsWeakReference + , public nsIWakeLock { public: NS_DECL_NSIDOMEVENTLISTENER NS_DECL_NSIOBSERVER + NS_DECL_NSIWAKELOCK NS_DECL_ISUPPORTS diff --git a/dom/power/moz.build b/dom/power/moz.build index 3d391ec56ad3..cc949920fe21 100644 --- a/dom/power/moz.build +++ b/dom/power/moz.build @@ -10,6 +10,7 @@ with Files("**"): XPIDL_SOURCES += [ 'nsIDOMWakeLockListener.idl', 'nsIPowerManagerService.idl', + 'nsIWakeLock.idl', ] XPIDL_MODULE = 'dom_power' diff --git a/dom/power/nsIPowerManagerService.idl b/dom/power/nsIPowerManagerService.idl index 4626c8435460..49d8e3f693ad 100644 --- a/dom/power/nsIPowerManagerService.idl +++ b/dom/power/nsIPowerManagerService.idl @@ -12,6 +12,7 @@ interface nsIDOMMozWakeLockListener; interface mozIDOMWindow; +interface nsIWakeLock; /** * For use with non-content code. @@ -28,5 +29,5 @@ interface nsIPowerManagerService : nsISupports * A wake lock without associated window, e.g. used in chrome, is * always considered invisible. */ - nsISupports newWakeLock(in AString aTopic, [optional] in mozIDOMWindow aWindow); + nsIWakeLock newWakeLock(in AString aTopic, [optional] in mozIDOMWindow aWindow); }; diff --git a/dom/power/nsIWakeLock.idl b/dom/power/nsIWakeLock.idl new file mode 100644 index 000000000000..5ebc15810954 --- /dev/null +++ b/dom/power/nsIWakeLock.idl @@ -0,0 +1,12 @@ +/* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsISupports.idl" + +[scriptable, builtinclass, uuid(e27e57ce-fa63-4035-b9ef-27c5dc0cc3ae)] +interface nsIWakeLock : nsISupports +{ + void unlock(); +}; diff --git a/dom/tests/browser/browser.ini b/dom/tests/browser/browser.ini index 32f275b8f750..bf9e5cb8ac2c 100644 --- a/dom/tests/browser/browser.ini +++ b/dom/tests/browser/browser.ini @@ -81,3 +81,4 @@ support-files = [browser_noopener_null_uri.js] [browser_test_performance_metrics_off.js] skip-if = verify +[browser_wakelock.js] diff --git a/dom/tests/browser/browser_wakelock.js b/dom/tests/browser/browser_wakelock.js new file mode 100644 index 000000000000..2b1d81230b2a --- /dev/null +++ b/dom/tests/browser/browser_wakelock.js @@ -0,0 +1,27 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +"use strict"; + +add_task(async () => { + info("creating test window"); + let win = await BrowserTestUtils.openNewBrowserWindow(); + + const pm = Cc["@mozilla.org/power/powermanagerservice;1"] + .getService(Ci.nsIPowerManagerService); + + is(pm.getWakeLockState("screen"), "unlocked", "Wakelock should be unlocked state"); + + info("aquiring wakelock"); + const wakelock = pm.newWakeLock("screen", win); + isnot(pm.getWakeLockState("screen"), "unlocked", "Wakelock shouldn't be unlocked state"); + + info("releasing wakelock"); + wakelock.unlock(); + is(pm.getWakeLockState("screen"), "unlocked", "Wakelock should be unlocked state"); + + info("closing test window"); + await BrowserTestUtils.closeWindow(win); +});