<!doctype html>
<title>touch-action behavior with swipe direction changes</title>
<meta name="variant" content="?touch">
<meta name="viewport" content="width=device-width">
<link rel="help" href="https://w3c.github.io/pointerevents/#determining-supported-direct-manipulation-behavior" />
<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>
<style>
#target {
width: 200px;
height: 200px;
overflow: scroll;
}
#spacer {
width: 400px;
height: 400px;
}
#done {
width: 100px;
height: 100px;
}
</style>
<div id="target">
<div id="spacer"></div>
</div>
<div id="done"></div>
<script>
"use strict";
const pointer_type = "touch";
const target = document.getElementById("target");
const done = document.getElementById("done");
assert_true(location.search.length > 0 &&
location.search.substring(1) === pointer_type,
"Test URL has 'touch' pointer-type");
/*
For each promise_test, we have these 5 parameters in order:
- touch-action value to test,
- a list of directions ("right" or "down") in the swipe to test,
- whether scrollLeft change is expected, and
- whether scrollTop change is expected.
*/
const promise_test_params = [
["auto", ["right", "down"], true, true ],
["auto", ["down", "right"], true, true ],
["pan-x", ["right", "down"], true, false],
["pan-x", ["down", "right"], false, false],
["pan-y", ["right", "down"], false, false],
["pan-y", ["down", "right"], false, true ],
["none" , ["right", "down"], false, false],
["none" , ["down", "right"], false, false],
];
function appendSwipeActions(actions, directions) {
const deltas = {
"right": [30, 0],
"down": [0, 30],
}
let pos = [0, 0];
for (const direction of directions) {
// Move three steps along each direction.
for (let i = 0; i < 3; i++) {
pos[0] += deltas[direction][0];
pos[1] += deltas[direction][1];
actions = actions.pointerMove(pos[0], pos[1], {origin: target});
}
}
return actions;
}
for (let i = 0; i < promise_test_params.length; i++) {
let [touch_action, directions, left_change_expected, top_change_expected]
= promise_test_params[i];
promise_test(async () => {
target.style.touchAction = touch_action;
// Reset the scroll position to 50% mark on both axes.
target.scrollLeft = 100;
target.scrollTop = 100;
const done_pointerup_promise = getEvent("pointerup", done);
let actions = new test_driver.Actions()
.addPointer("TestPointer", pointer_type)
.pointerMove(0, 0, {origin: target})
.pointerDown();
actions = appendSwipeActions(actions, directions);
actions = actions.pointerUp()
.pointerMove(0, 0, {origin: done})
.pointerDown()
.pointerUp()
await actions.send();
await done_pointerup_promise;
if (left_change_expected) {
assert_less_than(target.scrollLeft, 100, "scrollLeft should change");
} else {
assert_equals(target.scrollLeft, 100, "scrollLeft should not change");
}
if (top_change_expected) {
assert_less_than(target.scrollTop, 100, "scrollTop should change");
} else {
assert_equals(target.scrollTop, 100, "scrollTop should not change");
}
}, `touch-action:${touch_action} with ${directions} swipe`);
}
</script>