<body onload="runTest()">
<script src="../../resources/js-test-pre.js"></script>

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

    var accessKeyModifiers = ["altKey"];
    if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
        accessKeyModifiers = ["ctrlKey", "altKey"];

    testRunner.dumpEditingCallbacks();
    testRunner.waitUntilDone();
    testRunner.dumpAsText();

    shouldBe("first.selectionStart", "12");
    shouldBe("first.selectionEnd", "19");
    eventSender.keyDown("\t");
    shouldBe("first.selectionStart", "0");
    shouldBe("first.selectionEnd", "19");

    shouldBe("second.selectionStart", "11");
    shouldBe("second.selectionEnd", "18");
    eventSender.keyDown("J", accessKeyModifiers);
    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", "12");
    shouldBe("fourth.selectionEnd", "19");
    await eventSender.asyncMouseMoveTo(fourth.offsetLeft + 4, fourth.offsetTop + 4);
    await eventSender.asyncMouseDown();
    await eventSender.asyncMouseUp();
    shouldBe("fourth.selectionStart", "0");
    shouldBe("fourth.selectionEnd", "0");

    shouldBe("fifth.selectionStart", "11");
    shouldBe("fifth.selectionEnd", "18");
    var fifthLabel = document.getElementById("fifthLabel");
    await eventSender.asyncMouseMoveTo(fifthLabel.offsetLeft + 4, fifthLabel.offsetTop + 4);
    await eventSender.asyncMouseDown();
    await eventSender.asyncMouseUp();
    shouldBe("fifth.selectionStart", "11");
    shouldBe("fifth.selectionEnd", "18");

    shouldBe("sixth.selectionStart", "12");
    shouldBe("sixth.selectionEnd", "19");
    eventSender.keyDown("U", accessKeyModifiers);
    shouldBe("sixth.selectionStart", "0");
    shouldBe("sixth.selectionEnd", "19");

    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", accessKeyModifiers);
    shouldBe("ninth.selectionStart", "11");
    shouldBe("ninth.selectionEnd", "18");
    testRunner.notifyDone();
}
</script>

<h2>&lt;input type="text"&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 field. These
results all match Mozilla, except test 6, which selects
the whole field contents to match all other cases of keyboard
focus. When running manually, please follow the steps below. In the
test harness, the test runs automatically.</p>

1) Hit tab, the whole phrase "SUCCESS and SUCCESS" should be selected:
<input type="text" id="first" value="SUCCESS and SUCCESS">
<script>
    var first = document.getElementById("first");
    first.focus();
    first.setSelectionRange(12, 19);
    first.blur();
</script>

<br>

2) Hit Ctrl-Option-J (or Alt-J on Windows), the whole phrase "SUCCESS and SUCCESS" should be selected:
<input type="text" id="second" accesskey="j" value="SUCCESS and SUCCESS">
<script>
    var second = document.getElementById("second");
    second.focus();
    second.setSelectionRange(12, 19);
    second.blur();
</script>

<br>

3) <input type="button" onclick="document.getElementById('third').focus()" value="Click this button">, only the word "SUCCESS" should be selected:
<input type="text" id="third" value="FAILURE or SUCCESS">
<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:
<input type="text" id="fourth" value="FAILURE and FAILURE">
<script>
    var fourth = document.getElementById("fourth");
    fourth.focus();
    fourth.setSelectionRange(12, 19);
    fourth.blur();
</script>

<br>

5) <label id="fifthLabel" for="fifth" style="color: blue">Click this label, only the word "SUCCESS" should be selected:</label>
<input type="text" id="fifth" value="FAILURE or SUCCESS">
<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-Option-U (or Alt-U on Windows), the whole phrase "SUCCESS and SUCCESS" should be selected:</label>
<input type="text" id="sixth" value="SUCCESS and SUCCESS">
<script>
    var sixth = document.getElementById("sixth");
    sixth.focus();
    sixth.setSelectionRange(12, 19);
    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>
<input type="text" id="seventh" value="FAILURE or SUCCESS">
<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>
<input type="text" id="eighth" value="FAILURE or SUCCESS">
<script>
    var eighth = document.getElementById("eighth");
    eighth.focus();
    eighth.setSelectionRange(11, 18);
    eighth.blur();
</script>
</fieldset>
<br>


9) <fieldset>
<legend id="ninthLegend" accesskey="i">Hit Ctrl-Option-I (or Alt-I on Windows), only the word "SUCCESS" should be selected:</legend>
<input type="text" id="ninth" value="FAILURE or SUCCESS">
<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>
