<!doctype html>
<html>
    <head>
        <title>touch-action: pan-y</title>
        <meta name="timeout" content="long">
        <meta name="assert" content="TA15.4 - With `touch-action: pan-y` on a swiped or click/dragged element, only panning in the y-axis should be possible.">
        <meta name="viewport" content="width=device-width">
        <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>
        <script src="pointerevent_support.js"></script>
        <style>
            #target0 {
            width: 700px;
            height: 430px;
            touch-action: pan-y;
            }
        </style>
    </head>
    <body onload="run()">
        <h1>Pointer Events touch-action attribute support</h1>
        <h4 id="desc">Test Description: Try to scroll element DOWN then RIGHT. Tap Complete button under the rectangle when done. Expected: only pans in y direction.</h4>
        <p>Note: this test is for touch-devices only</p>
        <div id="target0">
            <p>
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem
                nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat.
                Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit
                lobortis nisl ut aliquip ex ea commodo consequat.
            </p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem
                nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat.
                Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit
                lobortis nisl ut aliquip ex ea commodo consequat.
            </p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem
                nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat.
                Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit
                lobortis nisl ut aliquip ex ea commodo consequat.
            </p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem
                nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat.
                Ut wisis enim ad minim veniam, quis nostrud exerci tution ullamcorper suscipit
                lobortis nisl ut aliquip ex ea commodo consequat.
            </p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
            <p>Lorem ipsum dolor sit amet...</p>
        </div>
        <input type="button" id="btnComplete" value="Complete test">
        <script type='text/javascript'>
            var detected_pointertypes = {};
            var test_touchaction = async_test("touch-action attribute test");
            add_completion_callback(showPointerTypes);

            function run() {
                var target0 = document.getElementById("target0");
                var btnComplete = document.getElementById("btnComplete");
                var actions_promise;

                // Check if "touch-action: pan-y" attribute works properly
                //TA: 15.4
                on_event(btnComplete, 'click', function(event) {
                    detected_pointertypes[event.pointerType] = true;
                    test_touchaction.step(function() {
                        assert_equals(target0.scrollLeft, 0, "scroll x offset should be 0 in the end of the test");
                        assert_not_equals(target0.scrollTop, 0, "scroll y offset should not be 0 in the end of the test");
                    });

                    // Make sure the test finishes after all the input actions are completed.
                    actions_promise.then( () => {
                        test_touchaction.done();
                    });
                    updateDescriptionComplete();
                });

                // Inject touch inputs.
                actions_promise = touchScrollInTarget(target0, 'down').then(function() {
                    return touchScrollInTarget(target0, 'right');
                }).then(function() {
                    return clickInTarget("touch", btnComplete);
                });
            }
        </script>
        <h1>touch-action: pan-y</h1>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
        </div>
        <div id="log"></div>
    </body>
</html>