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 --- .../tabs/browser_multiselect_tabs_mute_unmute.js | 336 +++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 browser/base/content/test/tabs/browser_multiselect_tabs_mute_unmute.js (limited to 'browser/base/content/test/tabs/browser_multiselect_tabs_mute_unmute.js') diff --git a/browser/base/content/test/tabs/browser_multiselect_tabs_mute_unmute.js b/browser/base/content/test/tabs/browser_multiselect_tabs_mute_unmute.js new file mode 100644 index 0000000000..83de966e0c --- /dev/null +++ b/browser/base/content/test/tabs/browser_multiselect_tabs_mute_unmute.js @@ -0,0 +1,336 @@ +const PREF_DELAY_AUTOPLAY = "media.block-autoplay-until-in-foreground"; + +add_task(async function setPref() { + await SpecialPowers.pushPrefEnv({ + set: [[PREF_DELAY_AUTOPLAY, true]], + }); +}); + +add_task(async function muteTabs_usingButton() { + 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]; + + await BrowserTestUtils.switchTab(gBrowser, tab0); + await play(tab0); + await play(tab1, false); + await play(tab2, false); + + // Multiselecting tab1, tab2 and tab3 + await BrowserTestUtils.switchTab(gBrowser, tab1); + await triggerClickOn(tab3, { shiftKey: true }); + + is(gBrowser.multiSelectedTabsCount, 3, "Three multiselected tabs"); + ok(!tab0.multiselected, "Tab0 is not multiselected"); + ok(!tab4.multiselected, "Tab4 is not multiselected"); + + // tab1,tab2 and tab3 should be multiselected. + for (let i = 1; i <= 3; i++) { + ok(tabs[i].multiselected, "Tab" + i + " is multiselected"); + } + + // All five tabs are unmuted + for (let i = 0; i < 5; i++) { + ok(!muted(tabs[i]), "Tab" + i + " is not muted"); + } + + // Mute tab0 which is not multiselected, thus other tabs muted state should not be affected + let tab0MuteAudioBtn = tab0.overlayIcon; + await test_mute_tab(tab0, tab0MuteAudioBtn, true); + + ok(muted(tab0), "Tab0 is muted"); + for (let i = 1; i <= 4; i++) { + ok(!muted(tabs[i]), "Tab" + i + " is not muted"); + } + + // Now we multiselect tab0 + await triggerClickOn(tab0, { ctrlKey: true }); + + // tab0, tab1, tab2, tab3 are multiselected + for (let i = 0; i <= 3; i++) { + ok(tabs[i].multiselected, "tab" + i + " is multiselected"); + } + ok(!tab4.multiselected, "tab4 is not multiselected"); + + // Check mute state + ok(muted(tab0), "Tab0 is still muted"); + ok(!muted(tab1), "Tab1 is not muted"); + ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked"); + ok(activeMediaBlocked(tab2), "Tab2 is media-blocked"); + ok(!muted(tab3), "Tab3 is not muted"); + ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked"); + ok(!muted(tab4), "Tab4 is not muted"); + ok(!activeMediaBlocked(tab4), "Tab4 is not activemedia-blocked"); + + // Mute tab1 which is multiselected, thus other multiselected tabs should be affected too + // in the following way: + // a) muted tabs (tab0) will remain muted. + // b) unmuted tabs (tab1, tab3) will become muted. + // b) media-blocked tabs (tab2) will remain media-blocked. + // However tab4 (unmuted) which is not multiselected should not be affected. + let tab1MuteAudioBtn = tab1.overlayIcon; + await test_mute_tab(tab1, tab1MuteAudioBtn, true); + + // Check mute state + ok(muted(tab0), "Tab0 is still muted"); + ok(muted(tab1), "Tab1 is muted"); + ok(activeMediaBlocked(tab2), "Tab2 is still media-blocked"); + ok(muted(tab3), "Tab3 is now muted"); + ok(!muted(tab4), "Tab4 is not muted"); + ok(!activeMediaBlocked(tab4), "Tab4 is not activemedia-blocked"); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } +}); + +add_task(async function unmuteTabs_usingButton() { + 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]; + + await BrowserTestUtils.switchTab(gBrowser, tab0); + await play(tab0); + await play(tab1, false); + await play(tab2, false); + + // Mute tab3 and tab4 + await toggleMuteAudio(tab3, true); + await toggleMuteAudio(tab4, true); + + // Multiselecting tab0, tab1, tab2 and tab3 + 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"); + + // Check tabs mute state + ok(!muted(tab0), "Tab0 is not muted"); + ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked"); + ok(activeMediaBlocked(tab1), "Tab1 is media-blocked"); + ok(activeMediaBlocked(tab2), "Tab2 is media-blocked"); + ok(muted(tab3), "Tab3 is muted"); + ok(muted(tab4), "Tab4 is muted"); + is(gBrowser.selectedTab, tab0, "Tab0 is active"); + + // unmute tab0 which is multiselected, thus other multiselected tabs should be affected too + // in the following way: + // a) muted tabs (tab3) will become unmuted. + // b) unmuted tabs (tab0) will remain unmuted. + // c) media-blocked tabs (tab1, tab2) will remain blocked. + // However tab4 (muted) which is not multiselected should not be affected. + let tab3MuteAudioBtn = tab3.overlayIcon; + await test_mute_tab(tab3, tab3MuteAudioBtn, false); + + ok(!muted(tab0), "Tab0 is not muted"); + ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked"); + ok(!muted(tab1), "Tab1 is not muted"); + ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked"); + ok(!muted(tab2), "Tab2 is not muted"); + ok(activeMediaBlocked(tab2), "Tab2 is activemedia-blocked"); + ok(!muted(tab3), "Tab3 is not muted"); + ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked"); + ok(muted(tab4), "Tab4 is muted"); + is(gBrowser.selectedTab, tab0, "Tab0 is active"); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } +}); + +add_task(async function muteAndUnmuteTabs_usingKeyboard() { + 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]; + + await BrowserTestUtils.switchTab(gBrowser, tab0); + + let mutedPromise = get_wait_for_mute_promise(tab0, true); + EventUtils.synthesizeKey("M", { ctrlKey: true }); + await mutedPromise; + ok(muted(tab0), "Tab0 should be muted"); + ok(!muted(tab1), "Tab1 should not be muted"); + ok(!muted(tab2), "Tab2 should not be muted"); + ok(!muted(tab3), "Tab3 should not be muted"); + ok(!muted(tab4), "Tab4 should not be muted"); + + // Multiselecting tab0, tab1, tab2 and tab3 + 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"); + + mutedPromise = get_wait_for_mute_promise(tab0, false); + EventUtils.synthesizeKey("M", { ctrlKey: true }); + await mutedPromise; + ok(!muted(tab0), "Tab0 should not be muted"); + ok(!muted(tab1), "Tab1 should not be muted"); + ok(!muted(tab2), "Tab2 should not be muted"); + ok(!muted(tab3), "Tab3 should not be muted"); + ok(!muted(tab4), "Tab4 should not be muted"); + + mutedPromise = get_wait_for_mute_promise(tab0, true); + EventUtils.synthesizeKey("M", { ctrlKey: true }); + await mutedPromise; + ok(muted(tab0), "Tab0 should be muted"); + ok(muted(tab1), "Tab1 should be muted"); + ok(muted(tab2), "Tab2 should be muted"); + ok(muted(tab3), "Tab3 should be muted"); + ok(!muted(tab4), "Tab4 should not be muted"); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } +}); + +add_task(async function playTabs_usingButton() { + 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]; + + await BrowserTestUtils.switchTab(gBrowser, tab0); + await play(tab0); + await play(tab1, false); + await play(tab2, false); + + // Multiselecting tab0, tab1, tab2 and tab3. + await triggerClickOn(tab3, { shiftKey: true }); + + // Mute tab0 and tab4 + await toggleMuteAudio(tab0, true); + await toggleMuteAudio(tab4, 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"); + + // Check mute state + ok(muted(tab0), "Tab0 is muted"); + ok(activeMediaBlocked(tab1), "Tab1 is media-blocked"); + ok(activeMediaBlocked(tab2), "Tab2 is media-blocked"); + ok(!muted(tab3), "Tab3 is not muted"); + ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked"); + ok(muted(tab4), "Tab4 is muted"); + is(gBrowser.selectedTab, tab0, "Tab0 is active"); + + // play tab2 which is multiselected, thus other multiselected tabs should be affected too + // in the following way: + // a) muted tabs (tab0) will remain muted. + // b) unmuted tabs (tab3) will remain unmuted. + // c) media-blocked tabs (tab1, tab2) will become unblocked. + // However tab4 (muted) which is not multiselected should not be affected. + let tab2MuteAudioBtn = tab2.overlayIcon; + await test_mute_tab(tab2, tab2MuteAudioBtn, false); + + ok(muted(tab0), "Tab0 is muted"); + ok(!activeMediaBlocked(tab0), "Tab0 is not activemedia-blocked"); + ok(!muted(tab1), "Tab1 is not muted"); + ok(!activeMediaBlocked(tab1), "Tab1 is not activemedia-blocked"); + ok(!muted(tab2), "Tab2 is not muted"); + ok(!activeMediaBlocked(tab2), "Tab2 is not activemedia-blocked"); + ok(!muted(tab3), "Tab3 is not muted"); + ok(!activeMediaBlocked(tab3), "Tab3 is not activemedia-blocked"); + ok(muted(tab4), "Tab4 is muted"); + is(gBrowser.selectedTab, tab0, "Tab0 is active"); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } +}); + +add_task(async function checkTabContextMenu() { + let tab0 = await addMediaTab(); + let tab1 = await addMediaTab(); + let tab2 = await addMediaTab(); + let tab3 = await addMediaTab(); + let tabs = [tab0, tab1, tab2, tab3]; + + let menuItemToggleMuteTab = document.getElementById("context_toggleMuteTab"); + let menuItemToggleMuteSelectedTabs = document.getElementById( + "context_toggleMuteSelectedTabs" + ); + + await play(tab0, false); + await toggleMuteAudio(tab0, true); + await play(tab1, false); + await toggleMuteAudio(tab2, true); + + // multiselect tab0, tab1, tab2. + 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"); + + // Check mute state for tabs + ok(muted(tab0), "Tab0 is muted"); + ok(activeMediaBlocked(tab0), "Tab0 is activemedia-blocked"); + ok(activeMediaBlocked(tab1), "Tab1 is activemedia-blocked"); + ok(muted(tab2), "Tab2 is muted"); + ok(!muted(tab3, "Tab3 is not muted")); + + const l10nIds = [ + "tabbrowser-context-unmute-selected-tabs", + "tabbrowser-context-mute-selected-tabs", + "tabbrowser-context-unmute-selected-tabs", + ]; + + for (let i = 0; i <= 2; i++) { + updateTabContextMenu(tabs[i]); + ok( + menuItemToggleMuteTab.hidden, + "toggleMuteAudio menu for one tab is hidden - contextTab" + i + ); + ok( + !menuItemToggleMuteSelectedTabs.hidden, + "toggleMuteAudio menu for selected tab is not hidden - contextTab" + i + ); + is( + menuItemToggleMuteSelectedTabs.dataset.l10nId, + l10nIds[i], + l10nIds[i] + " should be shown" + ); + } + + updateTabContextMenu(tab3); + ok( + !menuItemToggleMuteTab.hidden, + "toggleMuteAudio menu for one tab is not hidden" + ); + ok( + menuItemToggleMuteSelectedTabs.hidden, + "toggleMuteAudio menu for selected tab is hidden" + ); + + for (let tab of tabs) { + BrowserTestUtils.removeTab(tab); + } +}); -- cgit v1.2.3