<!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="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <script src="pointerevent_support.js"></script>
        <script type="text/javascript">
            var actions_promise;
            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) {
                    // Make sure the test finishes after all the input actions are completed.
                    actions_promise.then( () => {
                        test_setPointerCapture.done();
                    });
                });

                // Inject mouse inputs.
                actions_promise = new test_driver.Actions()
                    .pointerMove(0, 0, {origin: target0})
                    .pointerDown()
                    .pointerMove(10, 10, {origin: target0})
                    .pointerUp()
                    .send();
            }
        </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>
