tor-browser

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

enumerateDevices-in-background.https.html (2914B)


      1 <!doctype html>
      2 <title>enumerateDevices() in background tab with focus in chrome</title>
      3 <script src=/resources/testharness.js></script>
      4 <script src=/resources/testharnessreport.js></script>
      5 <script src="/resources/testdriver.js"></script>
      6 <script src="/resources/testdriver-vendor.js"></script>
      7 <body></body>
      8 <script>
      9 'use strict';
     10 // This test is not in cross-browser wpt because it uses Gecko-specific API
     11 // for focusing browser chrome and it assumes a specific tab browser design.
     12 // It assumes that
     13 // * browser chrome widget focus is associated with a single current document
     14 //   presentation (tab),
     15 //   https://github.com/w3c/mediacapture-main/issues/752#issuecomment-742036800
     16 // * window.open() focuses the new tab and makes the current tab hidden, and
     17 // * the opener tab becomes the current and visible tab again when the new tab
     18 //   is closed.
     19 const blank_url = '/common/blank.html';
     20 
     21 function promise_event(target, name) {
     22  return new Promise(resolve => target[`on${name}`] = resolve);
     23 }
     24 
     25 promise_test(async t => {
     26  // Open a new tab, which is expected to receive focus and hide the first tab.
     27  await test_driver.bless('window.open()');
     28  assert_true(document.hasFocus(), 'This test needs focus on the browser.');
     29  const promise_hidden = promise_event(document, 'visibilitychange');
     30  const proxy = window.open(blank_url);
     31  t.add_cleanup(() => proxy.close());
     32  await Promise.all([
     33    promise_hidden,
     34    promise_event(proxy, 'focus'),
     35    promise_event(proxy, 'load'),
     36  ]);
     37  assert_true(proxy.document.hasFocus(), 'proxy.document.hasFocus()');
     38 
     39  await Promise.all([
     40    promise_event(proxy, 'blur'),
     41    SpecialPowers.spawnChrome([], function focus_url_bar() {
     42      this.browsingContext.topChromeWindow.gURLBar.focus();
     43    }),
     44  ]);
     45  assert_false(proxy.document.hasFocus(), 'proxy.document.hasFocus()');
     46  assert_false(document.hasFocus(), 'document.hasFocus()');
     47  assert_equals(document.visibilityState, 'hidden', 'visibilityState');
     48 
     49  // Enumeration should remain pending while the first tab is background.
     50  const promise_enumerate = navigator.mediaDevices.enumerateDevices();
     51  // Enumerate in the foreground tab to confirm that URL bar focus is
     52  // sufficient, and to provide enough time to check that the Promise from the
     53  // background tab does not settle.
     54  await proxy.navigator.mediaDevices.enumerateDevices();
     55  // Race a settled Promise to check that the enumeration in the background tab
     56  // has not settled.
     57  const result = await Promise.race([promise_enumerate, 'pending']);
     58  assert_equals(result, 'pending', 'pending Promise while background.');
     59 
     60  // The enumeration Promise should resolve after the first tab returns to the
     61  // foreground.
     62  proxy.close();
     63  await promise_event(document, 'visibilitychange');
     64  assert_equals(document.visibilityState, 'visible', 'visibilityState');
     65  await promise_enumerate;
     66 }, 'enumerateDevices in background');
     67 </script>