<p>This tests for a bug where extending a selection created with the mouse would blow it away before extending it.</p>
<div id="div" contenteditable="true">There <span id="select" style="color:green">should be</span> six characters selected in this sentence on Mac and four characters selected on Win/Linux.</div>
<ul id="console"></ul>
<script>
function log(str)
{
    console = document.getElementById("console");
    li = document.createElement("li");
    text = document.createTextNode(str);
    console.appendChild(li);
    li.appendChild(text);
}

function runTest(platform, expectedText)
{
    internals.settings.setEditingBehavior(platform);
    
    var target = document.getElementById('select');
    var startX = target.offsetLeft + target.offsetWidth;
    var y = target.offsetTop + target.offsetHeight / 2;
    var endX = target.offsetLeft;

    // Select all the green text using the mouse.
    // Use a word-granularity selection to avoid eventSender bug.
    // Using just a single-click would not act is if the initial
    // mouseDown was at (endX, y), resulting in a collapsed selection.
    eventSender.mouseMoveTo(startX, y);
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseDown();
    eventSender.mouseMoveTo(endX, y);
    eventSender.mouseUp();
    // Extending this 5 character selection will select 6 characters on mac,
    // but shrink the selection on win/linux.
    testRunner.execCommand("MoveForwardAndModifySelection");
    // Extending it in this way flips the anchor and the focus on Mac.
    var selectedText = window.getSelection().toString();
    if (selectedText != expectedText)
        log("Failure: Selected text was \"" + selectedText + "\" and should be \"" + expectedText + "\"");
    else
        log("Success");
}

if (window.testRunner && window.internals) {
    testRunner.dumpAsText()
    runTest('mac', 'should be s');
    runTest('win', 'hould be ');
} else {
    log("Failure: To test manually, select the green text " +
        "starting at the end via double-click (i.e. word granularity), then shift+right-arrow. " +
        "On Win/Linux you should see 'hould be ' selected. On Mac, you should see 'should be s' selected." +
        "There's currently a bug that selects the space " +
        "after 'should be' during the initial selection (https://bugs.webkit.org/show_bug.cgi?id=36256). " +
        "Once that's fixed, it the final selected text should be 'should be ' on Mac and 'hould be' on Win/Linux.")
}
</script>
