<!doctype html>
<html>
    <head>
        <title>Test overriding the pending pointer capture element</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="pointerevent_support.js"></script>
        <script type="text/javascript">
            var detected_pointertypes = {};
            add_completion_callback(showPointerTypes);
            var test_setPointerCapture = async_test("setPointerCapture: override the pending pointer capture element");

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

                on_event(target0, "pointerdown", function (event) {
                    detected_pointertypes[event.pointerType] = true;
                    target0.setPointerCapture(event.pointerId);
                    test_setPointerCapture.step(function () {
                        assert_equals(target0.hasPointerCapture(event.pointerId), true, "Set capture to target0, target0.hasPointerCapture should be true");
                    });
                    target1.setPointerCapture(event.pointerId);
                    test_setPointerCapture.step(function () {
                        assert_equals(target0.hasPointerCapture(event.pointerId), false, "Set capture to target1, target0.hasPointerCapture should be false");
                        assert_equals(target1.hasPointerCapture(event.pointerId), true, "Set capture to target1, target1.hasPointerCapture should be true");
                    });
                });

                on_event(target0, "gotpointercapture", function (event) {
                    assert_true(false, "target0 shouldn't receive gotpointercapture");
                });

                on_event(target1, "gotpointercapture", function (event) {
                    assert_true(true, "target1 should receive gotpointercapture");
                });

                on_event(target1, "pointerup", function (event) {
                    test_setPointerCapture.done();
                });
            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Event: Test overriding the pending pointer capture element</h1>
        <h4>Test Description:
            After an element setPointerCapture, if another element also setPointerCapture and override it, the old pending pointer capture element shouldn't receive any gotpointercapture or lostpointercapture event
            <ol>
                <li>Press and hold left mouse button over black box
                <li>Move mouse and release mouse button
            </ol>
        </h4>
        <br>
        <div id="target0" touch-action:none></div>
        <div id="target1" touch-action:none></div>
        <div id="complete-notice">
            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
        </div>
        <div id="log"></div>
    </body>
</html>
