Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<script src="mediaStreamPlayback.js"></script>
</head>
<body>
<script>
"use strict";
createHTML({
title: "Test labeled devices or speakers aren't exposed in 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]);
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 });
stream.getTracks()[0].stop();
const list = await devices.enumerateDevices();
const labeledDevices = list.filter(({label}) => label != "");
is(labeledDevices.length, 0, "must be zero labeled devices after fake gUM");
const outputDevices = list.filter(({kind}) => kind == "audiooutput");
is(outputDevices.length, 0, "must be zero output devices after fake gUM");
}
{
// Check without `fake:true` to verify assumptions about existing devices.
let stream;
try {
stream = await devices.getUserMedia({ audio: true });
stream.getTracks()[0].stop();
} catch (e) {
if (e.name == "NotFoundError" &&
navigator.userAgent.includes("Mac OS X")) {
todo(false, "Expecting no real audioinput device on Mac test machines");
return;
}
throw e;
}
{
const list = await devices.enumerateDevices();
const audioDevices = list.filter(({kind}) => kind.includes("audio"));
ok(audioDevices.length, "have audio devices after real gUM");
const unlabeledAudioDevices = audioDevices.filter(({label}) => !label);
is(unlabeledAudioDevices.length, 0,
"must be zero unlabeled audio devices after real gUM");
const outputDevices = list.filter(({kind}) => kind == "audiooutput");
isnot(outputDevices.length, 0, "have output devices after real gUM");
}
}
});
</script>
</body>
</html>