tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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