4 <p>This test ensures WebKit adjusts the selection under document mutation.</p>
\r
5 <p> Examples are from:<br> http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation</p>
\r
6 <div id="test" contenteditable></div>
\r
10 var test = document.getElementById('test');
\r
13 if (window.testRunner)
\r
14 testRunner.dumpAsText();
\r
16 var baseIsFirst = true;
\r
17 var selection = window.getSelection();
\r
19 function checkResult(expectedStartOffset, expectedEndOffset) {
\r
20 var actualStartOffset = selection.getRangeAt(0).startOffset;
\r
21 var actualEndOffset = selection.getRangeAt(0).endOffset;
\r
22 if (actualStartOffset == expectedStartOffset && actualEndOffset == expectedEndOffset)
\r
23 document.write('PASS: selection is (' + expectedStartOffset + ', ' + expectedEndOffset + ') "' + selection + '"\n');
\r
25 document.write('FAIL: selection is (' + actualStartOffset + ', ' + actualEndOffset + ') "' + selection +
\r
26 '" and expected selection is ' + '(' + expectedStartOffset + ', ' + expectedEndOffset + ')\n');
\r
29 function setSelectionRange(startContainer, startOffset, endContainer, endOffset) {
\r
31 selection.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);
\r
33 selection.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);
\r
36 function runInsertionTest(actor, expectedStartOffset, expectedEndOffset) {
\r
37 test.innerHTML = '<p>Abcd efgh XY blah ijkl</p>';
\r
39 // Select "Y blah i"
\r
40 setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 19);
\r
41 actor(test.firstChild.firstChild);
\r
42 checkResult(expectedStartOffset, expectedEndOffset);
\r
45 function runDeletionTest(actor, expectedStartOffset, expectedEndOffset) {
\r
46 test.innerHTML = '<p>Abcd efgh The Range ijkl</p>';
\r
48 // Select "he Range i"
\r
49 setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 21);
\r
50 actor(test.firstChild.firstChild);
\r
51 checkResult(expectedStartOffset, expectedEndOffset);
\r
54 function deleteNodeContainingSelection(expectedStartOffset, expectedEndOffset) {
\r
55 test.innerHTML = '<p>Abcd <em>efgh The Range ij</em>kl</p>';
\r
57 // Select "he Range i"
\r
58 setSelectionRange(test.firstChild.firstChild.nextSibling.firstChild, 6, test.firstChild.firstChild.nextSibling.firstChild, 16);
\r
59 test.firstChild.removeChild(test.firstChild.firstChild.nextSibling);
\r
60 checkResult(expectedStartOffset, expectedEndOffset);
\r
63 function runTests() {
\r
64 document.write('Insertion tests:\n');
\r
65 runInsertionTest(function(node) { node.insertData(10, 'inserted text'); }, 24, 32);
\r
66 runInsertionTest(function(node) { node.insertData(11, 'inserted text'); }, 11, 32);
\r
67 runInsertionTest(function(node) { node.insertData(12, 'inserted text'); }, 11, 32);
\r
68 runInsertionTest(function(node) { node.insertData(17, 'inserted text'); }, 11, 32);
\r
69 runInsertionTest(function(node) { node.insertData(19, 'inserted text'); }, 11, 19);
\r
71 document.write('\nDeletion tests:\n');
\r
72 runDeletionTest(function(node) { node.deleteData(5, 8); }, 5, 13);
\r
73 runDeletionTest(function(node) { node.deleteData(5, 17); }, 5, 5);
\r
74 runDeletionTest(function(node) { node.deleteData(5, 6); }, 5, 15);
\r
75 deleteNodeContainingSelection(1, 1);
\r
78 document.write('Base is first\n\n');
\r
81 baseIsFirst = false;
\r
83 document.write('\n\nExtent is first\n\n');
\r
86 test.style.display = 'none';
\r
87 document.write('\nDONE');
\r