<!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>
