Commit b1ba120f authored by Lan Wei's avatar Lan Wei Committed by Commit Bot

Modify the web platform tests with mouse inputs to use TestDriver

Since we have implemented test_driver Actions API, we will replace
chrome.gpuBenchmarking.pointerActionSequence with this Actions API in
all the tests. This CL will just replace the web platform tests with
mouse inputs.

Bug: 893480
Change-Id: Ie4eb7f4b8aaf23b2664182c5b8e814c7113dcf9a
Reviewed-on: https://chromium-review.googlesource.com/c/1296823
Commit-Queue: Lan Wei <lanwei@chromium.org>
Reviewed-by: default avatarNavid Zolghadr <nzolghadr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610898}
parent d8d233ac
......@@ -2120,7 +2120,6 @@ virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-a
virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onerror-manual.https.html [ WontFix ]
virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onresult-manual.https.html [ WontFix ]
virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-stop-manual.https.html [ WontFix ]
external/wpt/pointerevents/pointerevent_pointermove-manual.html [ WontFix ]
[ Retina ] external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ WontFix ]
# ====== Tests incompatible with the default Site Isolation from here ======
......
This is a testharness.js-based test.
FAIL TestDriver actions: element position assert_array_equals: property 0, expected 50 but got 0
Harness: the test ran to completion.
......@@ -6,6 +6,9 @@
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
<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>
<!-- Additional helper script for common checks across event types -->
<script type="text/javascript" src="pointerevent_support.js"></script>
</head>
......@@ -84,6 +87,8 @@
test_pointermove0.done();
event_log.push('pointermove@target0');
pointermoveNoCaptureGot0 = true;
// Second dispatch a pointer move to target1.
new test_driver.Actions().pointerMove(0, 0, {origin: target1}).send();
}
if(isPointerCapture) {
if(!pointermoveCaptureGot0) {
......@@ -99,6 +104,8 @@
}, "pointermove received for captured element while out of it");
event_log.push('pointermove@target0');
pointermoveCaptureGot0 = true;
// Fourth dispatch a pointer move to target0.
new test_driver.Actions().pointerMove(0, 0, {origin: target0}).send();
}
if((event.clientX > target0.getBoundingClientRect().left)&&
(event.clientX < target0.getBoundingClientRect().right)&&
......@@ -114,6 +121,9 @@
}
});
// First dispatch a pointer move to target0.
new test_driver.Actions().pointerMove(0, 0, {origin: target0}).send();
on_event(target1, "pointermove", function (event) {
if(isPointerCapture == true) {
test(function() {
......@@ -124,6 +134,14 @@
test_pointermove1.done();
event_log.push('pointermove@target1');
pointermoveNoCaptureGot1 = true;
// Third, drag the mouse from btnCapture, target1 to target0.
new test_driver.Actions()
.pointerMove(0, 0, {origin: btnCapture})
.pointerDown()
.pointerMove(0, 0, {origin: target1})
.pointerMove(0, 0, {origin: target0})
.pointerUp()
.send();
}
});
}
......
......@@ -7,6 +7,9 @@
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
<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>
<!-- Additional helper script for common checks across event types -->
<script type="text/javascript" src="pointerevent_support.js"></script>
</head>
......@@ -32,6 +35,9 @@
eventTested = true;
}
});
// Inject the inputs to run this test.
new test_driver.Actions().pointerMove(0, 0, {origin: target0}).send();
}
</script>
<h1>Pointer Events pointermove Tests</h1>
......
......@@ -9,6 +9,9 @@
<!-- /resources/testharness.js -->
<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>
<!-- Additional helper script for common checks across event types -->
<script type="text/javascript" src="pointerevent_support.js"></script>
<script type="text/javascript">
......@@ -46,6 +49,14 @@
});
test_pointerEvent.done(); // complete test
});
// Dispatch a mouse drag in target0.
new test_driver.Actions()
.pointerMove(0, 0, {origin: target0})
.pointerDown()
.pointerMove(3, 3, {origin: target0})
.pointerUp()
.send();
}
</script>
</head>
......
......@@ -7,6 +7,9 @@
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
<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>
<!-- Additional helper script for common checks across event types -->
<script type="text/javascript" src="pointerevent_support.js"></script>
</head>
......@@ -64,6 +67,15 @@
test_pointermove.done();
eventTested = true;
});
// Click on both left and middle buttons.
var actions = new test_driver.Actions();
actions.pointerMove(0, 0, {origin: target0, button: actions.ButtonType.LEFT})
.pointerDown({button: actions.ButtonType.LEFT})
.pointerDown({button: actions.ButtonType.MIDDLE})
.pointerUp({button: actions.ButtonType.MIDDLE})
.pointerUp({button: actions.ButtonType.LEFT})
.send();
}
</script>
<h1>Pointer Events pointermove on button state changes Tests</h1>
......
......@@ -6,6 +6,9 @@
<meta name="viewport" content="width=device-width">
<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="pointerevent_support.js"></script>
</head>
<body onload="run()">
......@@ -33,8 +36,13 @@
on_event(target0, "pointerover", function (event) {
detected_pointertypes[event.pointerType] = true;
target0.setPointerCapture(event.pointerId);
// After we receive a pointerover event, dispatch a pointer move to move out of target0.
new test_driver.Actions().pointerMove(0, 0).send();
});
// First dispatch a pointer move to target0.
new test_driver.Actions().pointerMove(0, 0, {origin: target0}).send();
// When the setPointerCapture method is invoked, if the specified pointer is not in active button state, then the method must have no effect on subsequent pointer events.
// TA: 13.2
on_event(target0, "pointerout", function (event) {
......
......@@ -22,6 +22,14 @@
}
Actions.prototype = {
ButtonType: {
LEFT: 0,
MIDDLE: 1,
RIGHT: 2,
BACK: 3,
FORWARD: 4,
},
/**
* Generate the action sequence suitable for passing to
* test_driver.action_sequence
......@@ -98,7 +106,7 @@
* @returns {Actions}
*/
addKeyboard: function(name, set=true) {
this.createSource("key", name, true);
this.createSource("key", name);
if (set) {
this.setKeyboard(name);
}
......@@ -125,7 +133,7 @@
* @returns {Actions}
*/
addPointer: function(name, pointerType="mouse", set=true) {
this.createSource("pointer", name, true, {pointerType: pointerType});
this.createSource("pointer", name, {pointerType: pointerType});
if (set) {
this.setPointer(name);
}
......@@ -225,7 +233,7 @@
* pointer source
* @returns {Actions}
*/
pointerDown: function({button=0, sourceName=null}={}) {
pointerDown: function({button=this.ButtonType.LEFT, sourceName=null}={}) {
let source = this.getSource("pointer", sourceName);
source.pointerDown(this, button);
return this;
......@@ -239,7 +247,7 @@
* source
* @returns {Actions}
*/
pointerUp: function({button=0, sourceName=null}={}) {
pointerUp: function({button=this.ButtonType.LEFT, sourceName=null}={}) {
let source = this.getSource("pointer", sourceName);
source.pointerUp(this, button);
return this;
......
......@@ -192,7 +192,7 @@
* @returns {Promise} fufiled after the actions are performed, or rejected in
* the cases the WebDriver command errors
*/
action_sequence(actions) {
action_sequence: function(actions) {
return window.test_driver_internal.action_sequence(actions);
}
};
......
......@@ -6,6 +6,9 @@
<link rel="author" title="Google" href="http://www.google.com/" />
<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>
var testMouseUp = async_test('Tests that the mouseup is preventable.');
var received_back = false;
......@@ -24,10 +27,21 @@
testMouseUp.done();
}
});
function inject_input() {
// First click on back button and then forward button.
var actions = new test_driver.Actions();
actions.pointerMove(0, 0, {origin: target})
.pointerDown({button: actions.ButtonType.BACK})
.pointerUp({button: actions.ButtonType.BACK})
.pointerDown({button: actions.ButtonType.FORWARD})
.pointerUp({button: actions.ButtonType.FORWARD})
.send();
}
</script>
</head>
<body id="target">
<body id="target" onload="inject_input()">
<h4>Test Description: Tests that the mouseup event is prevented.
<ol>
<li>Click the back mouse button</li>
......
importAutomationScript('/pointerevents/pointerevent_common_input.js');
function inject_input() {
return mouseMoveIntoTarget('#target0').then(function() {
return mouseMoveIntoTarget('#target1');
}).then(function() {
return mouseDragInTargets(['#btnCapture', '#target1', '#target0']);
}).then(function() {
// To handle delayed capturing.
return mouseMoveIntoTarget('#target0');
});
}
importAutomationScript('/pointerevents/pointerevent_common_input.js');
function inject_input() {
return mouseDragInTarget('#target0');
}
importAutomationScript('/pointerevents/pointerevent_common_input.js');
function inject_input() {
return mouseChordedButtonPress('#target0');
}
\ No newline at end of file
importAutomationScript('/pointerevents/pointerevent_common_input.js');
function inject_input() {
return mouseMoveIntoTarget('#target0').then(function() {
return mouseMoveToDocument();
});
}
importAutomationScript('/pointerevents/pointerevent_common_input.js');
function inject_input() {
return mouseClickInTarget('#target', undefined, /* back button */ 3).then(function() {
return mouseClickInTarget('#target', undefined, /* forward button */ 4);
});
}
......@@ -6,43 +6,43 @@
const leftButton = 0;
function getInViewCenterPoint(rect) {
var left = Math.max(0, rect.left);
var right = Math.min(window.innerWidth, rect.right);
var top = Math.max(0, rect.top);
var bottom = Math.min(window.innerHeight, rect.bottom);
var left = Math.max(0, rect.left);
var right = Math.min(window.innerWidth, rect.right);
var top = Math.max(0, rect.top);
var bottom = Math.min(window.innerHeight, rect.bottom);
var x = 0.5 * (left + right);
var y = 0.5 * (top + bottom);
var x = 0.5 * (left + right);
var y = 0.5 * (top + bottom);
return [x, y];
return [x, y];
}
function getPointerInteractablePaintTree(element) {
if (!window.document.contains(element)) {
return [];
}
if (!window.document.contains(element)) {
return [];
}
var rectangles = element.getClientRects();
var rectangles = element.getClientRects();
if (rectangles.length === 0) {
return [];
}
if (rectangles.length === 0) {
return [];
}
var centerPoint = getInViewCenterPoint(rectangles[0]);
var centerPoint = getInViewCenterPoint(rectangles[0]);
if ("elementsFromPoint" in document) {
return document.elementsFromPoint(centerPoint[0], centerPoint[1]);
} else if ("msElementsFromPoint" in document) {
var rv = document.msElementsFromPoint(centerPoint[0], centerPoint[1]);
return Array.prototype.slice.call(rv ? rv : []);
} else {
throw new Error("document.elementsFromPoint unsupported");
}
if ("elementsFromPoint" in document) {
return document.elementsFromPoint(centerPoint[0], centerPoint[1]);
} else if ("msElementsFromPoint" in document) {
var rv = document.msElementsFromPoint(centerPoint[0], centerPoint[1]);
return Array.prototype.slice.call(rv ? rv : []);
} else {
throw new Error("document.elementsFromPoint unsupported");
}
}
function inView(element) {
var pointerInteractablePaintTree = getPointerInteractablePaintTree(element);
return pointerInteractablePaintTree.indexOf(element) !== -1;
var pointerInteractablePaintTree = getPointerInteractablePaintTree(element);
return pointerInteractablePaintTree.indexOf(element) !== -1;
}
window.test_driver_internal.click = function(element, coords) {
......@@ -77,48 +77,56 @@
window.test_driver_internal.action_sequence = function(actions) {
if (window.top !== window) {
return Promise.reject(new Error("can only send keys in top-level window"));
return Promise.reject(new Error("can only send keys in top-level window"));
}
var didScrollIntoView = false;
for (let i = 0; i < actions.length; i++) {
for (let j = 0; j < actions[i].actions.length; j++) {
if ('origin' in actions[i].actions[j]) {
if (actions[i].actions[j].origin == "viewport")
continue;
if (actions[i].actions[j].origin == "pointer")
return Promise.reject(new Error("pointer origin is not supported right now"));
let element = actions[i].actions[j].origin;
if (!window.document.contains(element)) {
return Promise.reject(new Error("element in different document or shadow tree"));
}
if (!inView(element)) {
if (didScrollIntoView)
return Promise.reject(new Error("already scrolled into view, the element is not found"));
element.scrollIntoView({behavior: "instant",
block: "end",
inline: "nearest"});
didScrollIntoView = true;
}
var pointerInteractablePaintTree = getPointerInteractablePaintTree(element);
if (pointerInteractablePaintTree.length === 0 ||
!element.contains(pointerInteractablePaintTree[0])) {
return Promise.reject(new Error("element click intercepted error"));
}
var rect = element.getClientRects()[0];
var centerPoint = getInViewCenterPoint(rect);
var x = centerPoint[0];
var y = centerPoint[1];
actions[i].actions[j].x += x;
actions[i].actions[j].y += y;
}
var last_x_position = 0;
var last_y_position = 0;
for (let j = 0; j < actions[i].actions.length; j++) {
if ('origin' in actions[i].actions[j]) {
if (actions[i].actions[j].origin == "viewport") {
last_x_position = actions[i].actions[j].x;
last_y_position = actions[i].actions[j].y;
continue;
}
if (actions[i].actions[j].origin == "pointer")
return Promise.reject(new Error("pointer origin is not supported right now"));
let element = actions[i].actions[j].origin;
if (!window.document.contains(element)) {
return Promise.reject(new Error("element in different document or shadow tree"));
}
if (!inView(element)) {
if (didScrollIntoView)
return Promise.reject(new Error("already scrolled into view, the element is not found"));
element.scrollIntoView({behavior: "instant",
block: "end",
inline: "nearest"});
didScrollIntoView = true;
}
var pointerInteractablePaintTree = getPointerInteractablePaintTree(element);
if (pointerInteractablePaintTree.length === 0 ||
!element.contains(pointerInteractablePaintTree[0])) {
return Promise.reject(new Error("element click intercepted error"));
}
var rect = element.getClientRects()[0];
var centerPoint = getInViewCenterPoint(rect);
last_x_position = actions[i].actions[j].x + centerPoint[0];
last_y_position = actions[i].actions[j].y + centerPoint[1];
}
if (actions[i].actions[j].type == "pointerDown" || actions[i].actions[j].type == "pointerMove") {
actions[i].actions[j].x = last_x_position;
actions[i].actions[j].y = last_y_position;
}
}
}
return new Promise(function(resolve, reject) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment