<!DOCTYPE html>
<html>
    <head>
        <style>
            #grid-container {
                width: 415px;
                height: 415px;
                overflow: scroll;
                white-space: nowrap;
                -webkit-overflow-scrolling: touch;
                scroll-snap-type: both mandatory;
                line-height: 0px;
            }

            .cell {
                width: 400px;
                height: 400px;
                display: inline-block;
                scroll-snap-align: start;
                background-color: red;
                margin: 0;
                padding: 0;
                position: relative;
            }

            #green {
                background-color: green;
            }

            #snap-from > p {
                position: absolute;
                top: 0px;
                left: 10px;
                margin-top: 0px;
            }
        </style>
        <script src="../../../resources/js-test.js"></script>
        <script>
        window.jsTestIsAsync = true;

        var divTarget;
        var divScrollPositionBeforeGlide;
        var divScrollPositionBeforeSnap;
        var divScrollPositionBeforeSingleAxisGlide;

        function checkForSingleAxisGlide() {
            if (divTarget.scrollTop == divScrollPositionBeforeSingleAxisGlide.y + 400 && divTarget.scrollLeft == divScrollPositionBeforeSingleAxisGlide.x)
                testPassed("div successfully snapped after dragging along one axis and then scrolling in the other.");
            else
                testFailed("div did not honor 2D snap points. (single axis scroll followed by flick on other axis)");
            finishJSTest();
        }

        function scrollAndGlideInSingleAxisTest() {
            divScrollPositionBeforeSingleAxisGlide = {
                x: divTarget.scrollLeft,
                y: divTarget.scrollTop
            };

            eventSender.monitorWheelEvents();
            eventSender.mouseMoveTo(100, 100);
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, 0, "began", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, 0, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, 0, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "ended", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "none", "begin");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "none", "continue");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "none", "end");
            eventSender.callAfterScrollingCompletes(checkForSingleAxisGlide);
        }

        function checkForScrollSnap() {
            if (divTarget.scrollTop == divScrollPositionBeforeSnap.y && divTarget.scrollLeft == divScrollPositionBeforeSnap.x)
                testPassed("div successfully snapped diagonally.");
            else
                testFailed("div did not honor 2D snap points. (diagonal snap)");
            setTimeout(scrollAndGlideInSingleAxisTest, 0);
        }

        function scrollSnapTest() {
            divScrollPositionBeforeSnap = {
                x: divTarget.scrollLeft,
                y: divTarget.scrollTop
            };

            eventSender.monitorWheelEvents();
            eventSender.mouseMoveTo(100, 100);
            eventSender.mouseScrollByWithWheelAndMomentumPhases(1, 1, "began", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(1, 1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(1, 1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "ended", "none");
            eventSender.callAfterScrollingCompletes(checkForScrollSnap);
        }

        function checkForScrollGlide() {
            // The div should have scrolled (glided) to the next snap point.
            if (divTarget.scrollTop == divScrollPositionBeforeGlide.y + 400 && divTarget.scrollLeft == divScrollPositionBeforeGlide.x + 400)
                testPassed("div successfully scrolled diagonally.");
            else
                testFailed("div did not honor 2D snap points. (diagonal glide)");
            setTimeout(scrollSnapTest, 0);
        }

        function scrollGlideTest() {
            divTarget = document.getElementById("grid-container");
            divScrollPositionBeforeGlide = {
                x: divTarget.scrollLeft,
                y: divTarget.scrollTop
            };

            eventSender.monitorWheelEvents();
            eventSender.mouseMoveTo(100, 100);
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "began", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "ended", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "none", "begin");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(-1, -1, "none", "continue");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "none", "end");
            eventSender.callAfterScrollingCompletes(checkForScrollGlide);
        }

        function onLoad() {
            if (window.eventSender) {
                internals.setPlatformMomentumScrollingPredictionEnabled(false);
                setTimeout(scrollGlideTest, 0);
            } else {
                var messageLocation = document.getElementById("snap-from");
                var message = document.createElement("p");
                message.innerHTML = "<p>This test is better run under DumpRenderTree." +
                "</p><p>To manually test it, place the mouse pointer inside the" +
                "</p><p>red box and perform a small swipe to the lower right" +
                "</p><p>with some momentum. The grid should scroll to show a" +
                "</p><p>green cell. Then scroll a bit to the upper left and" +
                "</p><p>release without momentum. It should snap back to show" +
                "</p><p>the green cell. Finally, drag slightly to the right and" +
                "</p><p>then directly down. It should snap to reveal another" +
                "</p><p>green cell directly below the previous one.</p>"
                messageLocation.appendChild(message);
            }
        }
        </script>
    </head>
    <body onload="onLoad();">
        <div id="grid-container">
            <div class="cell" id="snap-from"></div><div class="cell"></div><div class="cell"></div><br/>
            <div class="cell"></div><div class="cell" id="green"></div><div class="cell"></div><br/>
            <div class="cell"></div><div class="cell" id="green"></div><div class="cell"></div>
        </div>
    </body>
</html>
