Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<meta charset="utf-8">
<title>HTMLUserMediaElement Test: validation errors trigger onerror</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body>
<script>
// Case 1: "No constraints set"
promise_test(async (t) => {
const usermedia = document.createElement('usermedia');
usermedia.setAttribute('type', 'camera microphone');
document.body.appendChild(usermedia);
// Set empty constraints to trigger error
usermedia.setConstraints({});
let stream_fired = false;
usermedia.onstream = () => { stream_fired = true; };
const error_promise = new Promise((resolve) => {
usermedia.onerror = resolve;
});
await Promise.all([
test_driver.set_permission({name: 'camera'}, 'granted'),
test_driver.set_permission({name: 'microphone'}, 'granted')
]);
// Wait until clickable
await new Promise(resolve => t.step_timeout(resolve, 600));
await test_driver.click(usermedia);
const event = await error_promise;
assert_false(stream_fired, "onstream should not fire on error");
assert_equals(usermedia.stream, null, "stream should be null on error");
assert_not_equals(usermedia.error, null, "error should not be null");
assert_true(usermedia.error instanceof DOMException, "error should be a DOMException");
assert_equals(usermedia.error.name, "NotSupportedError", "error name should be NotSupportedError");
assert_equals(usermedia.error.message, "No constraints set", "error message should match");
}, "A usermedia element with missing constraints for dual devices triggers onerror with NotSupportedError");
// Case 2: "No audio constraints set"
promise_test(async (t) => {
const usermedia = document.createElement('usermedia');
usermedia.setAttribute('type', 'microphone');
document.body.appendChild(usermedia);
// Set video-only constraints on microphone-only element to trigger audio missing error
usermedia.setConstraints({video: {}});
let stream_fired = false;
usermedia.onstream = () => { stream_fired = true; };
const error_promise = new Promise((resolve) => {
usermedia.onerror = resolve;
});
await test_driver.set_permission({name: 'microphone'}, 'granted');
// Wait until clickable
await new Promise(resolve => t.step_timeout(resolve, 600));
await test_driver.click(usermedia);
const event = await error_promise;
assert_false(stream_fired, "onstream should not fire on error");
assert_equals(usermedia.stream, null, "stream should be null on error");
assert_not_equals(usermedia.error, null, "error should not be null");
assert_true(usermedia.error instanceof DOMException, "error should be a DOMException");
assert_equals(usermedia.error.name, "NotSupportedError", "error name should be NotSupportedError");
assert_equals(usermedia.error.message, "No audio constraints set", "error message should match");
}, "A usermedia element with missing audio constraints for microphone type triggers onerror with NotSupportedError");
// Case 3: "No video constraints set"
promise_test(async (t) => {
const usermedia = document.createElement('usermedia');
usermedia.setAttribute('type', 'camera');
document.body.appendChild(usermedia);
// Set audio-only constraints on camera-only element to trigger video missing error
usermedia.setConstraints({audio: {}});
let stream_fired = false;
usermedia.onstream = () => { stream_fired = true; };
const error_promise = new Promise((resolve) => {
usermedia.onerror = resolve;
});
await test_driver.set_permission({name: 'camera'}, 'granted');
// Wait until clickable
await new Promise(resolve => t.step_timeout(resolve, 600));
await test_driver.click(usermedia);
const event = await error_promise;
assert_false(stream_fired, "onstream should not fire on error");
assert_equals(usermedia.stream, null, "stream should be null on error");
assert_not_equals(usermedia.error, null, "error should not be null");
assert_true(usermedia.error instanceof DOMException, "error should be a DOMException");
assert_equals(usermedia.error.name, "NotSupportedError", "error name should be NotSupportedError");
assert_equals(usermedia.error.message, "No video constraints set", "error message should match");
}, "A usermedia element with missing video constraints for camera type triggers onerror with NotSupportedError");
</script>
</body>