63 lines
3 KiB
JavaScript
63 lines
3 KiB
JavaScript
// 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');
|