<html>
    <head>
        <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.testRunner) {
                    testRunner.dumpAsText();
                }
                var elt = document.getElementById("text");
                print("===textarea===");
                testElt(elt);
                
                elt = document.getElementById("input");
                print("");
                print("===input===");
                testElt(elt);

                print("");
                print("===button===");

                // Make sure that accessing selectionStart and selectionEnd on
                // the button throws exceptions.
                elt = document.getElementById("button");
                testButtonSelectionAccess(elt, ".selectionStart");
                testButtonSelectionAccess(elt, ".selectionStart = 0");
                testButtonSelectionAccess(elt, ".selectionEnd");
                testButtonSelectionAccess(elt, ".selectionEnd = 0");
                // Make sure that setSelectionRange is defined on the button element,
                // but throws an exception if called.
                if (elt.setSelectionRange != undefined) {
                    print("button.setSelectionRange defined");
                    testButtonSelectionAccess(elt, ".setSelectionRange(0,0)");
                }
            }
            function testElt(elt)
            {
                // make sure that setSelectionRange is defined
                if (elt.setSelectionRange == undefined) {
                    print("Failed: no setSelectionRange");
                    return;
                }
                elt.value = "This is a test value. Just filling in some text.";
                // the value is 48 characters long
                print("setSelectionRange():");
                elt.setSelectionRange(3,7);
                display(elt);
                elt.setSelectionRange(-2,5);
                display(elt);
                elt.setSelectionRange(42,54);
                display(elt);
                elt.setSelectionRange(5,2);
                display(elt);
                
                print("");
                print("selectionStart:");
                elt.selectionStart = 3;
                display(elt);
                elt.selectionStart = 7;
                display(elt);
                elt.selectionStart = -1;
                display(elt);
                elt.selectionStart = 54;
                display(elt);
                elt.selectionStart = 3;
                display(elt);
                
                print("");
                print("selectionEnd:");
                elt.selectionEnd = 5;
                display(elt);
                elt.selectionEnd = 2;
                display(elt);
                elt.selectionEnd = -1;
                display(elt);
                elt.selectionEnd = 54;
                display(elt);
                elt.selectionStart = 7;
                elt.selectionEnd = 7;
                display(elt);
                
                elt.value = "";
            }
            function testButtonSelectionAccess(button, access)
            {
                var source = "button" + access;
                try {
                    eval(source);
                    print(source + " did not throw exception");
                } catch(e) {
                    print(source + " threw exception");
                }
            }
            function display(elt)
            {
                var actStart = elt.selectionStart;
                var actEnd = elt.selectionEnd;
                var txt = actStart.toString() + ", " + actEnd.toString();
                print(txt);
            }
        </script>
    </head>
    <body onload="test();">
        <p>This test checks if setSelectionRange(), selectionStart, and selectionEnd on a textarea and input work as expected. This includes checking edge cases such as out-of-bound values.</p>
        <p>If this test passed you'll see a bunch of correct selection ranges below. Check the expected file for the correct ranges.</p>
        <hr />
        <form>
            <textarea id="text"></textarea>
            <input type="text" id="input" />
            <input type="button" id="button" />
        </form>
        <hr />
        <p id="console"></p>
    </body>
</html>