0dfee78b4d7884d5b0d8be764bf63100b45de0e3
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / editing / selection / document-mutation.html
1 <!DOCTYPE html>\r
2 <html>\r
3 <body>\r
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
7 <pre>\r
8 <script>\r
9 \r
10 var test = document.getElementById('test');\r
11 test.focus();\r
12 \r
13 if (window.testRunner)\r
14     testRunner.dumpAsText();\r
15 \r
16 var baseIsFirst = true;\r
17 var selection = window.getSelection();\r
18 \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
24     else\r
25         document.write('FAIL: selection is (' + actualStartOffset + ', ' + actualEndOffset + ') "' + selection +\r
26             '" and expected selection is ' + '(' + expectedStartOffset + ', ' + expectedEndOffset + ')\n');\r
27 }\r
28 \r
29 function setSelectionRange(startContainer, startOffset, endContainer, endOffset) {\r
30     if (baseIsFirst)\r
31         selection.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset);\r
32     else\r
33         selection.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset);\r
34 }\r
35 \r
36 function runInsertionTest(actor, expectedStartOffset, expectedEndOffset) {\r
37     test.innerHTML = '<p>Abcd efgh XY blah ijkl</p>';\r
38 \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
43 }\r
44 \r
45 function runDeletionTest(actor, expectedStartOffset, expectedEndOffset) {\r
46     test.innerHTML = '<p>Abcd efgh The Range ijkl</p>';\r
47 \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
52 }\r
53 \r
54 function deleteNodeContainingSelection(expectedStartOffset, expectedEndOffset) {\r
55     test.innerHTML = '<p>Abcd <em>efgh The Range ij</em>kl</p>';\r
56 \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
61 }\r
62 \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
70 \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
76 }\r
77 \r
78 document.write('Base is first\n\n');\r
79 runTests();\r
80 \r
81 baseIsFirst = false;\r
82 \r
83 document.write('\n\nExtent is first\n\n');\r
84 runTests();\r
85 \r
86 test.style.display = 'none';\r
87 document.write('\nDONE');\r
88 </script>\r
89 </pre>\r
90 </body>\r
91 </html>\r