<!doctype html>
<html>
    <head>
        <title>setPointerCapture() throws on disconnected node</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 detected_pointertypes = {};
            add_completion_callback(showPointerTypes);
            var test_setPointerCapture = async_test("setPointerCapture: DOMException InvalidStateError");
            var actions_promise;

            function run() {
                var target0 = document.getElementById("target0");
                var target1 = document.getElementById("target1");

                target1.parentNode.removeChild(target1);

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

                        test_setPointerCapture.step(function() {
                            assert_unreached("DOMException: InvalidStateError should have been thrown.");
                        });
                    } catch (e) {
                        // TA: 13.4
                        test_setPointerCapture.step(function() {
                            assert_equals(e.name, "InvalidStateError", "DOMException should be InvalidStateError");
                        });
                    }
                    // 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()
                    .pointerUp()
                    .send();
            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Event: DOMException InvalidStateError</h1>
        <h4>Test Description:
            When the setPointerCapture method is invoked, if the target node does not participate in its ownerDocument's tree, a DOMException with the name InvalidStateError must be thrown.
        </h4>
        <br>
        <div id="target0">
            Use the mouse, touch or pen to contact this box.
        </div>
        <div id="target1"></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>
