92 lines
3.5 KiB
HTML
92 lines
3.5 KiB
HTML
<!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>
|