<!doctype html>
<html>
    <head>
        <title>Pointer Event: releasePointerCapture DOMException - NotFoundError</title>
        <meta name="timeout" content="long">
        <meta name="assert" content="releasePointerCapture DOMException - NotFoundError"/>
        <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 releasePointerCapture method is invoked, if the provided pointerId value does not match any of the active pointers, a DOMException with the name NotFoundError 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>
        <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("releasePointerCapture: DOMException NotFoundError"); // 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 = 314159265358973923;

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

                // try to release pointer capture with an invalid id
                on_event(listener, "pointermove", function (event) {
                    detected_pointertypes[event.pointerType] = true;

                    test_pointerEvent.step(function() {
                      assert_throws("NotFoundError", function(){ listener.releasePointerCapture(INVALID_POINTERID); },
                                    "It should not be possible to release capture an invalid pointer id");
                    });

                    test_pointerEvent.done(); // complete test
                });

                // set pointer capture
                on_event(target0, "pointerdown", function (event) {
                    detected_pointertypes[event.pointerType] = true;
                    listener.setPointerCapture(event.pointerId);
                });

                // Inject mouse inputs.
                new test_driver.Actions()
                    .pointerMove(0, 0, {origin: target0})
                    .pointerDown()
                    .pointerMove(10, 0, {origin: target0})
                    .pointerUp()
                    .send();
            }
        </script>
    </head>
    <body onload="run()">
        <div id="listener"></div>
        <h1> Pointer Event: releasePointerCapture() DOMException - NotFoundError</h1>
        <h4>
            Test Description:
            Upon invocation of the releasePointerCapture method, if the provided pointerId value does not match any of the
            active pointers, a DOMException with the name NotFoundError must be thrown.
        </h4>
        <br />
        <div id="target0">
            Use the mouse, touch or pen to move over or 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>
