diff options
Diffstat (limited to 'browser/base/content/test/webrtc/browser_macos_indicator_hiding.js')
-rw-r--r-- | browser/base/content/test/webrtc/browser_macos_indicator_hiding.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/browser/base/content/test/webrtc/browser_macos_indicator_hiding.js b/browser/base/content/test/webrtc/browser_macos_indicator_hiding.js new file mode 100644 index 0000000000..65110ae655 --- /dev/null +++ b/browser/base/content/test/webrtc/browser_macos_indicator_hiding.js @@ -0,0 +1,145 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + * + * This test only runs for MacOS 14.0 and above to test the case for + * Bug 1857254 - MacOS 14 displays two camera in use icons in menu bar + */ + +"use strict"; + +const TEST_ROOT = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content/", + "https://example.com/" +); +const TEST_PAGE = TEST_ROOT + "get_user_media.html"; + +const { MockRegistrar } = ChromeUtils.importESModule( + "resource://testing-common/MockRegistrar.sys.mjs" +); + +var systemStatusBarService = { + counter: 0, + _reset() { + this.counter = 0; + }, + QueryInterface: ChromeUtils.generateQI(["nsISystemStatusBar"]), + + addItem(element) { + info( + `Add item call was fired for element ${element}, updating counter from ${ + this.counter + } to ${this.counter + 1}` + ); + this.counter += 1; + }, + + removeItem(element) { + info(`remove item call was fired for element ${element}`); + }, +}; + +/** + * Helper to test if the indicators are shown based on the params + * + * @param {Object} + * expectedCount (number) - expected number of indicators turned on + * cameraState (boolean) - if the camera indicator should be shown + * microphoneState (boolean) - if the microphone indicator should be shown + * screenShareState (string) - if the screen share indicator should be shown + * (SCREEN_SHARE or "") + */ +async function indicatorHelper({ + expectedCount, + cameraState, + microphoneState, + shareScreenState, +}) { + await BrowserTestUtils.withNewTab(TEST_PAGE, async browser => { + let indicatorPromise = promiseIndicatorWindow(); + + await shareDevices(browser, cameraState, microphoneState, shareScreenState); + await indicatorPromise; + }); + + is( + systemStatusBarService.counter, + expectedCount, + `${expectedCount} indicator(s) should be shown` + ); + + systemStatusBarService._reset(); +} + +add_task(async function testIconChanges() { + SpecialPowers.pushPrefEnv({ + set: [["privacy.webrtc.showIndicatorsOnMacos14AndAbove", false]], + }); + + let fakeStatusBarService = MockRegistrar.register( + "@mozilla.org/widget/systemstatusbar;1", + systemStatusBarService + ); + + systemStatusBarService._reset(); + + registerCleanupFunction(function () { + MockRegistrar.unregister(fakeStatusBarService); + }); + + info("Created mock system status bar service"); + + 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 }); + + await indicatorHelper({ + expectedCount: 0, + cameraState: true, + microphoneState: true, + shareScreenState: SHARE_SCREEN, + }); + await indicatorHelper({ + expectedCount: 0, + cameraState: true, + microphoneState: false, + shareScreenState: SHARE_SCREEN, + }); + + // In case we want to be able to see the indicator + SpecialPowers.pushPrefEnv({ + set: [["privacy.webrtc.showIndicatorsOnMacos14AndAbove", true]], + }); + + await indicatorHelper({ + expectedCount: 3, + cameraState: true, + microphoneState: true, + shareScreenState: SHARE_SCREEN, + }); + await indicatorHelper({ + expectedCount: 1, + cameraState: false, + microphoneState: false, + shareScreenState: SHARE_SCREEN, + }); + await indicatorHelper({ + expectedCount: 1, + cameraState: true, + microphoneState: false, + shareScreenState: "", + }); + await indicatorHelper({ + expectedCount: 1, + cameraState: false, + microphoneState: true, + shareScreenState: "", + }); + + await SpecialPowers.popPrefEnv(); +}); |