Bug 1186209 - Check for VTYPE_EMPTY_ARRAY in enumerateDevices + test. r=jesup

This commit is contained in:
Jan-Ivar Bruaroey 2015-07-22 13:04:12 -04:00
parent bc51c92551
commit f9ce6023ba
2 changed files with 28 additions and 20 deletions

View File

@ -52,19 +52,21 @@ public:
OnSuccess(nsIVariant* aDevices) override
{
// Cribbed from MediaPermissionGonk.cpp
nsIID elementIID;
uint16_t elementType;
// Create array for nsIMediaDevice
nsTArray<nsCOMPtr<nsIMediaDevice>> devices;
// Contain the fumes
{
uint16_t vtype;
nsresult rv = aDevices->GetDataType(&vtype);
NS_ENSURE_SUCCESS(rv, rv);
if (vtype != nsIDataType::VTYPE_EMPTY_ARRAY) {
nsIID elementIID;
uint16_t elementType;
void* rawArray;
uint32_t arrayLen;
nsresult rv;
rv = aDevices->GetAsArray(&elementType, &elementIID, &arrayLen, &rawArray);
NS_ENSURE_SUCCESS(rv, rv);
if (elementType != nsIDataType::VTYPE_INTERFACE) {
free(rawArray);
return NS_ERROR_FAILURE;
@ -78,6 +80,7 @@ public:
}
free(rawArray); // explicitly free memory from nsIVariant::GetAsArray
}
}
nsTArray<nsRefPtr<MediaDeviceInfo>> infos;
for (auto& device : devices) {
nsString type;

View File

@ -21,10 +21,10 @@ function mustFailWith(msg, reason, f) {
e => is(e.name, reason, msg + " must fail: " + e.message));
}
var pushPrefs = dict => new Promise(res => SpecialPowers.pushPrefEnv(dict, res));
var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
runTest(() =>
pushPrefs({ set : [["media.navigator.streams.fake", true]] })
pushPrefs(["media.navigator.streams.fake", true])
.then(() => navigator.mediaDevices.enumerateDevices())
.then(devices => {
ok(devices.length > 0, "At least one device found");
@ -58,7 +58,12 @@ runTest(() =>
() => navigator.mediaDevices.getUserMedia({
audio: { deviceId: { exact: "unknown9qHr8B0JIbcHlbl9xR+jMbZZ8WyoPfpCXPfc=" } },
fake: true,
}))));
})))
// Check the special case of no devices found (these prefs override fake).
.then(() => pushPrefs(["media.audio_loopback_dev", "none"],
["media.video_loopback_dev", "none"]))
.then(() => navigator.mediaDevices.enumerateDevices())
.then(devices => ok(devices.length === 0, "No devices found")));
</script>
</pre>