forked from mirrors/gecko-dev
175 lines
5.3 KiB
JavaScript
175 lines
5.3 KiB
JavaScript
/* 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
|
|
);
|
|
});
|
|
});
|