<!doctype html>
<html>
    <head>
        <title>Pointer Event: The pointerleave event does not bubble </title>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/"/>
        <meta name="assert" content="The pointerleave event must not bubble up to parent elements."/>
        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
        <!-- /resources/testharness.js -->
        <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>
        <!-- Additional helper script for common checks across event types -->
        <script type="text/javascript" src="pointerevent_support.js"></script>
        <script type="text/javascript">
            var detected_pointertypes = {};
            var test_pointerEvent = async_test("pointerLeave event does not bubble"); // set up test harness
            var actions_promise;
            // 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);

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

                on_event(target0, "pointerleave", function (event) {
                    detected_pointertypes[event.pointerType] = true;
                    check_PointerEvent(event);
                    test_pointerEvent.step(function () {
                        assert_equals(event.type, "pointerleave", "pointer event received: " + event.type);
                        assert_false(event.bubbles, "pointerleave event.bubbles should be false: " + event.bubbles);
                    });
                });

                on_event(parent0, "pointerleave", function (event) {
                    test_pointerEvent.step(function () {
                        assert_equals(event.target.id, "parent0", "Recieved " + event.type + " in parent for " + event.target.id);
                    });
                    // Make sure the test finishes after all the input actions are completed.
                    actions_promise.then( () => {
                        test_pointerEvent.done();
                    });
                });

                // Inject mouse inputs.
                actions_promise = new test_driver.Actions()
                    .pointerMove(0, 0, {origin: target0})
                    .pointerMove(0, 0)
                    .send();
            }
        </script>
        <style>
            #target0 {
            background: purple;
            border: 1px solid orange;
            width:50px;
            height:50px;
            }
            #parent0 {
            background: black;
            border: 1px solid orange;
            width:100px;
            height:100px;
            }
        </style>
    </head>
    <body onload="run()">
        <h1> Pointer Event: pointerleave does not bubble</h1>
        <h4>
            Test Description:
            The pointerleave event must not bubble up to parent elements.
        </h4>
        <div id="instructions">
            Use the mouse or pen to hover over then out of the purple box nested in the black box. Or with touch, tap on the purple box.
        </div>
        <div id="parent0">
            <div id="target0"></div>
        </div>
        <div id="complete-notice">
            <p>Test complete: Scroll to Summary to view Pass/Fail Results.</p>
            <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>