| <!DOCTYPE html> |
| <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1" /> |
| <link rel="stylesheet" href="resources/simple-snap.css"> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script src="../../resources/gesture-util.js"></script> |
| |
| <div id='scroller'> |
| <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> |
| var scroller = document.getElementById("scroller"); |
| var topLeft = document.getElementById("top-left"); |
| var topRight = document.getElementById("top-right"); |
| |
| function scrollLeft() { |
| return scroller.scrollLeft; |
| } |
| |
| function scrollTop() { |
| return scroller.scrollTop; |
| } |
| |
| function keyPress(key) { |
| return new Promise((resolve, reject) => { |
| if (window.eventSender) { |
| eventSender.keyDown(key); |
| resolve(); |
| } |
| else { |
| reject('This test requires window.eventSender'); |
| } |
| }) |
| } |
| |
| promise_test (async () => { |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(0, 0); |
| await keyPress("ArrowDown"); |
| await waitForAnimationEndTimeBased(scrollTop); |
| assert_equals(scroller.scrollTop, 400); |
| }, "Snaps to bottom-left after pressing ArrowDown"); |
| |
| promise_test (async () => { |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(0, 400); |
| await keyPress("ArrowUp"); |
| await waitForAnimationEndTimeBased(scrollTop); |
| assert_equals(scroller.scrollTop, 0); |
| }, "Snaps to top-left after pressing ArrowUp"); |
| |
| promise_test (async () => { |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(0, 0); |
| await keyPress("ArrowRight"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| assert_equals(scroller.scrollLeft, 400); |
| }, "Snaps to top-right after pressing ArrowRight"); |
| |
| promise_test (async () => { |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(400, 0); |
| await keyPress("ArrowLeft"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| assert_equals(scroller.scrollLeft, 0); |
| }, "Snaps to top-left after pressing ArrowLeft"); |
| |
| promise_test (async () => { |
| // Make the snap area covers 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 mouseClickOn(10, 10); |
| scroller.scrollTo(0, 0); |
| await keyPress("ArrowRight"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| assert_between_exclusive(scroller.scrollLeft, 0, 500); |
| topLeft.style.width = ""; |
| topRight.style.left = "400px"; |
| }, "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 () => { |
| // Make the snap area covers the snapport. |
| topLeft.style.width = "800px"; |
| // Make the next snap offset closer than the original intended offset. |
| topRight.style.left = "20px"; |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(0, 0); |
| await keyPress("ArrowRight"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| assert_equals(scroller.scrollLeft, 20); |
| topLeft.style.width = ""; |
| topRight.style.left = "400px"; |
| }, "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 () => { |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(400, 0); |
| await keyPress("ArrowRight"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| 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 () => { |
| scroller.style.scrollSnapType = "both proximity"; |
| await mouseClickOn(10, 10); |
| scroller.scrollTo(400, 0); |
| await keyPress("ArrowRight"); |
| await waitForAnimationEndTimeBased(scrollLeft); |
| assert_greater_than(scroller.scrollLeft, 400); |
| scroller.style.scrollSnapType = "both mandatory"; |
| }, "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> |