blob: b89a5331e8b36f912992256aa500bd5998aba456 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Testing 'devicechange' event is fired correctly.</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
let stream = null;
let setup = async (test) => {
if (!window.testRunner)
return Promise.reject("test requires internal API");
test.add_cleanup(() => { testRunner.resetMockMediaDevices(); });
testRunner.setUserMediaPermission(true);
stream = null;
}
promise_test(async (test) => {
// Trigger monitoring of device changes.
navigator.mediaDevices.ondevicechange = () => { };
await setup(test);
await navigator.mediaDevices.getUserMedia({ audio:true, video:true })
.then(s => stream = s)
let devices = await navigator.mediaDevices.enumerateDevices();
let devices2 = await navigator.mediaDevices.enumerateDevices();
assert_true(!!devices.length, "check there are some devices");
assert_equals(devices.length, devices2.length, "devices length");
assert_not_equals(devices[0], devices2[0], "devices are different");
assert_equals(devices[0].deviceId, devices2[0].deviceId, "same deviceIds");
testRunner.clearMockMediaDevices();
await new Promise((resolve, reject) => {
navigator.mediaDevices.ondevicechange = resolve;
setTimeout(() => {
reject("event 1 took too long");
}, 5000);
});
devices = await navigator.mediaDevices.enumerateDevices();
assert_false(!!devices.length, "check there are no more devices");
testRunner.addMockCameraDevice("id1", "my camera");
await new Promise((resolve, reject) => {
navigator.mediaDevices.ondevicechange = resolve;
setTimeout(() => {
reject("event 2 took too long");
}, 5000);
});
devices = await navigator.mediaDevices.enumerateDevices();
assert_equals(devices[0].kind, "videoinput");
assert_equals(devices[0].label, "my camera");
testRunner.addMockMicrophoneDevice("id2", "my mic");
await new Promise((resolve, reject) => {
navigator.mediaDevices.ondevicechange = resolve;
setTimeout(() => {
reject("event 3 took too long");
}, 5000);
});
devices = await navigator.mediaDevices.enumerateDevices();
assert_equals(devices[0].kind, "audioinput");
assert_equals(devices[0].label, "my mic");
const micStream = await navigator.mediaDevices.getUserMedia({ audio : { deviceId : "id2" } });
assert_equals(micStream.getAudioTracks()[0].label, "my mic");
}, "'devicechange' event fired when device list changes");
promise_test(async (test) => {
await setup(test);
let eventCount = 0;
await new Promise((resolve, reject) => {
navigator.mediaDevices.ondevicechange = (evt) => {
++eventCount;
setTimeout(() => {
resolve();
}, 500);
}
setTimeout(() => {
console.log("navigator.mediaDevices.ondevicechange took too long");
resolve();
}, 4000);
testRunner.addMockMicrophoneDevice("id4", "microphone 3");
testRunner.addMockMicrophoneDevice("id5", "microphone 4");
});
assert_equals(eventCount, 1, "one event fired");
}, "'devicechange' events fired quickly are coalesced");
promise_test(async (test) => {
await setup(test);
await new Promise((resolve, reject) => {
let timeout = setTimeout(() => {
console.log("window.onblur took too long");
resolve();
}, 5000);
window.onblur = () => {
clearTimeout(timeout);
resolve();
}
internals.setPageIsFocusedAndActive(false);
});
await new Promise((resolve, reject) => {
assert_false(document.hasFocus(), "document.hasFocus()");
navigator.mediaDevices.ondevicechange = () => {
assert_true(document.hasFocus(), "devicechange should only fire when the document is focused and active");
resolve();
};
setTimeout(() => {
internals.setPageIsFocusedAndActive(true);
}, 200);
testRunner.addMockMicrophoneDevice("id3", "microphone 2");
});
}, "'devicechange' event is not fired when the document doesn't has focus or permission to capture");
promise_test(async (test) => {
await setup(test);
await navigator.mediaDevices.getUserMedia({ audio:true, video:true })
.then(s => stream = s);
await new Promise((resolve, reject) => {
let timeout = setTimeout(() => {
console.log("window.onblur took too long");
resolve();
}, 5000);
window.onblur = () => {
clearTimeout(timeout);
resolve();
}
internals.setPageIsFocusedAndActive(false);
});
await new Promise((resolve, reject) => {
assert_false(document.hasFocus(), "document.hasFocus()");
navigator.mediaDevices.ondevicechange = () => {
assert_false(document.hasFocus(), "devicechange should fire when the document is not focused but can capture");
resolve();
};
testRunner.addMockMicrophoneDevice("id3", "microphone 2");
});
}, "'devicechange' event is fired when the document doesn't has focus but has permission to capture");
</script>
</head>
<body>
</body>
</html>