blob: 1bc1f9b5740e30ef3635ed76f974c535563ac9da [file] [log] [blame]
<!doctype html>
<title>MediaStreamTrack GetSettings</title>
<p class="instructions">When prompted, accept to share your video stream.</p>
<meta name=timeout content=long>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
'use strict'
// https://w3c.github.io/mediacapture-main/archives/20170605/getusermedia.html
async function createTrackAndGetSettings(t, kind) {
const constraints = {};
constraints[kind] = true;
const stream = await navigator.mediaDevices.getUserMedia(constraints);
assert_equals(stream.getTracks().length, 1);
t.add_cleanup(() => stream.getTracks()[0].stop());
return stream.getTracks()[0].getSettings();
}
promise_test(async t => {
const mediaStream1 = await navigator.mediaDevices.getUserMedia({
video: true,
audio: false,
});
t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
const settings1 = mediaStream1.getVideoTracks()[0].getSettings();
const mediaStream2 = await navigator.mediaDevices.getUserMedia({
video: {
deviceId: {exact: settings1.deviceId},
},
audio: false
});
t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
const settings2 = mediaStream2.getVideoTracks()[0].getSettings();
assert_equals(settings1.deviceId, settings2.deviceId);
}, 'A device can be opened twice and have the same device ID');
promise_test(async t => {
const mediaStream1 = await navigator.mediaDevices.getUserMedia({
video: true,
audio: false,
});
t.add_cleanup(() => mediaStream1.getVideoTracks()[0].stop());
const settings1 = mediaStream1.getVideoTracks()[0].getSettings();
const mediaStream2 = await navigator.mediaDevices.getUserMedia({
video: {
deviceId: {exact: settings1.deviceId},
width: {
ideal: settings1.width / 2,
},
},
audio: false
});
t.add_cleanup(() => mediaStream2.getVideoTracks()[0].stop());
const settings2 = mediaStream2.getVideoTracks()[0].getSettings();
assert_equals(settings1.deviceId, settings2.deviceId);
assert_between_inclusive(settings2.width, settings1.width / 2, settings1.width);
}, 'A device can be opened twice with different resolutions requested');
promise_test(async t => {
const devices = await navigator.mediaDevices.enumerateDevices();
const inputDevices = devices.filter(d => d.kind != "audiooutput");
assert_greater_than(inputDevices.length, 0);
for (const device of inputDevices) {
const device_id_constraint = {deviceId: {exact: device.deviceId}};
const constraints = device.kind == "audioinput"
? {audio: device_id_constraint}
: {video: device_id_constraint};
const stream = await navigator.mediaDevices.getUserMedia(constraints);
assert_equals(stream.getTracks()[0].getSettings().groupId,
device.groupId);
assert_greater_than(device.groupId.length, 0);
}
}, 'groupId is correctly reported by getSettings() for all input devices');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.deviceId), "string",
"deviceId should exist and it should be a string.");
}, 'deviceId is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.groupId), "string",
"groupId should exist and it should be a string.");
}, 'groupId is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.sampleRate), "number",
"sampleRate should exist and it should be a number.");
assert_greater_than(settings.sampleRate, 0);
}, 'sampleRate is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.sampleSize), "number",
"sampleSize should exist and it should be a number.");
assert_greater_than(settings.sampleSize, 0);
}, 'sampleSize is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.echoCancellation), "boolean",
"echoCancellation should exist and it should be a boolean.");
}, 'echoCancellation is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.autoGainControl), "boolean",
"autoGainControl should exist and it should be a boolean.");
}, 'autoGainControl is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.noiseSuppression), "boolean",
"noiseSuppression should exist and it should be a boolean.");
}, 'noiseSuppression is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.latency), "number",
"latency should exist and it should be a number.");
assert_greater_than_equal(settings.latency,0);
}, 'latency is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "audio");
assert_equals(typeof(settings.channelCount), "number",
"channelCount should exist and it should be a number.");
assert_greater_than(settings.channelCount, 0);
}, 'channelCount is reported by getSettings() for getUserMedia() audio tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.deviceId), "string",
"deviceId should exist and it should be a string.");
}, 'deviceId is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.groupId), "string",
"groupId should exist and it should be a string.");
}, 'groupId is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.width), "number",
"width should exist and it should be a number.");
assert_true(Number.isInteger(settings.width), "width should be an integer.");
assert_greater_than_equal(settings.width, 0);;
}, 'width is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.height), "number",
"height should exist and it should be a number.");
assert_true(Number.isInteger(settings.height), "height should be an integer.");
assert_greater_than_equal(settings.height, 0);
}, 'height is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.aspectRatio), "number",
"aspectRatio should exist and it should be a number.");
assert_greater_than_equal(settings.aspectRatio, 0);
}, 'aspectRatio is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.frameRate), "number",
"frameRate should exist and it should be a number.");
assert_greater_than_equal(settings.frameRate, 0);
}, 'frameRate is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
// facingMode not treated as mandatory because not all platforms provide
// this information.
if (settings.facingMode) {
assert_equals(typeof(settings.facingMode), "string",
"If facingMode is provided it should be a string.");
assert_in_array(settings.facingMode,
['user', 'environment', 'left', 'right']);
}
}, 'facingMode is reported by getSettings() for getUserMedia() video tracks');
promise_test(async t => {
const settings = await createTrackAndGetSettings(t, "video");
assert_equals(typeof(settings.resizeMode), "string",
"resizeMode should exist and it should be a string.");
assert_in_array(settings.resizeMode, ['none', 'crop-and-scale']);
}, 'resizeMode is reported by getSettings() for getUserMedia() video tracks');
</script>