<!doctype html>
<html>
    <head>
        <title>Pointerleave + descendant</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>
        <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>
    </head>
    <body onload="run()">
        <h1>pointerleave</h1>
        <h4>
            Test Description: This test checks if pointerleave event works properly.
            <p>Put your mouse over the black rectangle and then move it out through purple rectangle boundaries.</p>
        </h4>
        <p>
        <div id="target0" style="background:black; height: 47px;">
            <div style="background:purple; height: 35px; width: 90%; position: absolute"></div>
        </div>
        <script>
            var detected_pointertypes = {};

            add_completion_callback(showPointerTypes);

            function run() {
                var target0 = document.getElementById("target0");
                var target1 = document.querySelector("#target0 > div");
                var test_pointerleave = async_test("pointerleave event received");
                var actions_promise;

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

                // When a pointing device is moved off of the hit test boundaries of an element and all of its descendants, the pointerleave event must be dispatched.
                // TA: 9.1
                on_event(target0, "pointerleave", function (event) {
                    // Make sure the test finishes after all the input actions are completed.
                    actions_promise.then( () => {
                        test_pointerleave.done();
                    });
                });

                // Inject mouse inputs.
                actions_promise = new test_driver.Actions()
                    .pointerMove(0, 0, {origin: target0})
                    .pointerMove(0, 0, {origin: target1})
                    .pointerMove(0, 0)
                    .send();
            }
        </script>
        <h1>Pointer Events pointerleave tests</h1>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
            <p>Refresh the page to run the tests again with a different pointer type.</p>
        </div>
        <div id="log"></div>
    </body>
</html>