1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<title>Event Timing: pointerdown and pointerup should not overlap when there is a paint in between</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=/resources/testdriver-actions.js></script>
<script src=resources/event-timing-test-utils.js></script>
<button id='button'>Click me.</button>
<script>
promise_test(async t => {
assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
const button = document.getElementById('button');
const observedEntries = [];
button.addEventListener('click', () => {
mainThreadBusy(150);
});
const observerPromise = new Promise(resolve => {
new PerformanceObserver(entryList => {
observedEntries.push(...entryList.getEntries().filter(entry =>
entry.name === 'pointerdown' || entry.name === 'pointerup' || entry.name === 'click'
));
// We expect pointerdown, pointerup, and click.
if (observedEntries.length >= 3) {
resolve();
}
}).observe({entryTypes: ['event', 'first-input'], buffered: true});
});
const actions1 = new test_driver.Actions();
await actions1
.addPointer("testPointer", "mouse")
.pointerMove(0, 0, { origin: button })
.pointerDown({ button: actions1.ButtonType.LEFT })
.pause(50)
.send();
// Wait for a paint to occur
await afterNextPaint();
// Perform pointerup
const actions2 = new test_driver.Actions();
await actions2
.addPointer("testPointer", "mouse")
.pointerMove(0, 0, { origin: button })
.pointerUp({ button: actions2.ButtonType.LEFT })
.send();
await observerPromise;
const pointerdownEntry = observedEntries.find(e => e.name === 'pointerdown');
const pointerupEntry = observedEntries.find(e => e.name === 'pointerup');
const clickEntry = observedEntries.find(e => e.name === 'click');
assert_true(!!pointerdownEntry, 'Should have pointerdown entry');
assert_true(!!pointerupEntry, 'Should have pointerup entry');
assert_true(!!clickEntry, 'Should have click entry');
// Calculate end times: startTime + duration.
const pointerdownEndTime = pointerdownEntry.startTime + pointerdownEntry.duration;
const pointerupStartTime = pointerupEntry.startTime;
// pointerdown should complete BEFORE pointerup starts.
assert_less_than_equal(pointerdownEndTime, pointerupStartTime,
'pointerdown should end before or when pointerup starts (no overlap)');
}, 'pointerdown and pointerup should not overlap when there is no pointerdown handler');
</script>
</html>
|