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