chromium/third_party/blink/web_tests/editing/selection/select-out-of-editable.html

<!DOCTYPE html> 
<html> 
<body> 
<p id="description">This test ensures that when editable text is selected by a drag that ends outside of the editable region, selection is extended to the either end of the text. See the <a href="https://bugs.webkit.org/show_bug.cgi?id=52986">bug 52986</a> for more details.</p> 
<div id="test" contenteditable style="width: 200px; margin: 20px; border: solid 1px; font-size: x-large;">hello world</div> 
<script> 
 
function selectTextByDrag(div, endX, endY) {
    window.getSelection().removeAllRanges();
 
    eventSender.mouseMoveTo(div.offsetLeft + (div.offsetWidth / 2) , div.offsetTop + (div.offsetHeight / 2));
    eventSender.mouseDown();
 
    eventSender.leapForward(200);
 
    // Without this, drag doesn't start selection.
    eventSender.mouseMoveTo(div.offsetLeft + (div.offsetWidth / 3) , div.offsetTop + (div.offsetHeight / 3));
    eventSender.mouseDown();
 
    eventSender.leapForward(200);
 
    eventSender.mouseMoveTo(endX, endY);
    eventSender.mouseUp();
}
 
var log = '';
 
function assertEqual(actual, expected) {
    if (actual == expected)
        log += 'PASS';
    else
        log += 'FAIL - expected ' + expected + ' but got ' + actual;
    log += '\n';
}
 
if (!window.testRunner || !window.eventSender)
    document.writeln("This test requires eventSender since the bug does not reproduce reliably when tested manually.");
else {
    testRunner.dumpAsText();
    var description = document.getElementById('description');
    description.style.display = 'none';
 
    var div = document.getElementById('test');
 
    log += 'Dragging to the left: ';
    selectTextByDrag(div, div.offsetLeft - 10, div.offsetTop - 10);
    assertEqual(window.getSelection().getRangeAt(0).startOffset, 0);
 
    log += 'Dragging to the left: ';
    selectTextByDrag(div, div.offsetLeft + 300, div.offsetTop + 100);
    assertEqual(window.getSelection().getRangeAt(0).endOffset, div.innerText.length);
 
    // Having the log in DOM will interfere with the test so append it at last.
    var console = document.createElement('pre');
    document.body.appendChild(console);
    console.innerHTML = log;
}
 
</script> 
</body> 
</html>