blob: 7345f72787a0dfc1e741ba0ca20d5ea523a12304 [file] [log] [blame]
<!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>