From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../test/tabs/browser_multiselect_tabs_play.js | 254 +++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 browser/base/content/test/tabs/browser_multiselect_tabs_play.js (limited to 'browser/base/content/test/tabs/browser_multiselect_tabs_play.js') diff --git a/browser/base/content/test/tabs/browser_multiselect_tabs_play.js b/browser/base/content/test/tabs/browser_multiselect_tabs_play.js new file mode 100644 index 0000000000..281ed50c1b --- /dev/null +++ b/browser/base/content/test/tabs/browser_multiselect_tabs_play.js @@ -0,0 +1,254 @@ +/* Any copyright is dedicated to the Public Domain. + * https://creativecommons.org/publicdomain/zero/1.0/ */ + +/* + * 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); + } +}); -- cgit v1.2.3