Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
/*
* Ensure multiselected tabs that are active media blocked act correctly
* when we try to unblock them using the "Play Tabs" icon or by calling
* resumeDelayedMediaOnMultiSelectedTabs()
*/
"use strict";
const PREF_DELAY_AUTOPLAY = "media.block-autoplay-until-in-foreground";
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();
info("Play both tabs");
await play(tab0, false);
await play(tab1, false);
info("Multiselect tabs");
await triggerClickOn(tab1, { shiftKey: true });
// Check multiselection
ok(tab0.multiselected, "tab0 is multiselected");
ok(tab1.multiselected, "tab1 is multiselected");
// Check tabs are unmuted
ok(!muted(tab0), "Tab0 is unmuted");
ok(!muted(tab1), "Tab1 is unmuted");
let tab0BlockPromise = wait_for_tab_media_blocked_event(tab0, false);
let tab1BlockPromise = wait_for_tab_media_blocked_event(tab1, false);
// Play media on selected tabs
gBrowser.resumeDelayedMediaOnMultiSelectedTabs();
info("Wait for media to play");
await tab0BlockPromise;
await tab1BlockPromise;
// Check tabs are still unmuted
ok(!muted(tab0), "Tab0 is unmuted");
ok(!muted(tab1), "Tab1 is unmuted");
BrowserTestUtils.removeTab(tab0);
BrowserTestUtils.removeTab(tab1);
});
/*
* 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);
info("Multiselect tabs");
await triggerClickOn(tab1, { shiftKey: true });
// Check multiselection
ok(tab0.multiselected, "tab0 is multiselected");
ok(tab1.multiselected, "tab1 is multiselected");
// Check tabs are muted
ok(muted(tab0), "Tab0 is muted");
ok(muted(tab1), "Tab1 is muted");
let tab0BlockPromise = wait_for_tab_media_blocked_event(tab0, false);
let tab1BlockPromise = wait_for_tab_media_blocked_event(tab1, false);
// Play media on selected tabs
gBrowser.resumeDelayedMediaOnMultiSelectedTabs();
info("Wait for media to play");
await tab0BlockPromise;
await tab1BlockPromise;
// Check tabs are still muted
ok(muted(tab0), "Tab0 is muted");
ok(muted(tab1), "Tab1 is muted");
BrowserTestUtils.removeTab(tab0);
BrowserTestUtils.removeTab(tab1);
});
/*
* The "Play Tabs" icon unblocks media
*/
add_task(async function testDelayPlayWhenUsingButton() {
info("Add media tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
let tab2 = await addMediaTab();
let tab3 = await addMediaTab();
let tab4 = await addMediaTab();
let tabs = [tab0, tab1, tab2, tab3, tab4];
// All tabs are initially unblocked due to not being played yet
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked");
ok(!activeMediaBlocked(tab2), "Tab2 is not activemedia-blocked");
ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked");
ok(!activeMediaBlocked(tab4), "Tab4 is not activemedia-blocked");
// Playing tabs 0, 1, and 2 will block them
info("Play tabs 0, 1, and 2");
await play(tab0, false);
await play(tab1, false);
await play(tab2, false);
ok(activeMediaBlocked(tab0), "Tab0 is activemedia-blocked");
ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked");
ok(activeMediaBlocked(tab2), "Tab2 is activemedia-blocked");
// tab3 and tab4 are still unblocked
ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked");
ok(!activeMediaBlocked(tab4), "Tab4 is not activemedia-blocked");
// Multiselect tab0, tab1, tab2, and tab3.
info("Multiselect tabs");
await triggerClickOn(tab3, { shiftKey: true });
// Check multiselection
for (let i = 0; i <= 3; i++) {
ok(tabs[i].multiselected, `tab${i} is multiselected`);
}
ok(!tab4.multiselected, "tab4 is not multiselected");
let tab0BlockPromise = wait_for_tab_media_blocked_event(tab0, false);
let tab1BlockPromise = wait_for_tab_media_blocked_event(tab1, false);
let tab2BlockPromise = wait_for_tab_media_blocked_event(tab2, false);
// Use the overlay icon on tab2 to play media on the selected tabs
info("Press play tab2 icon");
await pressIcon(tab2.overlayIcon);
// tab0, tab1, and tab2 were played and multiselected
// They will now be unblocked and playing media
info("Wait for tabs to play");
await tab0BlockPromise;
await tab1BlockPromise;
await tab2BlockPromise;
ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked");
ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked");
ok(!activeMediaBlocked(tab2), "Tab2 is not activemedia-blocked");
// tab3 was also multiselected but never played
// It will be unblocked but not playing media
ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked");
// tab4 was not multiselected and was never played
// It remains in its original state
ok(!activeMediaBlocked(tab4), "Tab4 is not activemedia-blocked");
for (let tab of tabs) {
BrowserTestUtils.removeTab(tab);
}
});
/*
* 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 tabs");
let tab0 = await addMediaTab();
let tab1 = await addMediaTab();
let tab2 = await addMediaTab();
let tab3 = await addMediaTab();
let tabs = [tab0, tab1, tab2, tab3];
let menuItemPlayTab = document.getElementById("context_playTab");
let menuItemPlaySelectedTabs = document.getElementById(
"context_playSelectedTabs"
);
// Multiselect tab0, tab1, and tab2.
info("Multiselect tabs");
await triggerClickOn(tab0, { ctrlKey: true });
await triggerClickOn(tab1, { ctrlKey: true });
await triggerClickOn(tab2, { ctrlKey: true });
// Check multiselected tabs
for (let i = 0; i <= 2; i++) {
ok(tabs[i].multiselected, `tab${i} is multi-selected`);
}
ok(!tab3.multiselected, "tab3 is not multiselected");
// No active media yet:
// - "Play Tab" is hidden
// - "Play Tabs" is hidden
for (let i = 0; i <= 2; i++) {
updateTabContextMenu(tabs[i]);
ok(menuItemPlayTab.hidden, `tab${i} "Play Tab" is hidden`);
ok(menuItemPlaySelectedTabs.hidden, `tab${i} "Play Tabs" is hidden`);
ok(!activeMediaBlocked(tabs[i]), `tab${i} is not active media blocked`);
}
info("Play tabs 0, 1, and 2");
await play(tab0, false);
await play(tab1, false);
await play(tab2, false);
// Active media blocked:
// - "Play Tab" is hidden
// - "Play Tabs" is visible
for (let i = 0; i <= 2; i++) {
updateTabContextMenu(tabs[i]);
ok(menuItemPlayTab.hidden, `tab${i} "Play Tab" is hidden`);
ok(!menuItemPlaySelectedTabs.hidden, `tab${i} "Play Tabs" is visible`);
ok(activeMediaBlocked(tabs[i]), `tab${i} is active media blocked`);
}
info("Play Media on tabs 0, 1, and 2");
gBrowser.resumeDelayedMediaOnMultiSelectedTabs();
// Active media is unblocked:
// - "Play Tab" is hidden
// - "Play Tabs" is hidden
for (let i = 0; i <= 2; i++) {
updateTabContextMenu(tabs[i]);
ok(menuItemPlayTab.hidden, `tab${i} "Play Tab" is hidden`);
ok(menuItemPlaySelectedTabs.hidden, `tab${i} "Play Tabs" is hidden`);
ok(!activeMediaBlocked(tabs[i]), `tab${i} is not active media blocked`);
}
// tab3 is untouched
updateTabContextMenu(tab3);
ok(menuItemPlayTab.hidden, 'tab3 "Play Tab" is hidden');
ok(menuItemPlaySelectedTabs.hidden, 'tab3 "Play Tabs" is hidden');
ok(!activeMediaBlocked(tab3), "tab3 is not active media blocked");
for (let tab of tabs) {
BrowserTestUtils.removeTab(tab);
}
});