<!DOCTYPE html>
<html>
<body>
<p>This test ensures WebKit adjusts the selection under document mutation.</p>
<p> Examples are from:<br> http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation</p>
<div id="test" contenteditable></div>
<pre>
<script>

var test = document.getElementById('test');
test.focus();

if (window.testRunner)
    testRunner.dumpAsText();

var baseIsFirst = true;
var selection = window.getSelection();

function checkResult(expectedStartOffset, expectedEndOffset) {
    var actualStartOffset = selection.getRangeAt(0).startOffset;
    var actualEndOffset = selection.getRangeAt(0).endOffset;
    if (actualStartOffset == expectedStartOffset && actualEndOffset == expectedEndOffset)
        document.write('PASS: selection is (' + expectedStartOffset + ', ' + expectedEndOffset + ') "' + selection + '"\n');
    else
        document.write('FAIL: selection is (' + actualStartOffset + ', ' + actualEndOffset + ') "' + selection +
            '" and expected selection is ' + '(' + expectedStartOffset + ', ' + expectedEndOffset + ')\n');
}

function setSelectionRange(startContainer, startOffset, endContainer, endOffset) {
    if (baseIsFirst)
        selection.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);
    else
        selection.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);
}

function runInsertionTest(actor, expectedStartOffset, expectedEndOffset) {
    test.innerHTML = '<p>Abcd efgh XY blah ijkl</p>';

    // Select "Y blah i"
    setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 19);
    actor(test.firstChild.firstChild);
    checkResult(expectedStartOffset, expectedEndOffset);
}

function runDeletionTest(actor, expectedStartOffset, expectedEndOffset) {
    test.innerHTML = '<p>Abcd efgh The Range ijkl</p>';

    // Select "he Range i"
    setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 21);
    actor(test.firstChild.firstChild);
    checkResult(expectedStartOffset, expectedEndOffset);
}

function deleteNodeContainingSelection(expectedStartOffset, expectedEndOffset) {
    test.innerHTML = '<p>Abcd <em>efgh The Range ij</em>kl</p>';

    // Select "he Range i"
    setSelectionRange(test.firstChild.firstChild.nextSibling.firstChild, 6, test.firstChild.firstChild.nextSibling.firstChild, 16);
    test.firstChild.removeChild(test.firstChild.firstChild.nextSibling);
    checkResult(expectedStartOffset, expectedEndOffset);
}

function runTests() {
    document.write('Insertion tests:\n');
    runInsertionTest(function(node) { node.insertData(10, 'inserted text'); }, 24, 32);
    runInsertionTest(function(node) { node.insertData(11, 'inserted text'); }, 11, 32);
    runInsertionTest(function(node) { node.insertData(12, 'inserted text'); }, 11, 32);
    runInsertionTest(function(node) { node.insertData(17, 'inserted text'); }, 11, 32);
    runInsertionTest(function(node) { node.insertData(19, 'inserted text'); }, 11, 19);

    document.write('\nDeletion tests:\n');
    runDeletionTest(function(node) { node.deleteData(5, 8); }, 5, 13);
    runDeletionTest(function(node) { node.deleteData(5, 17); }, 5, 5);
    runDeletionTest(function(node) { node.deleteData(5, 6); }, 5, 15);
    deleteNodeContainingSelection(1, 1);
}

document.write('Base is first\n\n');
runTests();

baseIsFirst = false;

document.write('\n\nExtent is first\n\n');
runTests();

test.style.display = 'none';
document.write('\nDONE');
</script>
</pre>
</body>
</html>
