summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/tabs/browser_multiselect_tabs_play.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/tabs/browser_multiselect_tabs_play.js')
-rw-r--r--browser/base/content/test/tabs/browser_multiselect_tabs_play.js254
1 files changed, 254 insertions, 0 deletions
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);
+ }
+});