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>