Skip to content

Commit

Permalink
[EventTiming] Add WPT for key press
Browse files Browse the repository at this point in the history
Bug: 1265649
Change-Id: I41a22138b53f2b8fd06873fba098de9659526b1f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3624549
Commit-Queue: Ian Clelland <iclelland@chromium.org>
Reviewed-by: Nicolás Peña <npm@chromium.org>
Reviewed-by: Ian Clelland <iclelland@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1002337}
  • Loading branch information
haoliuk authored and Chromium LUCI CQ committed May 11, 2022
1 parent be821a7 commit 557e4fb
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<meta name="timeout" content="long">
<title>Event Timing: interactionId-press-key-as-input.</title>
<textarea id='test'></textarea>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-actions.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/event-timing-test-utils.js></script>

<script>
let observedEntries = [];
let map = new Map();
const events = ['keydown', 'keyup'];

async_test(function (t) {
assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');

new PerformanceObserver(t.step_func(entryList => {
observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map)));

if (observedEntries.length < 2)
return;

events.forEach(e => assert_greater_than(map.get(e), 0, 'Should have a non-trivial interactionId for ' + e + ' event'));
assert_equals(map.get('keydown'), map.get('keyup'), 'The keydown and the keyup should have the same interactionId');
assert_equals('t', document.getElementById('test').value);
t.done();
})).observe({ type: "event" });

addListenersAndPress(document.getElementById('test'), 't', events);
}, "Event Timing: compare event timing interactionId for key press as input.");
</script>

</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<meta name="timeout" content="long">
<title>Event Timing: interactionId-press-key-no-effect.</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-actions.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/event-timing-test-utils.js></script>

<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempus
lacinia nisi, eget tempor orci. Nullam congue pharetra arcu, et consectetur
massa mollis tincidunt. Quisque odio sapien, viverra finibus lectus ac,
consectetur ornare quam. In hac habitasse platea dictumst. Morbi cursus est
odio, non fermentum ligula posuere vitae. Sed ullamcorper convallis rhoncus.
In condimentum neque nec metus hendrerit, et cursus ipsum aliquet.
</p>
</body>
<script>
let observedEntries = [];
let map = new Map();
const events = ['keydown', 'keyup'];

async_test(function (t) {
assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');

new PerformanceObserver(t.step_func(entryList => {
observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map)));

if (observedEntries.length < 2)
return;

events.forEach(e => assert_greater_than(map.get(e), 0, 'Should have a non-trivial interactionId for ' + e + ' event'));
assert_equals(map.get('keydown'), map.get('keyup'), 'The keydown and the keyup should have the same interactionId');
t.done();
})).observe({ type: "event" });

addListenersAndPress(document.body, 't', events);
}, "Event Timing: compare event timing interactionId for key press with no effect.");
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -14,50 +14,24 @@
<script>
let observedEntries = [];
let map = new Map();

function eventsForCheck(entry) {
if (entry.name === 'pointerdown' || entry.name === 'pointerup') {
map.set(entry.name, entry.interactionId);
return true;
}
return false;
}

async function tapOn(element_id) {
const element = document.getElementById(element_id);

const clickHandler = (e) => {
mainThreadBusy(200);
};

element.addEventListener("pointerdown", clickHandler);
element.addEventListener("pointerup", clickHandler);

let actions = new test_driver.Actions()
.addPointer("tapPointer", "touch")
.pointerMove(0, 0, { origin: element })
.pointerDown()
.pointerUp();
await actions.send();
}
const events = ['pointerdown', 'pointerup'];

async_test(function (t) {
assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');

new PerformanceObserver(t.step_func(entryList => {
observedEntries = observedEntries.concat(entryList.getEntries().filter(eventsForCheck));
observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map)));

if (observedEntries.length < 2)
return;

assert_greater_than(map.get('pointerdown'), 0, 'Should have a non-trivial interactionId');
assert_greater_than(map.get('pointerup'), 0, 'Should have a non-trivial interactionId');
assert_equals(map.get('pointerdown'), map.get('pointerup'), 'Pointerdown and pointerup should have the same interactionId');
events.forEach(e => assert_greater_than(map.get(e), 0, 'Should have a non-trivial interactionId for ' + e + ' event'));
assert_equals(map.get('pointerdown'), map.get('pointerup'), 'The pointerdown and the pointerup should have the same interactionId');
t.done();
})).observe({ type: "event" });

tapOn('test');
}, "Event Timing: compare event timing interactionId.");
addListenersAndTap(document.getElementById('test'), events);
}, "Event Timing: compare event timing interactionId for tap.");
</script>

</html>
Original file line number Diff line number Diff line change
Expand Up @@ -275,3 +275,51 @@ async function testEventType(t, eventType, looseCount=false) {

await observerPromise;
}

function addListeners(element, events) {
const clickHandler = (e) => {
mainThreadBusy(200);
};
events.forEach(e => { element.addEventListener(e, clickHandler); });
}

// The testdriver.js, testdriver-vendor.js and testdriver-actions.js need to be
// included to use this function.
async function tap(element) {
let actions = new test_driver.Actions()
.addPointer("tapPointer", "touch")
.pointerMove(0, 0, { origin: element })
.pointerDown()
.pointerUp();
await actions.send();
}

// The testdriver.js, testdriver-vendor.js need to be included to use this
// function.
async function pressKey(element, key) {
await test_driver.send_keys(element, key);
}

// The testdriver.js, testdriver-vendor.js and testdriver-actions.js need to be
// included to use this function.
async function addListenersAndTap(element, events) {
addListeners(element, events);
tap(element);
}

// The testdriver.js, testdriver-vendor.js need to be included to use this
// function.
async function addListenersAndPress(element, key, events) {
addListeners(element, events);
pressKey(element, key);
}

function filterAndAddToMap(events, map) {
return function (entry) {
if (events.includes(entry.name)) {
map.set(entry.name, entry.interactionId);
return true;
}
return false;
}
}

0 comments on commit 557e4fb

Please sign in to comment.