fune/toolkit/content/tests/browser/browser_media_wakelock.js
alwu d852bb9b98 Bug 1495064 - part3 : add test. r=jib
Adding a test to check 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.

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

--HG--
extra : moz-landing-system : lando
2018-10-05 21:56:10 +00:00

137 lines
4.5 KiB
JavaScript

/**
* 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";
const PAGE = "https://example.com/browser/toolkit/content/tests/browser/file_video.html";
const PAGE2 = "https://example.com/browser/toolkit/content/tests/browser/file_videoWithoutAudioTrack.html";
const PAGE3 = "https://example.com/browser/toolkit/content/tests/browser/file_mediaPlayback2.html";
const powerManagerService = Cc["@mozilla.org/power/powermanagerservice;1"];
const powerManager = powerManagerService.getService(Ci.nsIPowerManagerService);
function wakeLockObserved(observeTopic, checkFn) {
return new Promise(resolve => {
function wakeLockListener() {}
wakeLockListener.prototype = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIDOMMozWakeLockListener]),
callback: (topic, state) => {
if (topic == observeTopic && checkFn(state)) {
powerManager.removeWakeLockListener(wakeLockListener.prototype);
resolve();
}
},
};
powerManager.addWakeLockListener(wakeLockListener.prototype);
});
}
function getWakeLockState(topic, needLock, isTabInForeground) {
const tabState = isTabInForeground ? "foreground" : "background";
const promise = wakeLockObserved(topic, (state) => state == `locked-${tabState}`);
return {
check: async () => {
if (needLock) {
await promise;
ok(true, `requested '${topic}' wakelock in ${tabState}`);
} else {
const lockState = powerManager.getWakeLockState(topic);
info(`topic=${topic}, state=${lockState}`);
ok(lockState == "unlocked", `doesn't request lock for '${topic}'`);
}
},
};
}
async function waitUntilVideoStarted({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.`);
}
async function test_media_wakelock({description, url, videoAttsParams, lockAudio, lockVideo}) {
info(`- start a new test for '${description}' -`);
info(`- open new foreground tab -`);
const tab = await BrowserTestUtils.openNewForegroundTab(window.gBrowser, url);
const browser = tab.linkedBrowser;
let audioWakeLock = getWakeLockState("audio-playing", lockAudio, true);
let videoWakeLock = getWakeLockState("video-playing", lockVideo, true);
info(`- wait for media starting playing -`);
await ContentTask.spawn(browser, videoAttsParams, waitUntilVideoStarted);
await audioWakeLock.check();
await videoWakeLock.check();
info(`- switch tab to background -`);
audioWakeLock = getWakeLockState("audio-playing", lockAudio, false);
videoWakeLock = getWakeLockState("video-playing", lockVideo, false);
const tab2 = await BrowserTestUtils.openNewForegroundTab(window.gBrowser,
"about:blank");
await audioWakeLock.check();
await videoWakeLock.check();
info(`- switch tab to foreground again -`);
audioWakeLock = getWakeLockState("audio-playing", lockAudio, true);
videoWakeLock = getWakeLockState("video-playing", lockVideo, true);
await BrowserTestUtils.switchTab(window.gBrowser, tab);
await audioWakeLock.check();
await videoWakeLock.check();
info(`- remove tabs -`);
BrowserTestUtils.removeTab(tab);
BrowserTestUtils.removeTab(tab2);
}
add_task(async function start_tests() {
await test_media_wakelock({
description: "playing video",
url: PAGE,
lockAudio: true,
lockVideo: true,
});
await test_media_wakelock({
description: "playing muted video",
url: PAGE,
videoAttsParams: {
muted: true,
},
lockAudio: false,
lockVideo: true,
});
await test_media_wakelock({
description: "playing volume=0 video",
url: PAGE,
videoAttsParams: {
volume: 0.0,
},
lockAudio: false,
lockVideo: true,
});
await test_media_wakelock({
description: "playing video without audio track",
url: PAGE2,
lockAudio: false,
lockVideo: false,
});
await test_media_wakelock({
description: "playing only audio",
url: PAGE3,
lockAudio: true,
lockVideo: false,
});
});