diff options
Diffstat (limited to 'testing/web-platform/tests/screen-details/getScreenDetails.tentative.https.window.js')
-rw-r--r-- | testing/web-platform/tests/screen-details/getScreenDetails.tentative.https.window.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/testing/web-platform/tests/screen-details/getScreenDetails.tentative.https.window.js b/testing/web-platform/tests/screen-details/getScreenDetails.tentative.https.window.js new file mode 100644 index 0000000000..06f0344f3a --- /dev/null +++ b/testing/web-platform/tests/screen-details/getScreenDetails.tentative.https.window.js @@ -0,0 +1,63 @@ +// META: global=window +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +'use strict'; + +promise_test(async t => { + assert_equals(typeof self.getScreenDetails, 'function'); +}, 'getScreenDetails() is present'); + +promise_test(async t => { + await test_driver.set_permission({name: 'window-management'}, 'granted'); + const screenDetails = await self.getScreenDetails(); + assert_true(ScreenDetails.prototype.isPrototypeOf(screenDetails)); + assert_true(ScreenDetailed.prototype.isPrototypeOf(screenDetails.currentScreen)); + assert_true(Array.prototype.isPrototypeOf(screenDetails.screens)); + assert_greater_than(screenDetails.screens.length, 0); + assert_true(ScreenDetailed.prototype.isPrototypeOf(screenDetails.screens[0])); + assert_true(screenDetails.screens.includes(screenDetails.currentScreen)); +}, 'getScreenDetails() returns the expected interface with permission granted'); + +promise_test(async t => { + await test_driver.set_permission({name: 'window-management'}, 'granted'); + assert_greater_than((await self.getScreenDetails()).screens.length, 0); + await test_driver.set_permission({name: 'window-management'}, 'denied'); + await promise_rejects_dom(t, 'NotAllowedError', self.getScreenDetails()); +}, 'getScreenDetails() rejects the promise with permission denied'); + +promise_test(async t => { + await test_driver.set_permission({name: 'window-management'}, 'granted'); + let iframe = document.body.appendChild(document.createElement('iframe')); + assert_greater_than((await iframe.contentWindow.getScreenDetails()).screens.length, 0); + + let iframeGetScreens; + let constructor; + await new Promise(resolve => { + iframe.contentWindow.onunload = () => { + // Grab these before the contentWindow is removed. + iframeGetScreens = iframe.contentWindow.getScreenDetails; + constructor = iframe.contentWindow.DOMException; + resolve(); + }; + document.body.removeChild(iframe); + }); + assert_not_equals(iframeGetScreens, undefined); + assert_not_equals(constructor, undefined); + + await t.step_wait(() => !iframe.contentWindow, 'execution context invalid'); + assert_equals(iframe.contentWindow, null); + await promise_rejects_dom(t, 'InvalidStateError', constructor, iframeGetScreens()); +}, 'getScreenDetails() resolves for attached iframe; rejects for detached iframe'); + +promise_test(async t => { + await test_driver.set_permission({name: 'window-management'}, 'granted'); + let iframe = document.body.appendChild(document.createElement('iframe')); + const screenDetails = await iframe.contentWindow.getScreenDetails(); + assert_greater_than(screenDetails.screens.length, 0); + assert_equals(screenDetails.currentScreen, screenDetails.screens[0]); + iframe.remove(); + await t.step_wait(() => !iframe.contentWindow, 'execution context invalid'); + assert_equals(iframe.contentWindow, null); + assert_equals(screenDetails.screens.length, 0); + assert_equals(screenDetails.currentScreen, null); +}, 'Cached ScreenDetails interface from detached iframe does not crash, behaves okay'); |