<html>
<head>

<style>
.editing {
    border: 2px solid red;
    font-size: 24px;
}
</style>
<script src="../editing.js"></script>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/js-test-selection-shared.js"></script>

<script>

function editingTest(editingBehavior) {

    if (window.internals)
        internals.settings.setEditingBehavior(editingBehavior);

    var startTarget = document.getElementById('start');
    var endTarget = document.getElementById('end');

    eventSender.mouseMoveTo(startTarget.offsetLeft, startTarget.offsetTop + 10);
    // Double-click to select at word-granularity to workaround eventSender bug with selecting text at
    // character granularity (i.e. that it just doesn't work).
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseDown();
    eventSender.mouseMoveTo(endTarget.offsetLeft, endTarget.offsetTop + 10);
    eventSender.mouseUp();

    assertSelectionAt(startTarget.firstChild, 0, endTarget.firstChild, 2);

    extendSelectionBackwardByCharacterCommand();

    // On Win/Linux the anchor is be fixed after the mouse-selection and never changes.
    // On Mac, the first character-granularity selection after a mouse-selection resets the anchor/focus.
    if (editingBehavior == "mac")
        assertSelectionAt(endTarget.firstChild, 2, startTarget.previousSibling, 1);
    else
        assertSelectionAt(startTarget.firstChild, 0, endTarget.firstChild, 1);

    extendSelectionForwardByCharacterCommand();
    if (editingBehavior == "mac")
        assertSelectionAt(endTarget.firstChild, 2, startTarget.firstChild, 0);
    else
        assertSelectionAt(startTarget.firstChild, 0, endTarget.firstChild, 2);

    extendSelectionForwardByLineBoundaryCommand();

    if (editingBehavior == "mac")
        assertSelectionAt(endTarget.nextSibling, 1, startTarget.firstChild, 0);
    else
        assertSelectionAt(startTarget.firstChild, 0, endTarget.nextSibling, 1);

    extendSelectionBackwardByLineBoundaryCommand();

    if (editingBehavior == "mac")
        assertSelectionAt(endTarget.nextSibling, 1, startTarget.previousSibling, 0);
    else
        assertSelectionAt(startTarget.firstChild, 0, document.getElementById('test'), 4);
}

</script>

<title>Editing Test</title>
</head>
<body>
<div contenteditable id="root" class="editing">
    <span id="test">a <span id="start">bc</span> <br>d <span id="end">ef</span> <br>ghi</span>
</div>

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

<script>
editingTest("mac");
editingTest("win");
editingTest("unix");
</script>
<script src="../../resources/js-test-post.js"></script>

</body>
</html>
