tor-browser

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

interactionid-aux-pointerdown.html (2626B)


      1 <!DOCTYPE html>
      2 <html>
      3 <meta charset=utf-8 />
      4 <title>Event Timing: interactionId-aux-pointerdown</title>
      5 <script src=/resources/testharness.js></script>
      6 <script src=/resources/testharnessreport.js></script>
      7 <script src=/resources/testdriver.js></script>
      8 <script src=/resources/testdriver-actions.js></script>
      9 <script src=/resources/testdriver-vendor.js></script>
     10 <script src=resources/event-timing-test-utils.js></script>
     11 <div id='target'>Right click me to bring up OS level contextmenu popup.</div>
     12 
     13 <script>
     14  let platformSupported = false;
     15  const map = new Map();
     16  const events = ['pointerdown'];
     17 
     18  // This test replicates a real world scenario that - on triggering contextmenu
     19  // with a pointer, pointerdown is captured but not pointerup. (crbug/1413096)
     20  // In this case, we need to make sure event timing will correctly report the
     21  // pointerdown entry with a valid/non-trivial interactionId.
     22  promise_test(async t => {
     23    assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
     24    // Workaround https://bugs.webkit.org/show_bug.cgi?id=213060, which causes
     25    // WebKit-based browsers to never release the pointerdown, breaking
     26    // subsequent tests.
     27    t.add_cleanup(() => orphanAuxPointerup(document.getElementById('target')).catch(() => {}));
     28    // This test is not applicable to platforms like Windows where contextmenu
     29    // is triggered on aux pointerup. So we do a platform behavior test first to
     30    // distinguish and skip those platforms who do not dispatch contextmenu on
     31    // aux pointerdown.
     32    document.getElementById('target').addEventListener('contextmenu', () => { platformSupported = true; });
     33    await auxPointerdown(document.getElementById('target'));
     34    // 2000ms is a magic number picked to wait for contextmenu being observed
     35    // from the performance observer. Consider enlarge it if flaky.
     36    await t.step_timeout(() => { }, 2000);
     37    if (!platformSupported) {
     38      return;
     39    }
     40 
     41    // Perform test on qualified platforms
     42    const callback = (entryList) => { entryList.getEntries().filter(filterAndAddToMap(events, map)); };
     43    const readyToResolve = () => { return map.has('pointerdown'); };
     44    const observerPromise = createPerformanceObserverPromise(['event'], callback, readyToResolve);
     45 
     46    await interactAndObserve('aux-pointerdown', document.getElementById('target'), observerPromise);
     47 
     48    assert_greater_than(map.get('pointerdown'), 0, 'The pointerdown entry should have a non-trivial interactionId');
     49  }, "Event Timing: verify pointerdown reporting for mouse aux pointerdown only triggered contextmenu.");
     50 
     51 </script>
     52 </html>