From a10b8df4d24cba528bcc1dc7dccd21c6aa9d318c Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Fri, 28 Sep 2018 14:05:07 +0900 Subject: [PATCH] Bug 1492736 - Part 1. Add nsIWakeLock to manage wake lock from devtools. r=baku DevTools wants to use wake lock to keep screen. But since MozWakeLock is removed by bug 1369194, there is no way to unlock wake lock from script. So this issue adds nsIWakeLock to unlock wake lock. Differential Revision: https://phabricator.services.mozilla.com/D7158 --HG-- extra : rebase_source : 4d6069fce27a7d85ce484a1418a8a17de83166f1 --- dom/power/PowerManagerService.cpp | 5 ++--- dom/power/WakeLock.cpp | 9 +++++++++ dom/power/WakeLock.h | 3 +++ dom/power/moz.build | 1 + dom/power/nsIPowerManagerService.idl | 3 ++- dom/power/nsIWakeLock.idl | 12 ++++++++++++ dom/tests/browser/browser.ini | 1 + dom/tests/browser/browser_wakelock.js | 27 +++++++++++++++++++++++++++ 8 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 dom/power/nsIWakeLock.idl create mode 100644 dom/tests/browser/browser_wakelock.js 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); +});