tor-browser

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

enumerateDevices-without-focus.https.html (2372B)


      1 <!doctype html>
      2 <title>enumerateDevices() without focus</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 const blank_url = '/common/blank.html';
     11 
     12 function promise_event(target, name) {
     13  return new Promise(resolve => target[`on${name}`] = resolve);
     14 }
     15 // When testdriver.js supports switch-to-window, it can replace this function
     16 // and this test can be upstreamed.
     17 // https://github.com/web-platform-tests/wpt/issues/10666
     18 function switch_toplevel_focus_for_window(win) {
     19  return win.SpecialPowers.spawnChrome([], function activate_browser_window() {
     20    this.browsingContext.topChromeWindow.focus();
     21  });
     22 }
     23 
     24 promise_test(async t => {
     25  await test_driver.bless('window.open()');
     26  assert_true(document.hasFocus(), 'This test needs focus on the document.');
     27  const promise_blur = promise_event(window, 'blur');
     28  // 'resizable' is requested for a separate OS window on relevant platforms
     29  // so that this test tests OS focus changes rather than document visibility.
     30  const proxy = window.open(blank_url, '', 'resizable');
     31  t.add_cleanup(() => proxy.close());
     32  await Promise.all([
     33    promise_blur,
     34    switch_toplevel_focus_for_window(proxy),
     35    promise_event(proxy, 'load'),
     36  ]);
     37  assert_false(document.hasFocus(), 'document.hasFocus() after blur');
     38 
     39  // Enumeration should remain pending without focus.
     40  const promise_enumerate = navigator.mediaDevices.enumerateDevices();
     41  // Enumerate in the focused window to provide enough time to check that
     42  // the Promise from the unfocused window does not settle.
     43  await proxy.navigator.mediaDevices.enumerateDevices();
     44  // Race a settled Promise to check that the enumeration in the first window
     45  // has not settled.
     46  const result = await Promise.race([promise_enumerate, 'pending']);
     47  assert_equals(result, 'pending', 'pending Promise without focus.');
     48 
     49  // The enumeration Promise should resolve after focus returns to the window.
     50  proxy.close();
     51  await Promise.all([
     52    promise_event(window, 'focus'),
     53    switch_toplevel_focus_for_window(window),
     54  ]);
     55  assert_true(document.hasFocus(), 'document.hasFocus() after focus');
     56  await promise_enumerate;
     57 }, 'enumerateDevices without focus');
     58 </script>