summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-scroll-snap/input
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/css/css-scroll-snap/input
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/css/css-scroll-snap/input')
-rw-r--r--testing/web-platform/tests/css/css-scroll-snap/input/keyboard.html182
-rw-r--r--testing/web-platform/tests/css/css-scroll-snap/input/mouse-wheel.html70
-rw-r--r--testing/web-platform/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html158
3 files changed, 410 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/css-scroll-snap/input/keyboard.html b/testing/web-platform/tests/css/css-scroll-snap/input/keyboard.html
new file mode 100644
index 0000000000..79d0fc9f36
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scroll-snap/input/keyboard.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#scroll-snap-type" />
+<title>Arrow key scroll snapping</title>
+<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
+<meta name="flags" content="should">
+<meta name="assert"
+ content="Test passes if keyboard scrolling correctly snaps on a snap
+ container">
+
+<link rel="stylesheet" href="../support/common.css">
+
+<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="/dom/events/scrolling/scroll_support.js"></script>
+<script src="../support/common.js"></script>
+
+
+<div id="scroller" tabindex="0">
+ <div id="space"></div>
+ <div class="snap left top" id="top-left"></div>
+ <div class="snap right top" id="top-right"></div>
+ <div class="snap left bottom" id="bottom-left"></div>
+</div>
+
+<script>
+const scroller = document.getElementById("scroller");
+const topLeft = document.getElementById("top-left");
+const topRight = document.getElementById("top-right");
+
+scrollLeft = () => scroller.scrollLeft;
+scrollTop = () => scroller.scrollTop;
+
+function ScrollCounter(test, eventTarget) {
+ this.count = 0;
+ const scrollListener = () => {
+ this.count++;
+ }
+ eventTarget.addEventListener('scroll', scrollListener);
+ test.add_cleanup(() => {
+ eventTarget.removeEventListener('scroll', scrollListener);
+ });
+}
+
+async function initializeScrollPosition(scroller, x, y) {
+ return new Promise(async (resolve) => {
+ if (scroller.scrollLeft != x || scroller.scrollTop != y) {
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ scroller.scrollTo(x, y);
+ await scrollEndPromise;
+ }
+ resolve();
+ });
+}
+
+promise_test(async t => {
+ await initializeScrollPosition(scroller, 0, 0);
+ assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
+ const scrollCounter = new ScrollCounter(t, scroller);
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowDown");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop, 400);
+ // Make sure we don't jump directly to the new snap position.
+ assert_greater_than(scrollCounter.count, 1);
+}, "Snaps to bottom-left after pressing ArrowDown");
+
+promise_test(async t => {
+ await initializeScrollPosition(scroller, 0, 400);
+ assert_equals(scroller.scrollTop, 400, "verify test pre-condition");
+ const scrollCounter = new ScrollCounter(t, scroller);
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowUp");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop, 0);
+ // Make sure we don't jump directly to the new snap position.
+ assert_greater_than(scrollCounter.count, 1);
+}, "Snaps to top-left after pressing ArrowUp");
+
+promise_test(async t => {
+ await initializeScrollPosition(scroller, 0, 0);
+ assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
+ const scrollCounter = new ScrollCounter(t, scroller);
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowRight");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollLeft, 400);
+ // Make sure we don't jump directly to the new snap position.
+ assert_greater_than(scrollCounter.count, 1);
+}, "Snaps to top-right after pressing ArrowRight");
+
+promise_test(async t => {
+ await initializeScrollPosition(scroller, 400, 0);
+ assert_equals(scroller.scrollLeft, 400, "verify test pre-condition");
+ const scrollCounter = new ScrollCounter(t, scroller);
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowLeft");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollLeft, 0);
+ // Make sure we don't jump directly to the new snap position.
+ assert_greater_than(scrollCounter.count, 1);
+}, "Snaps to top-left after pressing ArrowLeft");
+
+promise_test(async t => {
+ t.add_cleanup(function() {
+ topLeft.style.width = "";
+ topRight.style.left = "400px";
+ });
+
+ // Make the snap area cover the snapport.
+ topLeft.style.width = "800px";
+ // Make the distance between the previous and the next snap position larger
+ // than snapport.
+ topRight.style.left = "500px";
+ await initializeScrollPosition(scroller, 0, 0);
+ assert_equals(scroller.scrollLeft, 0, "verify test pre-condition");
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowRight");
+ await scrollEndPromise;
+ assert_between_exclusive(scroller.scrollLeft, 0, 500);
+}, "If the original intended offset is valid as making a snap area cover the"
++ "snapport, and there's no other snap offset in between, use the original"
++ "intended offset");
+
+promise_test(async t => {
+ t.add_cleanup(function() {
+ topLeft.style.width = "";
+ topRight.style.left = "400px";
+ topRight.style.scrollSnapStop = "";
+ });
+
+ // Make the snap area cover the snapport.
+ topLeft.style.width = "800px";
+ // Make the next snap offset closer than the original intended offset.
+ topRight.style.left = "20px";
+ topRight.style.scrollSnapStop = "always";
+ await initializeScrollPosition(scroller, 0, 0);
+ assert_equals(scroller.scrollLeft, 0, "verify test pre-condition");
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowRight");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollLeft, 20);
+}, "If the original intended offset is valid as making a snap area cover the "
++ "snapport, but there's a defined snap offset in between, use the defined snap"
++ " offset.");
+
+promise_test(async t => {
+ await initializeScrollPosition(scroller, 400, 0);
+ await keyPress(scroller, "ArrowRight");
+ await waitForScrollStop(scroller);
+ assert_equals(scroller.scrollLeft, 400);
+}, "If there is no valid snap offset on the arrow key's direction other than "
++ "the current offset, and the scroll-snap-type is mandatory, stay at the "
++ "current offset.");
+
+promise_test(async t => {
+ t.add_cleanup(function() {
+ scroller.style.scrollSnapType = "both mandatory";
+ scroller.style.width = "";
+ topLeft.style.width = "";
+ });
+
+ scroller.style.scrollSnapType = "both proximity";
+
+ // This test case works only if the scroll amount of pressing "ArrowRight" is
+ // greater than the scroll snap proximity value of the scroll container.
+ // "100px" width of the scroll container works on major browsers.
+ scroller.style.width = "100px";
+ topLeft.style.width = "80px";
+
+ await initializeScrollPosition(scroller, 400, 0);
+ assert_equals(scroller.scrollLeft, 400, "verify test pre-condition");
+ const scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowRight");
+ await scrollEndPromise;
+ assert_greater_than(scroller.scrollLeft, 400);
+}, "If there is no valid snap offset on the arrow key's direction other than "
++ "the current offset, and the scroll-snap-type is proximity, go to the "
++ "original intended offset");
+</script>
diff --git a/testing/web-platform/tests/css/css-scroll-snap/input/mouse-wheel.html b/testing/web-platform/tests/css/css-scroll-snap/input/mouse-wheel.html
new file mode 100644
index 0000000000..287e594cab
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scroll-snap/input/mouse-wheel.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#scroll-snap-type" />
+<title>Mouse-wheel scroll snapping speed</title>
+<meta name="assert"
+ content="Test passes if mousewheel snaps without pausing">
+<style>
+ #scroller {
+ scroll-snap-type: block mandatory;
+ overflow: scroll;
+ height: 400px;
+ width: 400px
+ }
+ #space {
+ width: 200px;
+ height: 4000px;
+ }
+ .box {
+ scroll-snap-align: start;
+ background: blue;
+ margin-bottom: 10px;
+ width: 100px;
+ height: 100px;
+ }
+</style>
+<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="../support/common.js"></script>
+<div id="scroller">
+ <div class="box"></div>
+ <div class="box"></div>
+ <div id="space"></div>
+</div>
+<script>
+promise_test(async t => {
+ const scroller = document.getElementById("scroller");
+ scroller.scrollTo(0, 0);
+ assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
+ const scrollTop = () => {
+ return scroller.scrollTop;
+ };
+ const scrollPromise = waitForScrollEvent(scroller);
+ const wheelPromise = waitForWheelEvent(scroller);
+ const actions = new test_driver.Actions()
+ .scroll(50, 50, 0, 50, {origin: scroller, duration: 100});
+ await actions.send();
+ await wheelPromise;
+ await scrollPromise;
+ let scrollEndTime;
+ let snapEndTime;
+ // Detect first pause in scrolling.
+ const scrollStabilizedPromise =
+ waitForAnimationEnd(scrollTop).then((timestamp) => {
+ scrollEndTime = timestamp;
+ });
+ const snapEndPromise =
+ waitForScrollTo(scroller, () => {
+ return scroller.scrollTop;
+ }, 110).then((evt) => {
+ snapEndTime = evt.timestamp;
+ });
+ await Promise.all([scrollStabilizedPromise, snapEndPromise]);
+ assert_equals(scroller.scrollTop, 110,
+ 'Failed to advance to next snap target');
+ assert_true(snapEndTime < scrollEndTime,
+ 'Detected pause in scrolling before reaching snap target');
+}, "Wheel-scroll triggers snap to target position immediately.");
+</script>
diff --git a/testing/web-platform/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html b/testing/web-platform/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html
new file mode 100644
index 0000000000..0978f127fa
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/css-scroll-snap-1/#snap-overflow" />
+<title></title>
+<meta name="assert" content="Test passes if snap is to the nearest edge">
+<style>
+ body {
+ margin: 0px;
+ }
+ #scroller {
+ scroll-snap-type: block mandatory;
+ overflow-y: scroll;
+ height: 400px;
+ width: 400px
+ }
+ #space {
+ width: 200px;
+ height: 4000px;
+ }
+ .box {
+ scroll-snap-align: start;
+ background: #ccccff;
+ margin-bottom: 10px;
+ width: 300px;
+ height: 500px;
+ position: relative;
+ }
+ .header {
+ top: 0;
+ position: absolute;
+ }
+ .footer {
+ bottom: 0;
+ position: absolute;
+ }
+</style>
+<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="/dom/events/scrolling/scroll_support.js"></script>
+<script src="../support/common.js"></script>
+
+<div id="scroller" tabindex="0">
+ <div id="target" class="box">
+ <div class="header">Header 1</div>
+ <div class="footer">Footer 1</div>
+ </div>
+ <div id="next" class="box">
+ <div class="header">Header 2</div>
+ <div class="footer">Footer 2</div>
+ </div>
+ <div id="space"></div>
+</div>
+
+<script>
+// If all of the following conditions are met:
+// 1. the snap area is larger than the snapport along the scroll axis, and
+// 2. the distance between the previous and subsequent snap positions along
+// the axis is greater then the snapport size.
+//
+// Then any scroll position in which the snap area covers the snapport is
+// valid snap position. This rule facilitates scrolling around in oversized
+// elements.
+//
+// These test covers edge cases with snap-areas that overflow the snapport.
+// It should be possible to scroll to the end of an oversized snap-area.
+
+const scroller = document.getElementById("scroller");
+const target = document.getElementById("target");
+const next = document.getElementById("next");
+const scrollTop = () => {
+ return scroller.scrollTop;
+};
+const cleanup = () => {
+ target.style.height = '500px';
+};
+
+promise_test(async t => {
+ t.add_cleanup(cleanup);
+ scroller.scrollTo(0, 0);
+ assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
+
+ // Ensure we can freely scroll in an oversized element.
+ let scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowDown");
+ await scrollEndPromise;
+ assert_greater_than(scroller.scrollTop, 0,
+ 'Arrowkey scroll moved scroll position');
+ assert_less_than_equal(scroller.scrollTop, target.clientHeight,
+ 'Scroll within snap-area overflow');
+
+ // Resize the element so it is oversized by less than the line scroll amount.
+ // The next keyboard-triggered scroll should stop at the end of the snap-area.
+ // Otherwise it is not possible to scroll to the last line of the snap-area
+ // via keyboard.
+ const scrollAmount = scroller.scrollTop;
+ target.style.height = `${scroller.clientHeight + 2 * scrollAmount - 1}px`;
+ assert_equals(scroller.scrollTop, scrollAmount, "Verify container remains " +
+ "at the same covering snap offset.");
+ scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowDown");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop,
+ target.clientHeight - scroller.clientHeight,
+ 'End boundary of snap-area is valid snap target');
+
+ // Must not get stuck at a snap position. Since already at the end of the
+ // snap area, we should advance to the next.
+ scrollEndPromise = waitForScrollEnd(scroller);
+ await keyPress(scroller, "ArrowDown");
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop,
+ next.offsetTop,
+ 'Advance to next snap-area');
+
+}, "Keyboard scrolling with vertical snap-area overflow");
+
+promise_test(async t => {
+ scroller.scrollTo(0, 0);
+ assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
+
+ // Ensure we can freely scroll in an oversized element.
+ let scrollEndPromise = waitForScrollEnd(scroller);
+ await new test_driver.Actions()
+ .scroll(50, 50, 0, 50, {origin: scroller})
+ .send();
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop, 50,
+ 'Wheel-scroll moved scroll position');
+
+ // Target position for wheel scroll overshoots the boundary of the snap-area.
+ // Ensure that we stop at the boundary.
+ let scrollAmount =
+ target.clientHeight - scroller.clientHeight - scroller.scrollTop + 1;
+
+ scrollEndPromise = waitForScrollEnd(scroller);
+ await new test_driver.Actions()
+ .scroll(50, 50, 0, scrollAmount, {origin: scroller})
+ .send();
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop, 100,
+ 'End boundary of snap-area is valid snap target');
+
+ // Must not get stuck at a snap position. Since already at the end of the
+ // snap area, we should advance to the next. scrollAmount must be enough to
+ // advance to next snap position.
+ scrollAmount = next.clientHeight / 2 + 10 /* margin-bottom */;
+ scrollEndPromise = waitForScrollEnd(scroller);
+ await new test_driver.Actions()
+ .scroll(50, 50, 0, scrollAmount, {origin: scroller})
+ .send();
+ await scrollEndPromise;
+ assert_equals(scroller.scrollTop, next.offsetTop,
+ 'Advance to next snap-area');
+
+}, "Mouse-wheel scrolling with vertical snap-area overflow");
+</script>