getScreenDetails.tentative.https.window.js (3056B)
1 // META: global=window 2 // META: script=/resources/testdriver.js 3 // META: script=/resources/testdriver-vendor.js 4 'use strict'; 5 6 promise_test(async t => { 7 assert_equals(typeof self.getScreenDetails, 'function'); 8 }, 'getScreenDetails() is present'); 9 10 promise_test(async t => { 11 await test_driver.set_permission({name: 'window-management'}, 'granted'); 12 const screenDetails = await self.getScreenDetails(); 13 assert_true(ScreenDetails.prototype.isPrototypeOf(screenDetails)); 14 assert_true(ScreenDetailed.prototype.isPrototypeOf(screenDetails.currentScreen)); 15 assert_true(Array.prototype.isPrototypeOf(screenDetails.screens)); 16 assert_greater_than(screenDetails.screens.length, 0); 17 assert_true(ScreenDetailed.prototype.isPrototypeOf(screenDetails.screens[0])); 18 assert_true(screenDetails.screens.includes(screenDetails.currentScreen)); 19 }, 'getScreenDetails() returns the expected interface with permission granted'); 20 21 promise_test(async t => { 22 await test_driver.set_permission({name: 'window-management'}, 'granted'); 23 assert_greater_than((await self.getScreenDetails()).screens.length, 0); 24 await test_driver.set_permission({name: 'window-management'}, 'denied'); 25 await promise_rejects_dom(t, 'NotAllowedError', self.getScreenDetails()); 26 }, 'getScreenDetails() rejects the promise with permission denied'); 27 28 promise_test(async t => { 29 await test_driver.set_permission({name: 'window-management'}, 'granted'); 30 let iframe = document.body.appendChild(document.createElement('iframe')); 31 assert_greater_than((await iframe.contentWindow.getScreenDetails()).screens.length, 0); 32 33 let iframeGetScreens; 34 let constructor; 35 await new Promise(resolve => { 36 iframe.contentWindow.onunload = () => { 37 // Grab these before the contentWindow is removed. 38 iframeGetScreens = iframe.contentWindow.getScreenDetails; 39 constructor = iframe.contentWindow.DOMException; 40 resolve(); 41 }; 42 document.body.removeChild(iframe); 43 }); 44 assert_not_equals(iframeGetScreens, undefined); 45 assert_not_equals(constructor, undefined); 46 47 await t.step_wait(() => !iframe.contentWindow, 'execution context invalid'); 48 assert_equals(iframe.contentWindow, null); 49 await promise_rejects_dom(t, 'InvalidStateError', constructor, iframeGetScreens()); 50 }, 'getScreenDetails() resolves for attached iframe; rejects for detached iframe'); 51 52 promise_test(async t => { 53 await test_driver.set_permission({name: 'window-management'}, 'granted'); 54 let iframe = document.body.appendChild(document.createElement('iframe')); 55 const screenDetails = await iframe.contentWindow.getScreenDetails(); 56 assert_greater_than(screenDetails.screens.length, 0); 57 assert_equals(screenDetails.currentScreen, screenDetails.screens[0]); 58 iframe.remove(); 59 await t.step_wait(() => !iframe.contentWindow, 'execution context invalid'); 60 assert_equals(iframe.contentWindow, null); 61 assert_equals(screenDetails.screens.length, 0); 62 assert_equals(screenDetails.currentScreen, null); 63 }, 'Cached ScreenDetails interface from detached iframe does not crash, behaves okay');