Skip to content

Commit d830a75

Browse files
kevers-googlemoz-wptsync-bot
authored andcommitted
Bug 1931912 [wpt PR 49228] - Refactor pointerevent_poitnerId_scope test, a=testonly
Automatic update from web-platform-tests Refactor pointerevent_poitnerId_scope test This test was periodically flaking on debug builds. A timeout would resolve if we did not see the expected number of events. This is possible due to event coalescing. Added a click on each of the targets to ensure that we get the expected number of events. Also removed the manual testing instructions and converted the test to be promise driven. Bug: 352327319 Change-Id: I3aefac84b6be0ca76a9678e03eef3c89d0e18092 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6020360 Reviewed-by: Mustaq Ahmed <[email protected]> Commit-Queue: Kevin Ellis <[email protected]> Cr-Commit-Position: refs/heads/main@{#1384414} -- wpt-commits: a113ac4fa26c11b773c3f3cafe95f95370908f41 wpt-pr: 49228
1 parent 7b56c4d commit d830a75

File tree

1 file changed

+167
-113
lines changed

1 file changed

+167
-113
lines changed
Lines changed: 167 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,170 @@
11
<!doctype html>
22
<html>
3-
<!--
4-
Test cases for Pointer Events v1 spec
5-
This document references Test Assertions (abbrev TA below) written by Cathy Chan
6-
http://www.w3.org/wiki/PointerEvents/TestAssertions
7-
-->
8-
<head>
9-
<title>Pointer Events pointerdown tests</title>
10-
<meta name="viewport" content="width=device-width">
11-
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
12-
<script src="/resources/testharness.js"></script>
13-
<script src="/resources/testharnessreport.js"></script>
14-
<script src="/resources/testdriver.js"></script>
15-
<script src="/resources/testdriver-actions.js"></script>
16-
<script src="/resources/testdriver-vendor.js"></script>
17-
<!-- Additional helper script for common checks across event types -->
18-
<script type="text/javascript" src="pointerevent_support.js"></script>
19-
<script>
20-
var detected_pointertypes = {};
21-
var test_pointerEvent = async_test("pointerId of an active pointer is the same across iframes");
22-
// showPointerTypes is defined in pointerevent_support.js
23-
// Requirements: the callback function will reference the test_pointerEvent object and
24-
// will fail unless the async_test is created with the var name "test_pointerEvent".
25-
add_completion_callback(showPointerTypes);
26-
var detected_pointertypes = {};
27-
28-
function loadFrame() {
29-
return new Promise(resolve => {
30-
const innerframe = document.getElementById("innerframe");
31-
innerframe.onload = resolve;
32-
innerframe.src =
33-
"resources/pointerevent_pointerId_scope-iframe.html";
34-
});
35-
}
36-
37-
async function run() {
38-
await loadFrame();
39-
40-
var target0 = document.getElementById("target0");
41-
var innerframe = document.getElementById("innerframe");
42-
var target1 = innerframe.contentWindow.document.getElementsByTagName("div")[0];
43-
var pointerover_pointerId = null;
44-
var pointerover_pointerType = null;
45-
46-
var eventList = ['pointerenter', 'pointerover', 'pointermove', 'pointerout', 'pointerleave'];
47-
var receivedEvents = {};
48-
var receivedEventsInnerFrame = {};
49-
50-
51-
function checkPointerId(event, inner) {
52-
detected_pointertypes[event.pointerType] = true;
53-
var eventName = (inner ? "inner frame " : "" ) + event.type;
54-
test_pointerEvent.step(function() {
55-
assert_equals(event.pointerId, pointerover_pointerId, "PointerId of " + eventName + " is not correct");
56-
assert_equals(event.pointerType, pointerover_pointerType, "PointerType of " + eventName + " is not correct");
57-
}, eventName + ".pointerId were the same as first pointerover");
58-
}
59-
60-
on_event(window, "message", function(event) {
61-
if (event.source != innerframe.contentWindow) {
62-
return;
63-
}
64-
receivedEventsInnerFrame[event.data.type] = 1;
65-
checkPointerId(event.data, true);
66-
if (Object.keys(receivedEvents).length == eventList.length && Object.keys(receivedEventsInnerFrame).length == eventList.length)
67-
test_pointerEvent.done();
68-
});
69-
70-
eventList.forEach(function(eventName) {
71-
on_event(target0, eventName, function (event) {
72-
if (pointerover_pointerId === null && event.type == 'pointerover') {
73-
pointerover_pointerId = event.pointerId;
74-
pointerover_pointerType = event.pointerType;
75-
} else {
76-
checkPointerId(event, false);
77-
}
78-
receivedEvents[event.type] = 1;
79-
});
80-
});
81-
82-
var iframeRect = innerframe.getClientRects()[0];
83-
var rect = target1.getClientRects()[0];
84-
var center_x = Math.round(iframeRect.left + (rect.left + rect.right) / 2);
85-
var center_y = Math.round(iframeRect.top + (rect.top + rect.bottom) / 2);
86-
await new test_driver.Actions()
87-
.pointerMove(0, 0, {origin: target0})
88-
.pointerMove(center_x, center_y)
89-
.pointerMove(center_y, center_y + 100)
90-
.send();
91-
}
92-
</script>
93-
</head>
94-
<body onload="run()">
95-
<h1>Pointer Events pointerdown tests</h1>
96-
Complete the following actions:
97-
<ol>
98-
<li>Start with your pointing device outside of black box, then move it into black box. If using touch just press in black box and don't release.
99-
<li>Move your pointing device into purple box (without leaving the digitizer range if you are using hover supported pen or without releasing touch if using touch). Then move it out of the purple box.
100-
</ol>
101-
<div id="target0" class="touchActionNone">
102-
</div>
103-
<!-- Document onload does not guarantee that child iframes have loaded.
104-
Force synchronization by deferring setting the iframe's source
105-
until a promise is set up to capture its load event. The root
106-
document will load first, then the iframe. This ordering ensures
107-
deterministic behavior.
108-
-->
109-
<iframe id="innerframe"></iframe>
110-
<div id="complete-notice">
111-
<p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
112-
<p>Refresh the page to run the tests again with a different pointer type.</p>
113-
</div>
114-
<div id="log"></div>
115-
</body>
3+
<head>
4+
<title>Pointer Events pointerdown tests</title>
5+
<meta name="viewport" content="width=device-width">
6+
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
7+
<link rel="help" href="https://w3c.github.io/pointerevents/#dom-pointerevent-pointerid">
8+
<script src="/resources/testharness.js"></script>
9+
<script src="/resources/testharnessreport.js"></script>
10+
<script src="/resources/testdriver.js"></script>
11+
<script src="/resources/testdriver-actions.js"></script>
12+
<script src="/resources/testdriver-vendor.js"></script>
13+
<!-- Additional helper script for common checks across event types -->
14+
<script type="text/javascript" src="pointerevent_support.js"></script>
15+
<script>
16+
"use strict"
17+
18+
function loadFrame() {
19+
return new Promise(resolve => {
20+
const innerframe = document.getElementById("innerframe");
21+
innerframe.onload = resolve;
22+
innerframe.src =
23+
"resources/pointerevent_pointerId_scope-iframe.html";
24+
});
25+
}
26+
27+
const eventList = [
28+
'pointerenter',
29+
'pointerover',
30+
'pointermove',
31+
'pointerout',
32+
'pointerleave'
33+
];
34+
35+
function recordEvents(test) {
36+
const target0 = document.getElementById("target0");
37+
const innerframe = document.getElementById("innerframe");
38+
let activePointerId = undefined;
39+
let activePointerType = undefined;
40+
const eventsReceived = {
41+
'inner': {},
42+
'outer': {},
43+
};
44+
45+
// Records the last event of a given type in the case of multiple
46+
// events.
47+
const recordEvent = (event, context) => {
48+
if (activePointerId === undefined) {
49+
activePointerId = event.pointerId;
50+
}
51+
if (activePointerType == undefined) {
52+
activePointerType= event.pointerType;
53+
}
54+
eventsReceived[context][event.type] = {
55+
pointerId: event.pointerId,
56+
pointerType: event.pointerType
57+
};
58+
}
59+
60+
const listener = (event) => {
61+
recordEvent(event, 'outer');
62+
};
63+
eventList.forEach(eventType => {
64+
target0.addEventListener(eventType, listener);
65+
});
66+
67+
const messageListener = (event) => {
68+
if (event.source != innerframe.contentWindow) {
69+
return;
70+
}
71+
recordEvent(event.data, 'inner');
72+
};
73+
window.addEventListener('message', messageListener);
74+
75+
test.add_cleanup(() => {
76+
eventList.forEach(eventType => {
77+
target0.removeEventListener(eventType, listener);
78+
});
79+
window.removeEventListener('message', messageListener);
80+
});
81+
82+
return new Promise(resolve => {
83+
document.addEventListener('pointerup', () => {
84+
// As pointer events for the inner frame are routed via a post
85+
// message, the outer frame won't see the event until the following
86+
// event processing loop. Allow 2 additional animation frames to
87+
// ensure adequate time to receive the events.
88+
waitForAnimationFrames(2).then(() => {
89+
eventsReceived.activePointerId = activePointerId;
90+
eventsReceived.activePointerType = activePointerType;
91+
resolve(eventsReceived);
92+
});
93+
}, { once: true });
94+
});
95+
96+
};
97+
98+
async function run() {
99+
await loadFrame();
100+
101+
const target0 = document.getElementById("target0");
102+
const innerframe = document.getElementById("innerframe");
103+
const target1 =
104+
innerframe.contentWindow.document.getElementsByTagName("div")[0];
105+
106+
promise_test(async t => {
107+
const results = recordEvents(t);
108+
// Move from the target in the outer-frame to a target in the inner-
109+
// frame, click on second target, move back to the first and click.
110+
// The inner target is not centered in the iframe, thus its position
111+
// needs to be calculated.
112+
const iframeRect = innerframe.getClientRects()[0];
113+
const rect = target1.getClientRects()[0];
114+
const center_x =
115+
Math.round(iframeRect.left + (rect.left + rect.right) / 2);
116+
const center_y =
117+
Math.round(iframeRect.top + (rect.top + rect.bottom) / 2);
118+
119+
await new test_driver.Actions()
120+
.pointerMove(0, 0, { origin: target0 })
121+
.pointerMove(center_x, center_y)
122+
.pointerDown()
123+
.pointerUp()
124+
.pointerMove(0, 0, { origin: target0 })
125+
.pointerDown()
126+
.pointerUp()
127+
.send();
128+
129+
const events = await results;
130+
131+
assert_equals(
132+
Object.keys(events.outer).length, eventList.length,
133+
"Missing events for outer target");
134+
assert_equals(
135+
Object.keys(events.inner).length, eventList.length,
136+
"Missing events for inner target");
137+
138+
const activePointerId = events.activePointerId;
139+
const activePointerType = events.activePointerType;
140+
eventList.forEach(eventName => {
141+
assert_equals(
142+
events.inner[eventName].pointerId, activePointerId,
143+
`PointerId of ${eventName} in the inner frame is not correct`);
144+
assert_equals(
145+
events.outer[eventName].pointerId, activePointerId,
146+
`PointerId of ${eventName} in the outer frame is not correct`);
147+
assert_equals(
148+
events.inner[eventName].pointerType, activePointerType,
149+
`PointerType of ${eventName} in the inner frame is not correct`);
150+
assert_equals(
151+
events.outer[eventName].pointerType, activePointerType,
152+
`PointerType of ${eventName} in the outer frame is not correct`);
153+
});
154+
}, 'pointerId of an active pointer is the same across same origin ' +
155+
'frames');
156+
}
157+
</script>
158+
</head>
159+
<body onload="run()">
160+
<h1>Pointer Events pointer ID tests</h1>
161+
<div id="target0" class="touchActionNone"></div>
162+
<!-- Document onload does not guarantee that child iframes have loaded.
163+
Force synchronization by deferring setting the iframe's source
164+
until a promise is set up to capture its load event. The root
165+
document will load first, then the iframe. This ordering ensures
166+
deterministic behavior.
167+
-->
168+
<iframe id="innerframe"></iframe>
169+
</body>
116170
</html>

0 commit comments

Comments
 (0)