Bug 1584319 - refactor the way of requesting wakelock on Windows. r=jmathies

Current implementation would fail to request a non-display wakelock on Windows when we ask for a background audio lock. The check for `audio-playing` with `locked-background` is incorrect. Therefore, adding new a variable to tell if we should request a non-display lock.

Differential Revision: https://phabricator.services.mozilla.com/D60201

--HG--
extra : moz-landing-system : lando
This commit is contained in:
alwu 2020-02-12 01:32:39 +00:00
Родитель f4658e4672
Коммит d2a99667f0
1 изменённых файлов: 21 добавлений и 21 удалений

Просмотреть файл

@ -53,40 +53,40 @@ class WinWakeLockListener final : public nsIDOMMozWakeLockListener {
NS_IMETHOD Callback(const nsAString& aTopic,
const nsAString& aState) override {
WAKE_LOCK_LOG("WinWakeLock: topic=%s, state=%s",
NS_ConvertUTF16toUTF8(aTopic).get(),
NS_ConvertUTF16toUTF8(aState).get());
if (!aTopic.EqualsASCII("screen") && !aTopic.EqualsASCII("audio-playing") &&
!aTopic.EqualsASCII("video-playing")) {
return NS_OK;
}
// we should still hold the lock for background audio.
if (aTopic.EqualsASCII("audio-playing") &&
aState.EqualsASCII("locked-background")) {
return NS_OK;
// Check what kind of lock we will require, if both display lock and non
// display lock are needed, we would require display lock because it has
// higher priority.
if (aTopic.EqualsASCII("audio-playing")) {
mRequireForNonDisplayLock = aState.EqualsASCII("locked-foreground") ||
aState.EqualsASCII("locked-background");
} else if (aTopic.EqualsASCII("screen") ||
aTopic.EqualsASCII("video-playing")) {
mRequireForDisplayLock = aState.EqualsASCII("locked-foreground");
}
if (aTopic.EqualsASCII("screen") || aTopic.EqualsASCII("video-playing")) {
mRequireForDisplay = aState.EqualsASCII("locked-foreground");
}
// Note the wake lock code ensures that we're not sent duplicate
// "locked-foreground" notifications when multiple wake locks are held.
if (aState.EqualsASCII("locked-foreground")) {
WAKE_LOCK_LOG("WinWakeLock: Blocking screen saver");
if (mRequireForDisplay) {
// Prevent the display turning off and block the screen saver.
SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
} else {
SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_CONTINUOUS);
}
if (mRequireForDisplayLock) {
WAKE_LOCK_LOG("WinWakeLock: Request display lock");
SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
} else if (mRequireForNonDisplayLock) {
WAKE_LOCK_LOG("WinWakeLock: Request non-display lock");
SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_CONTINUOUS);
} else {
WAKE_LOCK_LOG("WinWakeLock: Unblocking screen saver");
// Unblock display/screen saver turning off.
WAKE_LOCK_LOG("WinWakeLock: reset lock");
SetThreadExecutionState(ES_CONTINUOUS);
}
return NS_OK;
}
bool mRequireForDisplay = false;
bool mRequireForDisplayLock = false;
bool mRequireForNonDisplayLock = false;
};
NS_IMPL_ISUPPORTS(WinWakeLockListener, nsIDOMMozWakeLockListener)