<head>
<link href="js-test-style.css">
</head>
<body onload="runTest()">
<script src="../js/resources/js-test-pre.js"></script>

<script>
function runTest()
{
    if (!window.layoutTestController)
        return;

    layoutTestController.dumpEditingCallbacks();
    layoutTestController.dumpAsText();

    shouldBe("first.selectionStart", "11");
    shouldBe("first.selectionEnd", "18");
    eventSender.keyDown("\t");
    shouldBe("first.selectionStart", "11");
    shouldBe("first.selectionEnd", "18");

    shouldBe("second.selectionStart", "11");
    shouldBe("second.selectionEnd", "18");
    eventSender.keyDown("J", ["ctrlKey"]);
    shouldBe("second.selectionStart", "11");
    shouldBe("second.selectionEnd", "18");

    shouldBe("third.selectionStart", "11");
    shouldBe("third.selectionEnd", "18");
    third.focus();
    shouldBe("third.selectionStart", "11");
    shouldBe("third.selectionEnd", "18");

    shouldBe("fourth.selectionStart", "11");
    shouldBe("fourth.selectionEnd", "18");
    eventSender.mouseMoveTo(fourth.offsetLeft + 4, fourth.offsetTop + 4);
    eventSender.mouseDown();
    eventSender.mouseUp();
    shouldBe("fourth.selectionStart", "0");
    shouldBe("fourth.selectionEnd", "0");

    shouldBe("fifth.selectionStart", "11");
    shouldBe("fifth.selectionEnd", "18");
    var fifthLabel = document.getElementById("fifthLabel");
    eventSender.mouseMoveTo(fifthLabel.offsetLeft + 4, fifthLabel.offsetTop + 4);
    eventSender.mouseDown();
    eventSender.mouseUp();
    shouldBe("fifth.selectionStart", "11");
    shouldBe("fifth.selectionEnd", "18");

    shouldBe("sixth.selectionStart", "11");
    shouldBe("sixth.selectionEnd", "18");
    eventSender.keyDown("U", ["ctrlKey"]);
    shouldBe("sixth.selectionStart", "11");
    shouldBe("sixth.selectionEnd", "18");

    shouldBe("seventh.selectionStart", "11");
    shouldBe("seventh.selectionEnd", "18");
    var seventLabel = document.getElementById("seventhLabel");
    seventhLabel.focus();
    shouldBe("seventh.selectionStart", "11");
    shouldBe("seventh.selectionEnd", "18");

    shouldBe("eighth.selectionStart", "11");
    shouldBe("eighth.selectionEnd", "18");
    var eighthLegend = document.getElementById("eighthLegend");
    eighthLegend.focus();
    shouldBe("eighth.selectionStart", "11");
    shouldBe("eighth.selectionEnd", "18");

    shouldBe("ninth.selectionStart", "11");
    shouldBe("ninth.selectionEnd", "18");
    eventSender.keyDown("I", ["ctrlKey"]);
    shouldBe("ninth.selectionStart", "11");
    shouldBe("ninth.selectionEnd", "18");

}
</script>

<h2>&lt;textarea&gt; focus selection</h2>

<p>This test checks whether the selection is restored, cleared, or set
to the full range when using different ways to focus a text
area. These results all match Mozilla. When running manually, please
follow the steps below. In the test harness, the test runs
automatically.</p>

1) Hit tab, only the word "SUCCESS" should be selected:
<textarea id="first">FAILURE or SUCCESS</textarea>
<script>
    var first = document.getElementById("first");
    first.focus();
    first.setSelectionRange(11, 18);
    first.blur();
</script>

<br>

2) Hit Ctrl-J, only the word "SUCCESS" should be selected:
<textarea id="second" accesskey="j">FAILURE or SUCCESS</textarea>
<script>
    var second = document.getElementById("second");
    second.focus();
    second.setSelectionRange(11, 18);
    second.blur();
</script>

<br>

3) <input type="button" onclick="document.getElementById('third').focus()" value="Click this button">, only the word "SUCCESS" should be selected:
<textarea id="third">FAILURE or SUCCESS</textarea>
<script>
    var third = document.getElementById("third");
    third.focus();
    third.setSelectionRange(11, 18);
    third.blur();
</script>

<br>

4) Click in the input field, nothing should be selected:
<textarea id="fourth">FAILURE and FAILURE</textarea>
<script>
    var fourth = document.getElementById("fourth");
    fourth.focus();
    fourth.setSelectionRange(11, 18);
    fourth.blur();
</script>

<br>

5) <label id="fifthLabel" for="fifth" style="color: blue">Click this label, only the word "SUCCESS" should be selected:</label>
<textarea id="fifth">FAILURE or SUCCESS</textarea>
<script>
    var second = document.getElementById("fifth");
    fifth.focus();
    fifth.setSelectionRange(11, 18);
    fifth.blur();
</script>

<br>

6) <label id="sixthLabel" for="sixth" accesskey="u">Hit Ctrl-U, only the word "SUCCESS" should be selected:</label>
<textarea id="sixth">FAILURE or SUCCESS</textarea>
<script>
    var sixth = document.getElementById("sixth");
    sixth.focus();
    sixth.setSelectionRange(11, 18);
    sixth.blur();
</script>

<br>

7) <input type="button" onclick="document.getElementById('seventhLabel').focus()" value="Click this button"><label id="seventhLabel" for="seventh">, only the word "SUCCESS" should be selected:</label>
<textarea id="seventh">FAILURE or SUCCESS</textarea>
<script>
    var seventh = document.getElementById("seventh");
    seventh.focus();
    seventh.setSelectionRange(11, 18);
    seventh.blur();
</script>

<br>

8) <input type="button" onclick="document.getElementById('eighthLegend').focus()" value="Click this button">
<fieldset>
<legend id="eighthLegend">, only the word "SUCCESS" should be selected:</legend>
<textarea id="eighth">FAILURE or SUCCESS</textarea>
<script>
    var eighth = document.getElementById("eighth");
    eighth.focus();
    eighth.setSelectionRange(11, 18);
    eighth.blur();
</script>
</fieldset>
<br>


9) <fieldset>
<legend id="eighthLegend" accesskey="i">Hit Ctrl-I, only the word "SUCCESS" should be selected:</legend>
<textarea id="ninth">FAILURE or SUCCESS</textarea>
<script>
    var ninth = document.getElementById("ninth");
    ninth.focus();
    ninth.setSelectionRange(11, 18);
    ninth.blur();
</script>
</fieldset>
<br>

<p id="description"></p>
<div id="console"></div>

</body>
