tor-browser

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

gap-pointerdown-pointerup.html (2657B)


      1 <!DOCTYPE html>
      2 <html>
      3 <meta charset=utf-8 />
      4 <title>Event Timing: pointerdown/up gap.</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'>Click me</div>
     12 <script>
     13  promise_test(async t => {
     14    const pointerDowns = []
     15    const pointerUps = []
     16    blockNextEventListener(window, 'pointerdown', 30)
     17    blockNextEventListener(window, 'pointerup', 30)
     18 
     19    // A keydown is used as an interleaving event, to make sure the pointerdown's
     20    // timing entry had it's duration set before triggering the pointerup. Using
     21    // only `await afterNextPaint()` after the first event is not enough to
     22    // guarantee this in all browsers. See discussion in
     23    // https://github.com/web-platform-tests/wpt/pull/55577#discussion_r2466579023
     24    blockNextEventListener(window, 'keydown', 30)
     25    const {promise: interleavingEventTimingEntryObserved, resolve: resolveInterleaving } = Promise.withResolvers();
     26    new PerformanceObserver( (entries) => {
     27      entries.getEntries().forEach(  (e) => {
     28        if (e.name == 'pointerdown')
     29          pointerDowns.push(e)
     30        if (e.name =='pointerup')
     31          pointerUps.push(e)
     32        if (e.name == 'keydown')
     33          resolveInterleaving()
     34      })
     35    }).observe({type: 'event', durationThreshold: 16})
     36    const pointerDownHandled = new Promise( resolve => window.addEventListener('pointerdown', e => resolve(), true) )
     37    const pointerUpHandled = new Promise( resolve => window.addEventListener('pointerup', e => resolve(), true) )
     38 
     39    await new test_driver.Actions()
     40      .pointerMove(0, 0)
     41      .pointerDown()
     42      .send()
     43    await pointerDownHandled
     44    await afterNextPaint()
     45    await new test_driver.Actions()
     46      .keyDown('k')
     47      .keyUp('k')
     48      .send()
     49    await interleavingEventTimingEntryObserved
     50    const waitStart = performance.now()
     51    await t.step_wait(() => (performance.now() - waitStart > 50))
     52    await new test_driver.Actions()
     53      .pointerUp()
     54      .send()
     55    await pointerUpHandled
     56    await t.step_wait(() => (pointerDowns.length != 0 && pointerUps.length != 0), 'Wait for the event timing entries to be processed.')
     57    assert_equals(pointerDowns.length, 1)
     58    assert_equals(pointerUps.length, 1)
     59    assert_greater_than(pointerUps[0].startTime, pointerDowns[0].startTime + pointerDowns[0].duration)
     60  }, "pointerdown duration shouldn't wait for pointerup.")
     61 </script>
     62 </html>