Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/**
* Any copyright is dedicated to the Public Domain.
*
* 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(
);
const TEST_PAGE = TEST_ROOT + "get_user_media.html";
const { MockRegistrar } = ChromeUtils.importESModule(
);
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();
});