Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const permissionError =
"error: NotAllowedError: The request is not allowed " +
"by the user agent or the platform in the current context.";
const CAMERA_PREF = "permissions.default.camera";
const MICROPHONE_PREF = "permissions.default.microphone";
var gTests = [
{
desc: "getUserMedia audio+video: globally blocking camera",
run: async function checkAudioVideo() {
Services.prefs.setIntPref(CAMERA_PREF, SitePermissions.BLOCK);
// Requesting audio+video shouldn't work.
await Promise.all([
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:deny"),
expectObserverCalled("recording-window-ended"),
promiseMessage(permissionError),
promiseRequestDevice(true, true),
]);
await checkNotSharing();
// Requesting only video shouldn't work.
await Promise.all([
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:deny"),
expectObserverCalled("recording-window-ended"),
promiseMessage(permissionError),
promiseRequestDevice(false, true),
]);
await checkNotSharing();
// Requesting audio should work.
const observerPromise = expectObserverCalled("getUserMedia:request");
const promise = promisePopupNotificationShown("webRTC-shareDevices");
await promiseRequestDevice(true);
await promise;
await observerPromise;
is(
PopupNotifications.getNotification("webRTC-shareDevices").anchorID,
"webRTC-shareMicrophone-notification-icon",
"anchored to mic icon"
);
checkDeviceSelectors(["microphone"]);
let indicator = promiseIndicatorWindow();
let observerPromise1 = expectObserverCalled(
"getUserMedia:response:allow"
);
let observerPromise2 = expectObserverCalled("recording-device-events");
await promiseMessage("ok", () => {
PopupNotifications.panel.firstElementChild.button.click();
});
await observerPromise1;
await observerPromise2;
Assert.deepEqual(
await getMediaCaptureState(),
{ audio: true },
"expected microphone to be shared"
);
await indicator;
await checkSharingUI({ audio: true });
await closeStream();
Services.prefs.clearUserPref(CAMERA_PREF);
},
},
{
desc: "getUserMedia video: globally blocking camera + local exception",
run: async function checkAudioVideo() {
let browser = gBrowser.selectedBrowser;
Services.prefs.setIntPref(CAMERA_PREF, SitePermissions.BLOCK);
// Overwrite the permission for that URI, requesting video should work again.
PermissionTestUtils.add(
browser.currentURI,
"camera",
Services.perms.ALLOW_ACTION
);
// Requesting video should work.
let indicator = promiseIndicatorWindow();
let promises = [
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:allow"),
expectObserverCalled("recording-device-events"),
];
let promise = promiseMessage("ok");
await promiseRequestDevice(false, true);
await promise;
await Promise.all(promises);
await indicator;
await checkSharingUI({ video: true }, undefined, undefined, {
video: { scope: SitePermissions.SCOPE_PERSISTENT },
});
await closeStream();
PermissionTestUtils.remove(browser.currentURI, "camera");
Services.prefs.clearUserPref(CAMERA_PREF);
},
},
{
desc: "getUserMedia audio+video: globally blocking microphone",
run: async function checkAudioVideo() {
Services.prefs.setIntPref(MICROPHONE_PREF, SitePermissions.BLOCK);
// Requesting audio+video shouldn't work.
await Promise.all([
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:deny"),
expectObserverCalled("recording-window-ended"),
promiseMessage(permissionError),
promiseRequestDevice(true, true),
]);
await checkNotSharing();
// Requesting only audio shouldn't work.
await Promise.all([
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:deny"),
expectObserverCalled("recording-window-ended"),
promiseMessage(permissionError),
promiseRequestDevice(true),
]);
// Requesting video should work.
const observerPromise = expectObserverCalled("getUserMedia:request");
const promise = promisePopupNotificationShown("webRTC-shareDevices");
await promiseRequestDevice(false, true);
await promise;
await observerPromise;
is(
PopupNotifications.getNotification("webRTC-shareDevices").anchorID,
"webRTC-shareDevices-notification-icon",
"anchored to device icon"
);
checkDeviceSelectors(["camera"]);
let indicator = promiseIndicatorWindow();
let observerPromise1 = expectObserverCalled(
"getUserMedia:response:allow"
);
let observerPromise2 = expectObserverCalled("recording-device-events");
await promiseMessage("ok", () => {
PopupNotifications.panel.firstElementChild.button.click();
});
await observerPromise1;
await observerPromise2;
Assert.deepEqual(
await getMediaCaptureState(),
{ video: true },
"expected camera to be shared"
);
await indicator;
await checkSharingUI({ video: true });
await closeStream();
Services.prefs.clearUserPref(MICROPHONE_PREF);
},
},
{
desc: "getUserMedia audio: globally blocking microphone + local exception",
run: async function checkAudioVideo() {
let browser = gBrowser.selectedBrowser;
Services.prefs.setIntPref(MICROPHONE_PREF, SitePermissions.BLOCK);
// Overwrite the permission for that URI, requesting video should work again.
PermissionTestUtils.add(
browser.currentURI,
"microphone",
Services.perms.ALLOW_ACTION
);
// Requesting audio should work.
let indicator = promiseIndicatorWindow();
let promises = [
expectObserverCalled("getUserMedia:request"),
expectObserverCalled("getUserMedia:response:allow"),
expectObserverCalled("recording-device-events"),
];
let promise = promiseMessage("ok");
await promiseRequestDevice(true);
await promise;
await Promise.all(promises);
await indicator;
await checkSharingUI({ audio: true }, undefined, undefined, {
audio: { scope: SitePermissions.SCOPE_PERSISTENT },
});
await closeStream();
PermissionTestUtils.remove(browser.currentURI, "microphone");
Services.prefs.clearUserPref(MICROPHONE_PREF);
},
},
];
add_task(async function test() {
await runTests(gTests);
});