зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1743524 don't expose speaker device info after getUserMedia({audio: true, fake: true}) r=jib
Differential Revision: https://phabricator.services.mozilla.com/D132434
This commit is contained in:
Родитель
079496ab6c
Коммит
a775058a48
|
@ -93,11 +93,13 @@ already_AddRefed<Promise> MediaDevices::GetUserMedia(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool haveFake = aConstraints.mFake.WasPassed() && aConstraints.mFake.Value();
|
||||||
const OwningBooleanOrMediaTrackConstraints& audio = aConstraints.mAudio;
|
const OwningBooleanOrMediaTrackConstraints& audio = aConstraints.mAudio;
|
||||||
bool isMicrophone =
|
bool isMicrophone =
|
||||||
audio.IsBoolean()
|
!haveFake &&
|
||||||
? audio.GetAsBoolean()
|
(audio.IsBoolean()
|
||||||
: !audio.GetAsMediaTrackConstraints().mMediaSource.WasPassed();
|
? audio.GetAsBoolean()
|
||||||
|
: !audio.GetAsMediaTrackConstraints().mMediaSource.WasPassed());
|
||||||
RefPtr<MediaDevices> self(this);
|
RefPtr<MediaDevices> self(this);
|
||||||
MediaManager::Get()
|
MediaManager::Get()
|
||||||
->GetUserMedia(owner, aConstraints, aCallerType)
|
->GetUserMedia(owner, aConstraints, aCallerType)
|
||||||
|
|
|
@ -418,6 +418,15 @@ function pushPrefs(...p) {
|
||||||
return SpecialPowers.pushPrefEnv({ set: p });
|
return SpecialPowers.pushPrefEnv({ set: p });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function withPrefs(prefs, func) {
|
||||||
|
await SpecialPowers.pushPrefEnv({ set: prefs });
|
||||||
|
try {
|
||||||
|
return await func();
|
||||||
|
} finally {
|
||||||
|
await SpecialPowers.popPrefEnv();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function setupEnvironment() {
|
function setupEnvironment() {
|
||||||
var defaultMochitestPrefs = {
|
var defaultMochitestPrefs = {
|
||||||
set: [
|
set: [
|
||||||
|
|
|
@ -61,6 +61,7 @@ scheme=http
|
||||||
[test_enumerateDevices.html]
|
[test_enumerateDevices.html]
|
||||||
[test_enumerateDevices_navigation.html]
|
[test_enumerateDevices_navigation.html]
|
||||||
skip-if = true # Disabled because it is a racy test and causes timeouts, see bug 1650932
|
skip-if = true # Disabled because it is a racy test and causes timeouts, see bug 1650932
|
||||||
|
[test_enumerateDevices_getUserMediaFake.html]
|
||||||
[test_groupId.html]
|
[test_groupId.html]
|
||||||
[test_setSinkId.html]
|
[test_setSinkId.html]
|
||||||
skip-if =
|
skip-if =
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script src="mediaStreamPlayback.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
createHTML({
|
||||||
|
title: "Test enumerateDevices() after fake getUserMedia()",
|
||||||
|
bug: "1743524"
|
||||||
|
});
|
||||||
|
|
||||||
|
runTest(async () => {
|
||||||
|
await pushPrefs(
|
||||||
|
["media.setsinkid.enabled", true],
|
||||||
|
// This test uses real devices because fake devices are not grouped with
|
||||||
|
// audiooutput devices.
|
||||||
|
["media.navigator.streams.fake", false],
|
||||||
|
// Non empty media.audio_loopback_dev would disable fake:true for streams
|
||||||
|
// returned from getUserMedia().
|
||||||
|
["media.audio_loopback_dev", ""]);
|
||||||
|
const devices = navigator.mediaDevices;
|
||||||
|
{
|
||||||
|
// `fake:true` means that getUserMedia() resolves without any permission
|
||||||
|
// check, and so this should not be sufficient to expose real device info.
|
||||||
|
const stream = await devices.getUserMedia({ audio: true, fake: true });
|
||||||
|
// permission.disabled exposes labels - bug 1528042
|
||||||
|
const list = await withPrefs(
|
||||||
|
[["media.navigator.permission.disabled", false]],
|
||||||
|
async () => devices.enumerateDevices());
|
||||||
|
stream.getTracks()[0].stop();
|
||||||
|
const labeledDevices = list.filter(({label}) => label != "");
|
||||||
|
is(labeledDevices.length, 0, "number of labeled devices after fake gUM");
|
||||||
|
const outputDevices = list.filter(({kind}) => kind == "audiooutput");
|
||||||
|
is(outputDevices.length, 0, "number of output devices after fake gUM");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// Check without `fake:true` to verify assumptions about existing devices.
|
||||||
|
const streamPromise = devices.getUserMedia({ audio: true });
|
||||||
|
if (navigator.userAgent.includes("Mac OS X")) {
|
||||||
|
let rejection = "resolved";
|
||||||
|
try {
|
||||||
|
await streamPromise;
|
||||||
|
} catch (e) {
|
||||||
|
rejection = e.name;
|
||||||
|
}
|
||||||
|
todo_isnot(rejection, "NotFoundError",
|
||||||
|
"Expecting no real audioinput device on Mac.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const stream = await streamPromise;
|
||||||
|
{
|
||||||
|
const list = await devices.enumerateDevices();
|
||||||
|
// input labels disappear when the track is stopped - bug 1528042
|
||||||
|
const unlabeledAudioDevices =
|
||||||
|
list.filter(({ kind, label }) => {
|
||||||
|
return kind != "videoinput" && label == ""
|
||||||
|
});
|
||||||
|
is(unlabeledAudioDevices.length, 0,
|
||||||
|
"number of unlabeled audio devices after real gUM");
|
||||||
|
}
|
||||||
|
stream.getTracks()[0].stop();
|
||||||
|
const list = await devices.enumerateDevices();
|
||||||
|
const outputDevices = list.filter(({ kind, label }) => {
|
||||||
|
return kind == "audiooutput" && label != "";
|
||||||
|
});
|
||||||
|
isnot(outputDevices.length, 0, "number of output devices after real gUM");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Загрузка…
Ссылка в новой задаче