<!doctype html>
<html>
    <head>
        <title>Pointer Events pointer lock tests</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>
        <script>
            var lock_change_count = 0;
            var capture_count = 0;
            var mouse_move_count = 0;

            function resetTestState() {
            }

            function run() {
                var test_pointerEvent = setup_pointerevent_test("no pointercapture while pointerlock", ['mouse']);
                var div1 = document.getElementById("div1");
                var div2 = document.getElementById("div2");
              
                on_event(div1, 'pointerdown', function(event) {
                    div2.setPointerCapture(event.pointerId);
                    div1.requestPointerLock();
                });
                on_event(div1, 'pointermove', function(event) {
                    if (lock_change_count == 1) {
                        mouse_move_count++;
                        if (mouse_move_count == 2) {
                            try {
                                div2.setPointerCapture(event.pointerId);
                                test_pointerEvent.step(function () {
                                    assert_unreached("DOMException: InvalidStateError should have been thrown.");
                                });
                            } catch (e) {
                                test_pointerEvent.step(function () {
                                    assert_equals(e.name, "InvalidStateError", "DOMException should be InvalidStateError");
                                });
                            }
                        } else if (mouse_move_count == 3) {
                            document.exitPointerLock();
                            mouse_move_count = 0;
                        }

                    } else if (lock_change_count == 2) {
                        mouse_move_count++;
                        if (mouse_move_count == 2) {
                            test_pointerEvent.step(function() {
                                assert_equals(capture_count, 0, "There shouldn't be any capture events fired.");
                            });
                            test_pointerEvent.done();
                        }
                    }
                });
                on_event(div2, 'gotpointercapture', function(event) {
                    capture_count++;
                });
                on_event(div2, 'lostpointercapture', function(event) {
                    capture_count++;
                });
                on_event(document, 'pointerlockchange', function(event) {
                    lock_change_count++;
                    test_pointerEvent.step(function() {
                        if (lock_change_count == 1)
                            assert_equals(document.pointerLockElement, div1, "document.pointerLockElement should be div1.");
                        else if (lock_change_count == 2)
                            assert_equals(document.pointerLockElement, null, "document.pointerLockElement should be null.");
                    });
                });
            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Events pointer lock test</h1>
        <h2 id="pointerTypeDescription"></h2>
        <h4>
            Test Description: This test checks that we do not set the pointer capture when any element in the page gets a pointer lock.
            <ol>
                 <li>Press left button down on the green rectangle and hold it.</li>
                 <li>Move the mouse inside the green rectangle.</li>
            </ol>

            Test passes if the pointer capture is not set when the green rectangle gets the pointer lock.
        </h4>
        <div id="testContainer">
            <div id="div1" style="width:800px;height:250px;background:green"></div>
            <div id="div2" style="width:800px;height:250px;background:yellow"></div>
        </div>
        <div class="spacer"></div>
    </body>
</html>
