203 lines
7.8 KiB
JavaScript
203 lines
7.8 KiB
JavaScript
// META: script=/resources/testdriver.js
|
|
// META: script=/resources/testdriver-vendor.js
|
|
// META: timeout=long
|
|
|
|
'use strict';
|
|
|
|
const validFocusBehaviors = [
|
|
'focus-capturing-application', 'focus-captured-surface', 'no-focus-change'
|
|
];
|
|
const validDisplaySurfaces = ['window', 'browser'];
|
|
|
|
test(() => {
|
|
assert_own_property(window, 'CaptureController');
|
|
}, 'CaptureController in window');
|
|
|
|
const stopTracks = stream => stream.getTracks().forEach(track => track.stop());
|
|
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => test(
|
|
(t) => {
|
|
const controller = new CaptureController();
|
|
controller.setFocusBehavior(focusBehavior);
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must succeed before capture starts`));
|
|
|
|
['invalid', null, undefined, {}, true].forEach(
|
|
(focusBehavior) => test(
|
|
() => {
|
|
const controller = new CaptureController();
|
|
assert_throws_js(
|
|
TypeError, () => controller.setFocusBehavior(focusBehavior));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw TypeError if focusBehavior is invalid`));
|
|
|
|
promise_test(async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia({controller});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
assert_equals(stream.getTracks().length, 1);
|
|
assert_equals(stream.getVideoTracks().length, 1);
|
|
assert_equals(stream.getAudioTracks().length, 0);
|
|
}, 'getDisplayMedia({controller}) must succeed');
|
|
|
|
['invalid', null, {}, true].forEach(
|
|
(controller) => promise_test(
|
|
async (t) => {
|
|
await test_driver.bless('getDisplayMedia()');
|
|
await promise_rejects_js(
|
|
t, TypeError,
|
|
navigator.mediaDevices.getDisplayMedia({controller}));
|
|
},
|
|
`getDisplayMedia({controller: ${
|
|
controller}}) must fail with TypeError`));
|
|
|
|
promise_test(async (t) => {
|
|
const controller = new CaptureController();
|
|
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia({controller});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const p = navigator.mediaDevices.getDisplayMedia({controller});
|
|
t.add_cleanup(async () => {
|
|
try {
|
|
stopTracks(await p);
|
|
} catch {
|
|
}
|
|
});
|
|
await promise_rejects_dom(
|
|
t, 'InvalidStateError', Promise.race([p, Promise.resolve()]),
|
|
'getDisplayMedia should have returned an already-rejected promise.');
|
|
}, 'getDisplayMedia({controller}) must fail with InvalidStateError if controller is bound');
|
|
|
|
validDisplaySurfaces.forEach((displaySurface) => {
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface}});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
controller.setFocusBehavior(focusBehavior);
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must succeed when window of opportunity is opened if capturing a ${
|
|
displaySurface}`));
|
|
});
|
|
|
|
validDisplaySurfaces.forEach((displaySurface) => {
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const p = navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface}});
|
|
controller.setFocusBehavior(focusBehavior);
|
|
const stream = await p;
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must succeed when getDisplayMedia promise is pending if capturing a ${
|
|
displaySurface}`));
|
|
});
|
|
|
|
validDisplaySurfaces.forEach((displaySurface) => {
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface}});
|
|
stopTracks(stream);
|
|
assert_throws_dom(
|
|
'InvalidStateError',
|
|
() => controller.setFocusBehavior(focusBehavior));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw InvalidStateError when track is stopped if capturing a ${
|
|
displaySurface}`));
|
|
});
|
|
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface: 'monitor'}});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
assert_throws_dom(
|
|
'InvalidStateError',
|
|
() => controller.setFocusBehavior(focusBehavior));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw InvalidStateError if capturing a monitor`));
|
|
|
|
validDisplaySurfaces.forEach((displaySurface) => {
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface}});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
await new Promise((resolve) => step_timeout(resolve, 0));
|
|
assert_throws_dom(
|
|
'InvalidStateError',
|
|
() => controller.setFocusBehavior(focusBehavior));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw InvalidStateError when window of opportunity is closed if capturing a ${
|
|
displaySurface}`));
|
|
});
|
|
|
|
validDisplaySurfaces.forEach((displaySurface) => {
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
await test_driver.bless('getDisplayMedia()');
|
|
const stream = await navigator.mediaDevices.getDisplayMedia(
|
|
{controller, video: {displaySurface}});
|
|
t.add_cleanup(() => stopTracks(stream));
|
|
controller.setFocusBehavior(focusBehavior)
|
|
assert_throws_dom(
|
|
'InvalidStateError',
|
|
() => controller.setFocusBehavior(focusBehavior));
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw InvalidStateError the second time if capturing a ${
|
|
displaySurface}`));
|
|
});
|
|
|
|
validFocusBehaviors.forEach(
|
|
(focusBehavior) => promise_test(
|
|
async (t) => {
|
|
const controller = new CaptureController();
|
|
const options = {
|
|
controller: controller,
|
|
video: {width: {max: 0}},
|
|
}
|
|
try {
|
|
await test_driver.bless('getDisplayMedia()');
|
|
stopTracks(await navigator.mediaDevices.getDisplayMedia(options));
|
|
} catch (err) {
|
|
assert_equals(err.name, 'OverconstrainedError', err.message);
|
|
assert_throws_dom(
|
|
'InvalidStateError',
|
|
() => controller.setFocusBehavior(focusBehavior));
|
|
return;
|
|
}
|
|
assert_unreached('getDisplayMedia should have failed');
|
|
},
|
|
`setFocusBehavior("${
|
|
focusBehavior}") must throw InvalidStateError if getDisplayMedia fails`));
|