<!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");

            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");
                        });
                    }
                    test_setPointerCapture.done();
                });

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