<!doctype html>
<html>
    <head>
        <title>Pointer Event: gotPiontercapture is fired first.</title>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
        <link rel="help" href="http://www.w3.org/wiki/PointerEvents/TestAssertions">
        <meta name="assert" content="When the setPointerCapture method is invoked, if the provided pointerId value does not match any of the active pointers, a DOMException with the name InvalidPointerId must be thrown." />
        <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>
        <!-- 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("setPointerCapture: DOMException InvalidPointerId"); // set up test harness
            // 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);

            var INVALID_POINTERID = -39548;

            function run() {
                var target0 = document.getElementById("target0");
                target0.style["touchAction"] = "none";
                var listener = document.getElementById("complete-notice");

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

                    try {
                        listener.setPointerCapture(INVALID_POINTERID);

                        test_pointerEvent.step(function () {
                            assert_true(false, "DOMException: InvalidPointerId should have been thrown.");
                        });
                    } catch (e) {
                        test_pointerEvent.step(function () {
                            assert_equals(e.name, "InvalidPointerId", "DOMException should be InvalidPointerId");
                        });
                    }
                    test_pointerEvent.done(); // complete test
                });
            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Event: DOMException InvalidPointerId</h1>
        <h4>Test Description:
            When the setPointerCapture method is invoked, if the provided pointerId value does not match any of the active pointers, a DOMException with the name InvalidPointerId must be thrown.
        </h4>
        <br />
        <div id="target0">
            Use the mouse, touch or pen to contact this box.
        </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>