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/webrtc/browser_stop_sharing_button.js | 175 +++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 browser/base/content/test/webrtc/browser_stop_sharing_button.js (limited to 'browser/base/content/test/webrtc/browser_stop_sharing_button.js') diff --git a/browser/base/content/test/webrtc/browser_stop_sharing_button.js b/browser/base/content/test/webrtc/browser_stop_sharing_button.js new file mode 100644 index 0000000000..17ab66abc4 --- /dev/null +++ b/browser/base/content/test/webrtc/browser_stop_sharing_button.js @@ -0,0 +1,175 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const TEST_ROOT = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content/", + "https://example.com/" +); +const TEST_PAGE = TEST_ROOT + "get_user_media.html"; + +add_setup(async function () { + let prefs = [ + [PREF_PERMISSION_FAKE, true], + [PREF_AUDIO_LOOPBACK, ""], + [PREF_VIDEO_LOOPBACK, ""], + [PREF_FAKE_STREAMS, true], + [PREF_FOCUS_SOURCE, false], + ]; + await SpecialPowers.pushPrefEnv({ set: prefs }); +}); + +/** + * Tests that if the user chooses to "Stop Sharing" a display while + * also sharing their microphone or camera, that only the display + * stream is stopped. + */ +add_task(async function test_stop_sharing() { + await BrowserTestUtils.withNewTab(TEST_PAGE, async browser => { + let indicatorPromise = promiseIndicatorWindow(); + + await shareDevices( + browser, + true /* camera */, + true /* microphone */, + SHARE_SCREEN + ); + + let indicator = await indicatorPromise; + + let stopSharingButton = indicator.document.getElementById("stop-sharing"); + let stopSharingPromise = expectObserverCalled("recording-device-events"); + stopSharingButton.click(); + await stopSharingPromise; + + // Ensure that we're still sharing the other streams. + await checkSharingUI({ audio: true, video: true }); + + // Ensure that the "display-share" section of the indicator is now hidden + Assert.ok( + BrowserTestUtils.is_hidden( + indicator.document.getElementById("display-share") + ), + "The display-share section of the indicator should now be hidden." + ); + }); +}); + +/** + * Tests that if the user chooses to "Stop Sharing" a display while + * sharing their display on multiple sites, all of those display sharing + * streams are closed. + */ +add_task(async function test_stop_sharing_multiple() { + let indicatorPromise = promiseIndicatorWindow(); + + info("Opening first tab"); + let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_PAGE); + info("Sharing camera, microphone and screen"); + await shareDevices(tab1.linkedBrowser, true, true, SHARE_SCREEN); + + info("Opening second tab"); + let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_PAGE); + info("Sharing camera and screen"); + await shareDevices(tab2.linkedBrowser, true, false, SHARE_SCREEN); + + let indicator = await indicatorPromise; + + let stopSharingButton = indicator.document.getElementById("stop-sharing"); + let stopSharingPromise = TestUtils.waitForCondition(() => { + return !webrtcUI.showScreenSharingIndicator; + }); + stopSharingButton.click(); + await stopSharingPromise; + + Assert.equal(gBrowser.selectedTab, tab2, "Should have tab2 selected."); + await checkSharingUI({ audio: false, video: true }, window, { + audio: true, + video: true, + }); + BrowserTestUtils.removeTab(tab2); + + Assert.equal(gBrowser.selectedTab, tab1, "Should have tab1 selected."); + await checkSharingUI({ audio: true, video: true }, window, { + audio: true, + video: true, + }); + + // Ensure that the "display-share" section of the indicator is now hidden + Assert.ok( + BrowserTestUtils.is_hidden( + indicator.document.getElementById("display-share") + ), + "The display-share section of the indicator should now be hidden." + ); + + BrowserTestUtils.removeTab(tab1); +}); + +/** + * Tests that if the user chooses to "Stop Sharing" a display, persistent + * permissions are not removed for camera or microphone devices. + */ +add_task(async function test_keep_permissions() { + await BrowserTestUtils.withNewTab(TEST_PAGE, async browser => { + let indicatorPromise = promiseIndicatorWindow(); + + await shareDevices( + browser, + true /* camera */, + true /* microphone */, + SHARE_SCREEN, + true /* remember */ + ); + + let indicator = await indicatorPromise; + + let stopSharingButton = indicator.document.getElementById("stop-sharing"); + let stopSharingPromise = expectObserverCalled("recording-device-events"); + stopSharingButton.click(); + await stopSharingPromise; + + // Ensure that we're still sharing the other streams. + await checkSharingUI({ audio: true, video: true }, undefined, undefined, { + audio: { scope: SitePermissions.SCOPE_PERSISTENT }, + video: { scope: SitePermissions.SCOPE_PERSISTENT }, + }); + + // Ensure that the "display-share" section of the indicator is now hidden + Assert.ok( + BrowserTestUtils.is_hidden( + indicator.document.getElementById("display-share") + ), + "The display-share section of the indicator should now be hidden." + ); + + let { state: micState, scope: micScope } = SitePermissions.getForPrincipal( + browser.contentPrincipal, + "microphone", + browser + ); + + Assert.equal(micState, SitePermissions.ALLOW); + Assert.equal(micScope, SitePermissions.SCOPE_PERSISTENT); + + let { state: camState, scope: camScope } = SitePermissions.getForPrincipal( + browser.contentPrincipal, + "camera", + browser + ); + Assert.equal(camState, SitePermissions.ALLOW); + Assert.equal(camScope, SitePermissions.SCOPE_PERSISTENT); + + SitePermissions.removeFromPrincipal( + browser.contentPrincipal, + "camera", + browser + ); + SitePermissions.removeFromPrincipal( + browser.contentPrincipal, + "microphone", + browser + ); + }); +}); -- cgit v1.2.3