/**
* Test whether the wakelock state is correct under different situations. However,
* the lock state of power manager doesn't equal to the actual platform lock.
* Now we don't have any way to detect whether platform lock is set correctly or
* not, but we can at least make sure the specific topic's state in power manager
* is correct.
*/
"use strict";
// Import this in order to use `triggerPictureInPicture()`.
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/toolkit/components/pictureinpicture/tests/head.js",
this
);
const LOCATION =
"https://example.com/browser/toolkit/content/tests/browser/";
const AUDIO_WAKELOCK_NAME =
"audio-playing";
const VIDEO_WAKELOCK_NAME =
"video-playing";
add_task(async
function testCheckWakelockWhenChangeTabVisibility() {
await checkWakelockWhenChangeTabVisibility({
description:
"playing video",
url:
"file_video.html",
lockAudio:
true,
lockVideo:
true,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing muted video",
url:
"file_video.html",
additionalParams: {
muted:
true,
},
lockAudio:
false,
lockVideo:
true,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing volume=0 video",
url:
"file_video.html",
additionalParams: {
volume: 0.0,
},
lockAudio:
false,
lockVideo:
true,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing video without audio in it",
url:
"file_videoWithoutAudioTrack.html",
lockAudio:
false,
lockVideo:
false,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing audio in video element",
url:
"file_videoWithAudioOnly.html",
lockAudio:
true,
lockVideo:
false,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing audio in audio element",
url:
"file_mediaPlayback2.html",
lockAudio:
true,
lockVideo:
false,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing video from media stream with audio and video tracks",
url:
"browser_mediaStreamPlayback.html",
lockAudio:
true,
lockVideo:
true,
});
await checkWakelockWhenChangeTabVisibility({
description:
"playing video from media stream without audio track",
url:
"browser_mediaStreamPlaybackWithoutAudio.html",
lockAudio:
true,
lockVideo:
true,
});
});
/**
* Following are helper functions.
*/
async
function checkWakelockWhenChangeTabVisibility({
description,
url,
additionalParams,
lockAudio,
lockVideo,
}) {
const originalTab = gBrowser.selectedTab;
info(`start a
new tab
for '${description}'`);
const mediaTab = await BrowserTestUtils.openNewForegroundTab(
window.gBrowser,
LOCATION + url
);
info(`wait
for media starting playing`);
await waitUntilVideoStarted(mediaTab, additionalParams);
await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
needLock: lockAudio,
isForegroundLock:
true,
});
await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
needLock: lockVideo,
isForegroundLock:
true,
});
info(`
switch media tab to background`);
await BrowserTestUtils.switchTab(window.gBrowser, originalTab);
await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
needLock: lockAudio,
isForegroundLock:
false,
});
await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
needLock: lockVideo,
isForegroundLock:
false,
});
info(`
switch media tab to foreground again`);
await BrowserTestUtils.switchTab(window.gBrowser, mediaTab);
await waitForExpectedWakeLockState(AUDIO_WAKELOCK_NAME, {
needLock: lockAudio,
isForegroundLock:
true,
});
await waitForExpectedWakeLockState(VIDEO_WAKELOCK_NAME, {
needLock: lockVideo,
isForegroundLock:
true,
});
info(`remove tab`);
if (mediaTab.PIPWindow) {
await BrowserTestUtils.closeWindow(mediaTab.PIPWindow);
}
BrowserTestUtils.removeTab(mediaTab);
}
async
function waitUntilVideoStarted(tab, { muted, volume } = {}) {
await SpecialPowers.spawn(
tab.linkedBrowser,
[muted, volume],
async (muted, volume) => {
const video = content.document.getElementById(
"v");
if (!video) {
ok(
false,
"can't get media element!");
return;
}
if (muted) {
video.muted = muted;
}
if (volume !== undefined) {
video.volume = volume;
}
ok(
await video.play().then(
() =>
true,
() =>
false
),
`video started playing.`
);
}
);
}