<!doctype html>
<html>
<!-- This test should be integrated into web-platform-test when the pinch-zoom
     is accepted into the specification.
     See https://github.com/w3c/pointerevents/issues/29 -->
    <head>
        <title>touch-action: pinch-zoom</title>
        <meta name="assert" content="TA15.4 - With `touch-action: pinch-zoom` on a swiped or click/dragged element, only pinch zoom and two finger pan should be possible.">
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" type="text/css" href="../../../external/wpt/pointerevents/pointerevent_styles.css">
        <script src="../../../resources/testharness.js"></script>
        <script src="../../../resources/testharnessreport.js"></script>
        <script src="../../../external/wpt/pointerevents/pointerevent_support.js"></script>
        <style>
            #target0 {
            width: 700px;
            height: 430px;
            touch-action: pinch-zoom;
            }
        </style>
    </head>
    <body id="target14" onload="run()">
        <h1>Pointer Events touch-action attribute support</h1>
        <h4 id="desc">Test Description: Place one finger down, pan down. Lift finger and place two fingers down and try to pinch zoom. Expected: only pinch zooms.</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 scrollListenerExecuted = false;
                target0.addEventListener("scroll", function(event) {
                    scrollListenerExecuted = true;
                });

                // Check if "touch-action: pinch-zoom" attribute works properly
                //TA: 15.4
                on_event(btnComplete, 'click', function(event) {
                    detected_pointertypes[event.pointerType] = true;
                    test_touchaction.step(function() {
                        assert_true(scrollListenerExecuted, "scroll listener should not have been executed by the end of the test");
                        assert_equals(target0.scrollLeft, 0, "scroll x offset should be 0 in the end of the test");
                        assert_equals(target0.scrollTop, 0, "scroll y offset should be 0 in the end of the test");
                        assert_greater_than(window.visualViewport.scale, 1, "scale should be greater than 1 in the end of the test");
                    });
                    test_touchaction.done();
                    updateDescriptionComplete();
                });
            }
        </script>
        <h1>touch-action: pinch-zoom</h1>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
        </div>
        <div id="log"></div>

        <script>
            function inject_input() {
                return touchScrollInTarget('#target0', 'down').then(function() {
                    return pinchZoomInTarget('#target0', 3.0);
                }).then(function() {
                    document.getElementById("btnComplete").click();
                });
            }
        </script>
        <script src='../../../external/wpt_automation/pointerevents/pointerevent_common_input.js'></script>
    </body>
</html>
