<!doctype html>
<html>
    <head>
        <title>pointerleave after pointerup</title>
        <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>
        <!-- Additional helper script for common checks across event types -->
        <script type="text/javascript" src="pointerevent_support.js"></script>
    </head>
    <body onload="run()">
        <h2>pointerleave after pointerup</h2>
        <h4>Test Description: This test checks if pointerleave event triggers for devices that don't support hover. Tap the black rectangle. </h4>
        <p>Note: this test is only for devices that do not support hover.</p>
        <div id="target0"></div>
        <script>
            var test_pointerleave = async_test("pointerleave event received");
            // showPointerTypes is defined in pointerevent_support.js
            // Requirements: the callback function will reference the test_pointerEvent object and
            // will fail unless the async_test is created with the var name "test_pointerEvent".
            add_completion_callback(showPointerTypes);

            var eventTested = false;
            var isPointerupReceived = false;
            var pointerup_event = null;
            var detected_pointertypes = {};

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

                on_event(target0, "pointerup", function (event) {
                    detected_pointertypes[event.pointerType] = true;
                    pointerup_event = event;
                });

                // For input devices that do not support hover, a pointerleave event must follow the pointerup event.
                // TA: 3.6
                on_event(target0, "pointerleave", function (event) {
                    if(event.pointerType == 'touch') {
                        if(pointerup_event != null) {
                            if(eventTested == false) {
                                eventTested = true;
                                test_pointerleave.step(function() {
                                    assert_equals(event.pointerType, pointerup_event.pointerType, "pointerType is same for pointerup and pointerleave");
                                    assert_equals(event.isPrimary, pointerup_event.isPrimary, "isPrimary is same for pointerup and pointerleave");
                                });
                                test_pointerleave.done();
                            }
                        }
                        else {
                            test_pointerleave.step(function() {
                                assert_unreached("pointerleave received before pointerup");
                            }, "pointerleave received before pointerup");
                        }
                    }
                });
            }

        </script>
        <h1>Pointer Events pointerleave tests</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>
