Skip to content

Commit 2089a7c

Browse files
karltmoz-wptsync-bot
authored andcommitted
test for rejected promise from getDisplayMedia() in a discarded browsing context
Differential Revision: https://phabricator.services.mozilla.com/D96517 bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1675891 gecko-commit: 0c94efa2d16c2da78f8fbe023b308ffbf1eea15a gecko-reviewers: jib
1 parent 36b846c commit 2089a7c

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<!doctype html>
2+
<title>Test for rejected promise from getDisplayMedia() in a discarded browsing
3+
context</title>
4+
<script src=/resources/testharness.js></script>
5+
<script src=/resources/testharnessreport.js></script>
6+
<script src="/resources/testdriver.js"></script>
7+
<script src='/resources/testdriver-vendor.js'></script>
8+
<body></body>
9+
<script>
10+
// https://w3c.github.io/mediacapture-screen-share/#dom-mediadevices-getdisplaymedia
11+
// If the current settings object's responsible document is NOT fully active,
12+
// return a promise rejected with a DOMException object whose name attribute
13+
// has the value "InvalidStateError".
14+
promise_test(async () => {
15+
const frame = document.createElement('iframe');
16+
document.body.appendChild(frame);
17+
frame.srcdoc = '<html></html>';
18+
await new Promise(resolve => frame.onload = resolve);
19+
const child_window = frame.contentWindow;
20+
const devices = child_window.navigator.mediaDevices;
21+
const child_DOMException = child_window.DOMException;
22+
// transient activation of iframe content
23+
await test_driver.bless('getDisplayMedia()', undefined, child_window);
24+
frame.remove();
25+
// `catch()` is used rather than static Promise methods because microtasks
26+
// for `PromiseResolve()` do not run when Promises in inactive Documents are
27+
// involved. Whether microtasks for `catch()` run depends on the realm of
28+
// the handler rather than the realm of the Promise.
29+
// See https://github.com/whatwg/html/issues/5319.
30+
let promise_already_rejected = false;
31+
let rejected_reason;
32+
devices.getDisplayMedia({video:true}).catch(reason => {
33+
promise_already_rejected = true;
34+
rejected_reason = reason;
35+
});
36+
// Race a settled promise to check that the returned promise is already
37+
// rejected.
38+
await Promise.reject().catch(() => {
39+
assert_true(promise_already_rejected,
40+
'should have returned an already-rejected promise.');
41+
assert_throws_dom('InvalidStateError', child_DOMException,
42+
() => { throw rejected_reason });
43+
});
44+
}, 'getDisplayMedia() in a discarded browsing context');
45+
</script>

0 commit comments

Comments
 (0)