<html>
        <script type="text/javascript">

            function print(message)
            {
                var paragraph = document.createElement("div");
                if (message == "")
                    paragraph.appendChild(document.createElement("br"));
                else
                    paragraph.appendChild(document.createTextNode(message));
                document.getElementById("console").appendChild(paragraph);
            }

            function test()
            {
                if (window.layoutTestController)
                    layoutTestController.dumpAsText();

                testElement(document.getElementById("textarea"));
                testElement(document.getElementById("input"));
            }

            function testElement(element)
            {
                element.focus();
                element.value = "This is a test value.";
                element.setSelectionRange(3,7);
                element.focus();
                if (element.selectionStart == 3)
                    print("Passed.");
                else
                    print("Failed, selection of " + element + " is " + element.selectionStart + "-" + element.selectionEnd + ".");
                element.blur();
            }

        </script>
    </head>
    <body onload="test();">
        <p>This test checks if a call to focus on an already-focused element causes a change in selection.</p>
        <p>If the test passes for both textarea and text input elements you'll see two messages saying "passed" below.</p>
        <hr>
        <p id="console"></p>
        <hr>
        <form>
            <p><textarea id="textarea" cols="20"></textarea></p>
            <p><input type="text" id="input" size="20"></p>
        </form>
    </body>
</html>