Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

  • This test gets skipped with pattern: os == 'mac' && os_version == '11.20' && arch == 'aarch64' OR os == 'mac' && os_version == '10.15' && processor == 'x86_64' OR os == 'mac' && os_version == '14.70' && processor == 'x86_64'
  • Manifest: browser/base/content/test/webrtc/browser.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
const TEST_ROOT = getRootDirectory(gTestPath).replace(
);
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.isHidden(
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.isHidden(
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.isHidden(
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
);
});
});