<!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;
            var actions_promise;

            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_dom("NotFoundError", function(){ listener.releasePointerCapture(INVALID_POINTERID); },
                                        "It should not be possible to release capture an invalid pointer id");
                    });

                    // Make sure the test finishes after all the input actions are completed.
                    actions_promise.then( () => {
                        test_pointerEvent.done();
                    });
                });

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

                // Inject mouse inputs.
                actions_promise = 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>
