mirror of
https://github.com/servo/servo.git
synced 2025-07-12 09:53:40 +01:00
116 lines
4.2 KiB
HTML
116 lines
4.2 KiB
HTML
<!doctype html>
|
|
<meta charset=utf-8>
|
|
<title>getDisplayMedia</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script>
|
|
'use strict';
|
|
test(() => {
|
|
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
|
|
}, "getDisplayMedia in navigator.mediaDevices");
|
|
|
|
const stopTracks = stream => stream.getTracks().forEach(track => track.stop());
|
|
const j = obj => JSON.stringify(obj);
|
|
|
|
[
|
|
{video: true},
|
|
{video: true, audio: false},
|
|
{audio: false},
|
|
{},
|
|
undefined
|
|
].forEach(constraints => promise_test(async t => {
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(constraints);
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
assert_equals(stream.getTracks().length, 1);
|
|
assert_equals(stream.getVideoTracks().length, 1);
|
|
assert_equals(stream.getAudioTracks().length, 0);
|
|
}, `getDisplayMedia(${j(constraints)}) must succeed with video`));
|
|
|
|
[
|
|
{video: false},
|
|
{video: {advanced: [{width: 320}]}},
|
|
{video: {width: {min: 320}}},
|
|
{video: {width: {exact: 320}}},
|
|
{video: {height: {min: 240}}},
|
|
{video: {height: {exact: 240}}},
|
|
{video: {frameRate: {min: 4}}},
|
|
{video: {frameRate: {exact: 4}}},
|
|
{audio: true},
|
|
{video: false, audio: true},
|
|
].forEach(constraints => promise_test(async t => {
|
|
try {
|
|
stopTracks(await navigator.mediaDevices.getDisplayMedia(constraints));
|
|
} catch (err) {
|
|
assert_equals(err.name, 'TypeError', err.message);
|
|
return;
|
|
}
|
|
assert_unreached('getDisplayMedia should have failed');
|
|
}, `getDisplayMedia(${j(constraints)}) must fail with TypeError`));
|
|
|
|
[
|
|
{video: true, audio: true},
|
|
].forEach(constraints => promise_test(async t => {
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(constraints);
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
assert_greater_than_equal(stream.getTracks().length, 1);
|
|
assert_less_than_equal(stream.getTracks().length, 2);
|
|
assert_equals(stream.getVideoTracks().length, 1);
|
|
assert_less_than_equal(stream.getAudioTracks().length, 1);
|
|
}, `getDisplayMedia(${j(constraints)}) must succeed with video maybe audio`));
|
|
|
|
[
|
|
{video: {width: {max: 360}}},
|
|
{video: {height: {max: 240}}},
|
|
{video: {width: {max: 360}, height: {max: 240}}},
|
|
{video: {frameRate: {max: 4}}},
|
|
{video: {frameRate: {max: 4}, width: {max: 360}}},
|
|
{video: {frameRate: {max: 4}, height: {max: 240}}},
|
|
{video: {frameRate: {max: 4}, width: {max: 360}, height: {max: 240}}},
|
|
].forEach(constraints => promise_test(async t => {
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(constraints);
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
const {width, height, frameRate} = stream.getTracks()[0].getSettings();
|
|
assert_greater_than_equal(width, 1);
|
|
assert_greater_than_equal(height, 1);
|
|
assert_greater_than_equal(frameRate, 1);
|
|
if (constraints.width) {
|
|
assert_less_than_equal(width, constraints.width.max);
|
|
}
|
|
if (constraints.height) {
|
|
assert_less_than_equal(height, constraints.height.max);
|
|
}
|
|
if (constraints.frameRate) {
|
|
assert_less_than_equal(frameRate, constraints.frameRate.max);
|
|
}
|
|
}, `getDisplayMedia(${j(constraints)}) must be constrained`));
|
|
|
|
[
|
|
{video: {width: {max: 0}}},
|
|
{video: {height: {max: 0}}},
|
|
{video: {frameRate: {max: 0}}},
|
|
{video: {width: {max: -1}}},
|
|
{video: {height: {max: -1}}},
|
|
{video: {frameRate: {max: -1}}},
|
|
].forEach(constraints => promise_test(async t => {
|
|
try {
|
|
stopTracks(await navigator.mediaDevices.getDisplayMedia(constraints));
|
|
} catch (err) {
|
|
assert_equals(err.name, 'OverconstrainedError', err.message);
|
|
return;
|
|
}
|
|
assert_unreached('getDisplayMedia should have failed');
|
|
}, `getDisplayMedia(${j(constraints)}) must fail with OverconstrainedError`));
|
|
|
|
// Content shell picks a fake desktop device by default.
|
|
promise_test(async t => {
|
|
const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
const settings = stream.getVideoTracks()[0].getSettings();
|
|
assert_any(
|
|
assert_equals, settings.displaySurface,
|
|
['monitor', 'window', 'application', 'browser']);
|
|
assert_any(assert_equals, settings.logicalSurface, [true, false]);
|
|
assert_any(assert_equals, settings.cursor, ['never', 'always', 'motion']);
|
|
}, 'getDisplayMedia() with getSettings');
|
|
|
|
</script>
|