<!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" rel="opener">
            <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" rel="opener">
            <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.waitUntilDone();
        }
        var numberTimesToClick = 2;
        var numberTimesToSpace = 2;
        window.onload = function() {
            if (!window.testRunner || !window.eventSender)
                return;
            
            click();
        };
        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.notifyDone();
        }
        </script>
    </body>
</html>
