| // 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'); |