<!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> |