<!doctype html>
<title>Test for rejected promise from getDisplayMedia() in a discarded browsing
context</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></body>
<script>
// https://w3c.github.io/mediacapture-screen-share/#dom-mediadevices-getdisplaymedia
// If the current settings object's responsible document is NOT fully active,
// return a promise rejected with a DOMException object whose name attribute
// has the value "InvalidStateError".
promise_test(async () => {
const frame = document.createElement('iframe');
document.body.appendChild(frame);
frame.srcdoc = '<html></html>';
await new Promise(resolve => frame.onload = resolve);
const child_window = frame.contentWindow;
const devices = child_window.navigator.mediaDevices;
const child_DOMException = child_window.DOMException;
// transient activation of iframe content
await test_driver.bless('getDisplayMedia()', undefined, child_window);
frame.remove();
// `catch()` is used rather than static Promise methods because microtasks
// for `PromiseResolve()` do not run when Promises in inactive Documents are
// involved. Whether microtasks for `catch()` run depends on the realm of
// the handler rather than the realm of the Promise.
// See https://github.com/whatwg/html/issues/5319.
let promise_already_rejected = false;
let rejected_reason;
devices.getDisplayMedia({video:true}).catch(reason => {
promise_already_rejected = true;
rejected_reason = reason;
});
// Race a settled promise to check that the returned promise is already
// rejected.
await Promise.reject().catch(() => {
assert_true(promise_already_rejected,
'should have returned an already-rejected promise.');
assert_throws_dom('InvalidStateError', child_DOMException,
() => { throw rejected_reason });
});
}, 'getDisplayMedia() in a discarded browsing context');
</script>