Missing cursor/caret showing in search field on google.com
[WebKit-https.git] / LayoutTests / editing / selection / character-data-mutation.html
1 <!DOCTYPE html>\r
2 <html>\r
3 <body>\r
4 <p>This test ensures WebKit adjusts or clears the selection when either the start or the end container was modified.</p>\r
5 <div id="test" contenteditable></div>\r
6 <pre>\r
7 <script>\r
8 \r
9 var test = document.getElementById('test');\r
10 test.focus();\r
11 \r
12 if (window.testRunner)\r
13     testRunner.dumpAsText();\r
14 \r
15 var baseIsFirst = true;\r
16 \r
17 function runSingleTest(actor, isStart, expectedOffset) {\r
18     test.innerHTML = '<span>hello</span> world';\r
19 \r
20     // Select "llo wo"\r
21     var selection = window.getSelection();\r
22     if (baseIsFirst)\r
23         selection.setBaseAndExtent(test.firstChild.firstChild, 2, test.lastChild, 3);\r
24     else\r
25         selection.setBaseAndExtent(test.lastChild, 3, test.firstChild.firstChild, 2);\r
26     var originalOffset = isStart ? selection.getRangeAt(0).startOffset : selection.getRangeAt(0).endOffset;\r
27     var action = isStart ? actor(test.firstChild.firstChild, 'startContainer') : actor(test.lastChild, 'endContainer');\r
28     var message = null;\r
29     var passed = false;\r
30     if (typeof(expectedOffset) == 'undefined') {\r
31         if (selection.rangeCount)\r
32             message = 'did not clear selection';\r
33         else {\r
34             message = 'cleared selection';\r
35             passed = true;\r
36         }\r
37     } else if (!selection.rangeCount)\r
38         message = 'cleared selection unexpectedly';\r
39     else if ((selection.getRangeAt(0).startContainer == selection.baseNode\r
40         && selection.getRangeAt(0).startOffset == selection.baseOffset) ^ baseIsFirst)\r
41         message = 'exchanged base and extent';\r
42     else {\r
43         var actualOffset = isStart ? selection.getRangeAt(0).startOffset : selection.getRangeAt(0).endOffset;\r
44         message = actualOffset == originalOffset ? 'did not move selection' : 'moved the offset from ' +\r
45             originalOffset + ' to ' + actualOffset;\r
46 \r
47         if (actualOffset != expectedOffset)\r
48             message += ' but expected ' + expectedOffset;\r
49         else\r
50             passed = true;\r
51     }\r
52 \r
53     document.write((passed ? 'PASS: ' : 'FAIL: ') + action + ' ' + message + '\n');\r
54 }\r
55 \r
56 function runTestPairs(actor, expectedStartOffset, expectedEndOffset, skipEnd) {\r
57     runSingleTest(actor, true, expectedStartOffset);\r
58     if (!skipEnd)\r
59         runSingleTest(actor, false, expectedEndOffset);\r
60 }\r
61 \r
62 function runTests() {\r
63     runTestPairs(function() { test.removeChild(test.firstChild); return 'Removing the parent of startContainer'; }, 0, undefined, true);\r
64     runTestPairs(function(node, nodeName) { node.nodeValue = 'a'; return 'Replacing nodeValue of ' + nodeName; }, 0, 0);\r
65     runTestPairs(function(node, nodeName) { node.appendData(' WebKit'); return 'Appending " WebKit" to ' + nodeName; }, 2, 3);\r
66 \r
67     runTestPairs(function(node, nodeName) { node.insertData(2, 'WebKit ');\r
68         return 'Inserting " WebKit" to ' + nodeName + ' before the end point'; }, 2, 10);\r
69     runTestPairs(function(node, nodeName) { node.insertData(3, 'WebKit ');\r
70         return 'Inserting " WebKit" to ' + nodeName + ' after the end point'; }, 2, 3);\r
71 \r
72     runTestPairs(function(node, nodeName) { node.deleteData(1, 4);\r
73         return 'Removing text in ' + nodeName + ' containing the end point'; }, 1, 1);\r
74     runTestPairs(function(node, nodeName) { node.deleteData(0, 3);\r
75         return 'Removing text in ' + nodeName + ' containing the start point'; }, 0, 0);\r
76     runTestPairs(function(node, nodeName) { node.deleteData(0, 2);\r
77         return 'Removing 2 characters in ' + nodeName + ' before the end point'; }, 0, 1);\r
78     runTestPairs(function(node, nodeName) { node.deleteData(0, 3);\r
79         return 'Removing 3 characters at the beginning of ' + nodeName; }, 0, 0);\r
80     runTestPairs(function(node, nodeName) { node.deleteData(3, 2);\r
81         return 'Removing text in ' + nodeName + ' after the end point'; }, 2, 3);\r
82 \r
83     runTestPairs(function(node, nodeName) { node.replaceData(1, 4, '1234');\r
84         return 'Replacing text in ' + nodeName + ' containing the end point'; }, 1, 1);\r
85     runTestPairs(function(node, nodeName) { node.replaceData(0, 2, '12');\r
86         return 'Replacing 2 characters in ' + nodeName + ' by 2 characters before the end point'; }, 0, 3);\r
87     runTestPairs(function(node, nodeName) { node.replaceData(0, 2, '1');\r
88         return 'Replacing 2 characters in ' + nodeName + ' by 1 characters before the end point'; }, 0, 2);\r
89     runTestPairs(function(node, nodeName) { node.replaceData(3, 2, '12');\r
90         return 'Replacing 2 characters in ' + nodeName + ' by 2 characters after the end point'; }, 2, 3);\r
91 }\r
92 \r
93 document.write('Base is first:\n');\r
94 runTests();\r
95 \r
96 baseIsFirst = false;\r
97 \r
98 document.write('\nExtent is first:\n');\r
99 runTests();\r
100 \r
101 test.style.display = 'none';\r
102 \r
103 document.write('\nDONE');\r
104 </script>\r
105 </pre>\r
106 </body>\r
107 </html>\r