<!DOCTYPE html>
<html>
    <body>
        <p>
            Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=28633">Bug 28633 - Submitting a form with target=_blank works only once</a>
        </p>
        <p>
            This test will click the first submit button twice, then press the space bar on the second submit button twice. Both should popup two blank windows.
        </p>
        <form action="resources/submit-to-blank-multiple-times-form-action.html" target="_blank">
            <input name="nextOp" id="nextOp" type="hidden">
            <input name="submit" id="submit" type="submit">
        </form>
        <form action="resources/submit-to-blank-multiple-times-form-action.html" target="_blank">
            <input name="nextOp" id="nextOpKey" type="hidden">
            <input name="submit" id="submitKey" type="submit">
        </form>
        <div id="console"></div>
        <script type="text/javascript">
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.setCanOpenWindows();
            testRunner.waitUntilDone();
        }
        var numberTimesToClick = 2;
        var numberTimesToSpace = 2;
        window.onload = function() {
            if (!window.testRunner || !window.eventSender)
                return;
            
            click();
            // Set a timeout to notify done in case the test fails.
            setTimeout(notifyDone, 2000);
        };
        function log(message) {
            var span = document.createElement("span");
            span.innerHTML = message + "<br>";
            document.getElementById("console").appendChild(span);
        }
        function click() {
            log("Clicking first button, should open new window");
            var button = document.getElementById("submit");
            var x = button.offsetLeft + button.offsetWidth/2;
            var y = button.offsetTop + button.offsetHeight/2;
            
            numberTimesToClick--;
            if (numberTimesToClick > 0)
                document.getElementById("nextOp").value = "click";
            else
                document.getElementById("nextOp").value = "space";
            eventSender.mouseMoveTo(x, y);
            eventSender.mouseDown();
            eventSender.mouseUp();
        }
        function pressSpace() {
            log("Pressing space on second button, should open new window");
            var button = document.getElementById("submitKey");
            
            numberTimesToSpace--;
            if (numberTimesToSpace > 0)
                document.getElementById("nextOpKey").value = "space";
            else
                document.getElementById("nextOpKey").value = "notifyDone";
            button.focus();
            eventSender.keyDown(' ');
        }
        function notifyDone() {
            testRunner.setCloseRemainingWindowsWhenComplete();
            testRunner.notifyDone();
        }
        </script>
    </body>
</html>
