Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
/*
* Ensure tabs that are active media blocked act correctly
* when we try to unblock them using the "Play Tab" icon or by calling
* resumeDelayedMedia()
*/
"use strict";
const PREF_DELAY_AUTOPLAY = "media.block-autoplay-until-in-foreground";
async function playMedia(tab, { expectBlocked }) {
let blockedPromise = wait_for_tab_media_blocked_event(tab, expectBlocked);
tab.resumeDelayedMedia();
await blockedPromise;
is(activeMediaBlocked(tab), expectBlocked, "tab has wrong media block state");
}
add_task(async function setPref() {
await SpecialPowers.pushPrefEnv({
set: [[PREF_DELAY_AUTOPLAY, true]],
});
});
/*
* Playing blocked media will not mute the selected tabs
*/
add_task(async function testDelayPlayWontAffectUnmuteStatus() {
info("Add media tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
let tabs = [tab0, tab1];
info("Play both tabs");
await play(tab0, false);
await play(tab1, false);
// Check tabs are unmuted
ok(!muted(tab0), "Tab0 is unmuted");
ok(!muted(tab1), "Tab1 is unmuted");
info("Play media on tab0");
await playMedia(tab0, { expectBlocked: false });
// Check tabs are still unmuted
ok(!muted(tab0), "Tab0 is unmuted");
ok(!muted(tab1), "Tab1 is unmuted");
info("Play media on tab1");
await playMedia(tab1, { expectBlocked: false });
// Check tabs are still unmuted
ok(!muted(tab0), "Tab0 is unmuted");
ok(!muted(tab1), "Tab1 is unmuted");
for (let tab of tabs) {
BrowserTestUtils.removeTab(tab);
}
});
/*
* Playing blocked media will not unmute the selected tabs
*/
add_task(async function testDelayPlayWontAffectMuteStatus() {
info("Add media tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
info("Play both tabs");
await play(tab0, false);
await play(tab1, false);
// Mute both tabs
toggleMuteAudio(tab0, true);
toggleMuteAudio(tab1, true);
// Check tabs are muted
ok(muted(tab0), "Tab0 is muted");
ok(muted(tab1), "Tab1 is muted");
info("Play media on tab0");
await playMedia(tab0, { expectBlocked: false });
// Check tabs are still muted
ok(muted(tab0), "Tab0 is muted");
ok(muted(tab1), "Tab1 is muted");
info("Play media on tab1");
await playMedia(tab1, { expectBlocked: false });
// Check tabs are still muted
ok(muted(tab0), "Tab0 is muted");
ok(muted(tab1), "Tab1 is muted");
BrowserTestUtils.removeTab(tab0);
BrowserTestUtils.removeTab(tab1);
});
/*
* Switching tabs will unblock media
*/
add_task(async function testDelayPlayWhenSwitchingTab() {
info("Add media tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
info("Play both tabs");
await play(tab0, false);
await play(tab1, false);
// Both tabs are initially active media blocked after being played
ok(activeMediaBlocked(tab0), "Tab0 is activemedia-blocked");
ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked");
info("Switch to tab0");
await BrowserTestUtils.switchTab(gBrowser, tab0);
is(gBrowser.selectedTab, tab0, "Tab0 is active");
// tab0 unblocked, tab1 blocked
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked");
info("Switch to tab1");
await BrowserTestUtils.switchTab(gBrowser, tab1);
is(gBrowser.selectedTab, tab1, "Tab1 is active");
// tab0 unblocked, tab1 unblocked
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked");
BrowserTestUtils.removeTab(tab0);
BrowserTestUtils.removeTab(tab1);
});
/*
* The "Play Tab" icon unblocks media
*/
add_task(async function testDelayPlayWhenUsingButton() {
info("Add media tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
info("Play both tabs");
await play(tab0, false);
await play(tab1, false);
// Both tabs are initially active media blocked after being played
ok(activeMediaBlocked(tab0), "Tab0 is activemedia-blocked");
ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked");
info("Press the Play Tab icon on tab0");
await pressIcon(tab0.overlayIcon);
// tab0 unblocked, tab1 blocked
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked");
info("Press the Play Tab icon on tab1");
await pressIcon(tab1.overlayIcon);
// tab0 unblocked, tab1 unblocked
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked");
BrowserTestUtils.removeTab(tab0);
BrowserTestUtils.removeTab(tab1);
});
/*
* Tab context menus have to show the menu icons "Play Tab" or "Play Tabs"
* depending on the number of tabs selected, and whether blocked media is present
*/
add_task(async function testTabContextMenu() {
info("Add media tab");
let tab0 = await addMediaTab();
let menuItemPlayTab = document.getElementById("context_playTab");
let menuItemPlaySelectedTabs = document.getElementById(
"context_playSelectedTabs"
);
// No active media yet:
// - "Play Tab" is hidden
// - "Play Tabs" is hidden
updateTabContextMenu(tab0);
ok(menuItemPlayTab.hidden, 'tab0 "Play Tab" is hidden');
ok(menuItemPlaySelectedTabs.hidden, 'tab0 "Play Tabs" is hidden');
ok(!activeMediaBlocked(tab0), "tab0 is not active media blocked");
info("Play tab0");
await play(tab0, false);
// Active media blocked:
// - "Play Tab" is visible
// - "Play Tabs" is hidden
updateTabContextMenu(tab0);
ok(!menuItemPlayTab.hidden, 'tab0 "Play Tab" is visible');
ok(menuItemPlaySelectedTabs.hidden, 'tab0 "Play Tabs" is hidden');
ok(activeMediaBlocked(tab0), "tab0 is active media blocked");
info("Play media on tab0");
await playMedia(tab0, { expectBlocked: false });
// Media is playing:
// - "Play Tab" is hidden
// - "Play Tabs" is hidden
updateTabContextMenu(tab0);
ok(menuItemPlayTab.hidden, 'tab0 "Play Tab" is hidden');
ok(menuItemPlaySelectedTabs.hidden, 'tab0 "Play Tabs" is hidden');
ok(!activeMediaBlocked(tab0), "tab0 is not active media blocked");
BrowserTestUtils.removeTab(tab0);
});