summaryrefslogtreecommitdiffstats
path: root/toolkit/components/pictureinpicture/tests/browser_audioScrubber.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /toolkit/components/pictureinpicture/tests/browser_audioScrubber.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/pictureinpicture/tests/browser_audioScrubber.js')
-rw-r--r--toolkit/components/pictureinpicture/tests/browser_audioScrubber.js262
1 files changed, 262 insertions, 0 deletions
diff --git a/toolkit/components/pictureinpicture/tests/browser_audioScrubber.js b/toolkit/components/pictureinpicture/tests/browser_audioScrubber.js
new file mode 100644
index 0000000000..d13d0d13ad
--- /dev/null
+++ b/toolkit/components/pictureinpicture/tests/browser_audioScrubber.js
@@ -0,0 +1,262 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const IMPROVED_CONTROLS_ENABLED_PREF =
+ "media.videocontrols.picture-in-picture.improved-video-controls.enabled";
+
+const videoID = "with-controls";
+
+async function getVideoVolume(browser, videoID) {
+ return SpecialPowers.spawn(browser, [videoID], async videoID => {
+ return content.document.getElementById(videoID).volume;
+ });
+}
+
+async function getVideoMuted(browser, videoID) {
+ return SpecialPowers.spawn(browser, [videoID], async videoID => {
+ return content.document.getElementById(videoID).muted;
+ });
+}
+
+add_task(async function test_audioScrubber() {
+ await SpecialPowers.pushPrefEnv({
+ set: [[IMPROVED_CONTROLS_ENABLED_PREF, true]],
+ });
+
+ await BrowserTestUtils.withNewTab(
+ {
+ url: TEST_PAGE,
+ gBrowser,
+ },
+ async browser => {
+ await ensureVideosReady(browser);
+
+ let pipWin = await triggerPictureInPicture(browser, videoID);
+ ok(pipWin, "Got Picture-in-Picture window.");
+
+ let ratio = pipWin.innerWidth / pipWin.innerHeight;
+ let height = 750;
+ let width = Math.floor(ratio * height);
+ if (pipWin.innerHeight < height || pipWin.innerWidth < width) {
+ // Resize the PiP window so we know the audio scrubber is visible
+ let resizePromise = BrowserTestUtils.waitForEvent(pipWin, "resize");
+ pipWin.resizeTo(width, height);
+ await resizePromise;
+ }
+
+ let audioScrubber = pipWin.document.getElementById("audio-scrubber");
+ audioScrubber.focus();
+
+ // Volume should be 1 and video should not be muted when opening this video
+ let actualVolume = await getVideoVolume(browser, videoID);
+ let expectedVolume = 1;
+
+ let actualMuted = await getVideoMuted(browser, videoID);
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ ok(!actualMuted, "Video is not muted");
+
+ let volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+
+ // Test that left arrow key changes volume by -0.1
+ EventUtils.synthesizeKey("KEY_ArrowLeft", {}, pipWin);
+
+ await volumeChangePromise;
+
+ actualVolume = await getVideoVolume(browser, videoID);
+ expectedVolume = 0.9;
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ // Test that right arrow key changes volume by +0.1 and does not exceed 1
+ EventUtils.synthesizeKey("KEY_ArrowRight", {}, pipWin);
+ EventUtils.synthesizeKey("KEY_ArrowRight", {}, pipWin);
+ EventUtils.synthesizeKey("KEY_ArrowRight", {}, pipWin);
+
+ actualVolume = await getVideoVolume(browser, videoID);
+ expectedVolume = 1;
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ // Test that the mouse can move the audio scrubber to 0.5
+ let rect = audioScrubber.getBoundingClientRect();
+
+ volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+
+ EventUtils.synthesizeMouse(
+ audioScrubber,
+ rect.width / 2,
+ rect.height / 2,
+ {},
+ pipWin
+ );
+
+ await volumeChangePromise;
+
+ actualVolume = await getVideoVolume(browser, videoID);
+ expectedVolume = 0.5;
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ 0.01,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ // Test muting and unmuting the video
+ let muteButton = pipWin.document.getElementById("audio");
+ volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+ muteButton.click();
+ await volumeChangePromise;
+
+ ok(
+ await getVideoMuted(browser, videoID),
+ "The video is muted aftering clicking the mute button"
+ );
+ is(
+ audioScrubber.max,
+ "0",
+ "The max of the audio scrubber is 0, so the volume slider appears that the volume is 0"
+ );
+
+ volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+ muteButton.click();
+ await volumeChangePromise;
+
+ ok(
+ !(await getVideoMuted(browser, videoID)),
+ "The video is muted aftering clicking the mute button"
+ );
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ 0.01,
+ `The volume is still ${actualVolume}.`
+ );
+
+ volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+
+ // Test that the audio scrubber can be dragged from 0.5 to 0 and the video gets muted
+ EventUtils.synthesizeMouse(
+ audioScrubber,
+ rect.width / 2,
+ rect.height / 2,
+ { type: "mousedown" },
+ pipWin
+ );
+ EventUtils.synthesizeMouse(
+ audioScrubber,
+ 0,
+ rect.height / 2,
+ { type: "mousemove" },
+ pipWin
+ );
+ EventUtils.synthesizeMouse(
+ audioScrubber,
+ 0,
+ rect.height / 2,
+ { type: "mouseup" },
+ pipWin
+ );
+
+ await volumeChangePromise;
+
+ actualVolume = await getVideoVolume(browser, videoID);
+ expectedVolume = 0;
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ ok(
+ await getVideoMuted(browser, videoID),
+ "Video is now muted because slider was moved to 0"
+ );
+
+ // Test that the left arrow key does not unmute the video and the volume remains at 0
+ EventUtils.synthesizeKey("KEY_ArrowLeft", {}, pipWin);
+ EventUtils.synthesizeKey("KEY_ArrowLeft", {}, pipWin);
+
+ actualVolume = await getVideoVolume(browser, videoID);
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ ok(
+ await getVideoMuted(browser, videoID),
+ "Video is now muted because slider is still at 0"
+ );
+
+ volumeChangePromise = BrowserTestUtils.waitForContentEvent(
+ browser,
+ "volumechange",
+ true
+ );
+
+ // Test that the right arrow key will increase the volume by +0.1 and will unmute the video
+ EventUtils.synthesizeKey("KEY_ArrowRight", {}, pipWin);
+
+ await volumeChangePromise;
+
+ actualVolume = await getVideoVolume(browser, videoID);
+ expectedVolume = 0.1;
+
+ isfuzzy(
+ actualVolume,
+ expectedVolume,
+ Number.EPSILON,
+ `The actual volume ${actualVolume}. The expected volume ${expectedVolume}`
+ );
+
+ ok(
+ !(await getVideoMuted(browser, videoID)),
+ "Video is no longer muted because we moved the slider"
+ );
+ }
+ );
+});