File: getdisplaymedia-after-discard.https.html

package info (click to toggle)
firefox 145.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,344 kB
  • sloc: cpp: 7,594,932; javascript: 6,459,612; ansic: 3,752,905; python: 1,403,433; xml: 629,811; asm: 438,677; java: 186,421; sh: 67,287; makefile: 19,169; objc: 13,086; perl: 12,982; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (45 lines) | stat: -rw-r--r-- 2,082 bytes parent folder | download | duplicates (22)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!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>