<!DOCTYPE html>

<p>
On Mac when word-selecting backwards starting with the
caret on the middle of a word and then word-selecting forward, the
caret is left in the same place where it was, instead of directly selecting to the end
of the word (which is windows/unix behavior).
</p>

<div id="test-div" contenteditable=true>
    line 1<br>
    line 2<br>
    line 3
</div>

<script>
function editingTest(behavior) {
    if (window.testRunner && window.internals) {
        testRunner.dumpAsText();
        internals.settings.setEditingBehavior(behavior);
    }

    function getSetCaretFunction(node, container, offset) {
        return function () {
            var selection = window.getSelection();
            selection.empty();

            var range = document.createRange();
            range.setStart(container, offset);
            selection.addRange(range);
        }
    }

    function runTest(firstDirection, secondDirection, granularity, expectedText, setCaret) {
        var selection = window.getSelection();
        setCaret();
        selection.modify("extend", firstDirection, granularity);
        selection.modify("extend", secondDirection, granularity);
        var s = selection.toString();
        document.write("Extend " + firstDirection + " and then " + secondDirection + " by " + granularity + ": ");
        document.write(s === expectedText ? "PASS" : 'FAIL: expected "' + escape(expectedText) + '", got "' + escape(s) + '"');
        document.write("<br>");
    }

    var node = document.getElementById("test-div");
    var children = node.childNodes;

    var wordCaretFunction = getSetCaretFunction(node, children[2], children[2].data.search("ne 2"));

    document.write(behavior + ":<br>");
    runTest("backward", "forward", "word", behavior == "mac" ? "" : behavior == "windows" ? "ne " : "ne", getSetCaretFunction(node, children[2], children[2].data.search("ne 2")));
    runTest("forward", "backward", "word", behavior == "mac" ? "" : "li", getSetCaretFunction(node, children[2], children[2].data.search("ne 2")));
    runTest("backward", "forward", "line", behavior == "mac" ? "" : "1\nline ", getSetCaretFunction(node, children[0], children[0].data.search("1")));
    runTest("forward", "backward", "line", behavior == "mac" ? "" : "2\nline ", getSetCaretFunction(node, children[4], children[4].data.search("3")));
    runTest("backward", "forward", "paragraph", behavior == "mac" ? "" : "1\nline ", getSetCaretFunction(node, children[0], children[0].data.search("1")));
    runTest("forward", "backward", "paragraph", behavior == "mac" ? "" : "2\nline ", getSetCaretFunction(node, children[4], children[4].data.search("3")));
}

editingTest("mac");
editingTest("windows");
editingTest("unix");

var node = document.getElementById("test-div");
node.parentNode.removeChild(node);
</script>
