Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

const PAGE_URL =
/**
* This test is used to ensure that real-time media won't be affected by the
* media control. Only non-real-time media would.
*/
add_task(async function setupTestingPref() {
await SpecialPowers.pushPrefEnv({
set: [["media.mediacontrol.testingevents.enabled", true]],
});
});
add_task(async function testOnlyControlNonRealTimeMedia() {
const tab = await createLoadedTabWrapper(PAGE_URL);
const controller = tab.linkedBrowser.browsingContext.mediaController;
await StartRealTimeMedia(tab);
ok(
!controller.isActive,
"starting a real-time media won't acivate controller"
);
info(`playing a non-real-time media would activate controller`);
await Promise.all([
new Promise(r => (controller.onactivated = r)),
startNonRealTimeMedia(tab),
]);
info(`'pause' action should only pause non-real-time media`);
MediaControlService.generateMediaControlKey("pause");
await new Promise(r => (controller.onplaybackstatechange = r));
await checkIfMediaAreAffectedByMediaControl(tab);
info(`remove tab`);
await tab.close();
});
async function startNonRealTimeMedia(tab) {
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
let video = content.document.getElementById("video");
if (!video) {
ok(false, `can not get the video element!`);
return;
}
await video.play();
});
}
async function StartRealTimeMedia(tab) {
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
let videoRealTime = content.document.createElement("video");
content.document.body.appendChild(videoRealTime);
videoRealTime.srcObject = await content.navigator.mediaDevices.getUserMedia(
{ audio: true, fake: true }
);
// We want to ensure that the checking of should the media be controlled by
// media control would be performed after the element finishes loading the
// media stream. Using `autoplay` would trigger the play invocation only
// after the element get enough data.
videoRealTime.autoplay = true;
await new Promise(r => (videoRealTime.onplaying = r));
});
}
async function checkIfMediaAreAffectedByMediaControl(tab) {
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
const vids = content.document.getElementsByTagName("video");
for (let vid of vids) {
if (!vid.srcObject) {
ok(vid.paused, "non-real-time media should be paused");
} else {
ok(!vid.paused, "real-time media should not be affected");
}
}
});
}