176 lines
5.8 KiB
HTML
176 lines
5.8 KiB
HTML
<!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>
|