| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/editing/PositionIterator.h" | 5 #include "core/editing/PositionIterator.h" |
| 6 | 6 |
| 7 #include "core/dom/shadow/FlatTreeTraversal.h" | 7 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 8 #include "core/editing/EditingTestBase.h" | 8 #include "core/editing/EditingTestBase.h" |
| 9 | 9 |
| 10 namespace blink { | 10 namespace blink { |
| 11 | 11 |
| 12 class PositionIteratorTest : public EditingTestBase {}; | 12 class PositionIteratorTest : public EditingTestBase {}; |
| 13 | 13 |
| 14 // For http://crbug.com/695317 | 14 // For http://crbug.com/695317 |
| 15 TEST_F(PositionIteratorTest, decrementWithInputElement) { | 15 TEST_F(PositionIteratorTest, decrementWithInputElement) { |
| 16 setBodyContent("123<input value='abc'>"); | 16 setBodyContent("123<input value='abc'>"); |
| 17 Element* const input = document().querySelector("input"); | 17 Element* const input = document().querySelector("input"); |
| 18 Node* const innerEditor = FlatTreeTraversal::firstChild(*input); | |
| 19 Node* const text = input->previousSibling(); | 18 Node* const text = input->previousSibling(); |
| 20 | 19 |
| 21 // Decrement until start of "123" from INPUT on DOM tree | 20 // Decrement until start of "123" from INPUT on DOM tree |
| 22 PositionIterator domIterator(Position::lastPositionInNode(document().body())); | 21 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 23 EXPECT_EQ(Position::lastPositionInNode(document().body()), | 22 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 24 domIterator.computePosition()); | 23 domIterator.computePosition()); |
| 25 domIterator.decrement(); | 24 domIterator.decrement(); |
| 26 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); | 25 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); |
| 27 domIterator.decrement(); | 26 domIterator.decrement(); |
| 28 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); | 27 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); |
| 29 domIterator.decrement(); | 28 domIterator.decrement(); |
| 30 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 29 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 31 domIterator.decrement(); | 30 domIterator.decrement(); |
| 32 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); | 31 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 33 | 32 |
| 34 // Decrement until start of "123" from INPUT on flat tree | 33 // Decrement until start of "123" from INPUT on flat tree |
| 35 PositionIteratorInFlatTree flatIterator( | 34 PositionIteratorInFlatTree flatIterator( |
| 36 PositionInFlatTree::lastPositionInNode(document().body())); | 35 PositionInFlatTree::lastPositionInNode(document().body())); |
| 37 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), | 36 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 38 flatIterator.computePosition()); | 37 flatIterator.computePosition()); |
| 39 flatIterator.decrement(); | 38 flatIterator.decrement(); |
| 40 EXPECT_EQ(PositionInFlatTree::afterNode(input), | 39 EXPECT_EQ(PositionInFlatTree::afterNode(input), |
| 41 flatIterator.computePosition()); | 40 flatIterator.computePosition()); |
| 42 // TODO(yosin): We should not traverse inside INPUT | |
| 43 flatIterator.decrement(); | 41 flatIterator.decrement(); |
| 44 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), | 42 EXPECT_EQ(PositionInFlatTree::beforeNode(input), |
| 45 flatIterator.computePosition()); | 43 flatIterator.computePosition()); |
| 46 flatIterator.decrement(); | 44 flatIterator.decrement(); |
| 47 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3), | |
| 48 flatIterator.computePosition()); | |
| 49 flatIterator.decrement(); | |
| 50 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2), | |
| 51 flatIterator.computePosition()); | |
| 52 flatIterator.decrement(); | |
| 53 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1), | |
| 54 flatIterator.computePosition()); | |
| 55 flatIterator.decrement(); | |
| 56 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0), | |
| 57 flatIterator.computePosition()); | |
| 58 flatIterator.decrement(); | |
| 59 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition()); | |
| 60 flatIterator.decrement(); | |
| 61 EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition()); | |
| 62 flatIterator.decrement(); | |
| 63 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 45 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 64 flatIterator.computePosition()); | 46 flatIterator.computePosition()); |
| 65 flatIterator.decrement(); | 47 flatIterator.decrement(); |
| 66 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); | 48 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 67 } | 49 } |
| 68 | 50 |
| 69 TEST_F(PositionIteratorTest, decrementWithSelectElement) { | 51 TEST_F(PositionIteratorTest, decrementWithSelectElement) { |
| 70 setBodyContent("123<select><option>1</option><option>2</option></select>"); | 52 setBodyContent("123<select><option>1</option><option>2</option></select>"); |
| 71 Element* const select = document().querySelector("select"); | 53 Element* const select = document().querySelector("select"); |
| 72 Node* const option1 = select->firstChild(); | |
| 73 Node* const option2 = select->lastChild(); | |
| 74 Node* text = select->previousSibling(); | 54 Node* text = select->previousSibling(); |
| 75 | 55 |
| 76 // Decrement until start of "123" from SELECT on DOM tree | 56 // Decrement until start of "123" from SELECT on DOM tree |
| 77 PositionIterator domIterator(Position::lastPositionInNode(document().body())); | 57 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 78 EXPECT_EQ(Position::lastPositionInNode(document().body()), | 58 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 79 domIterator.computePosition()); | 59 domIterator.computePosition()); |
| 80 domIterator.decrement(); | 60 domIterator.decrement(); |
| 81 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); | 61 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); |
| 82 // TODO(yosin): We should not traverse inside SELECT and OPTION | |
| 83 domIterator.decrement(); | 62 domIterator.decrement(); |
| 84 EXPECT_EQ(Position::lastPositionInNode(option2), | 63 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()) |
| 85 domIterator.computePosition()); | 64 << "This is redundant result, we should not have. see " |
| 65 "http://crbug.com/697283"; |
| 86 domIterator.decrement(); | 66 domIterator.decrement(); |
| 87 EXPECT_EQ(Position(option2->firstChild(), 1), domIterator.computePosition()); | 67 EXPECT_EQ(Position::beforeNode(select), domIterator.computePosition()); |
| 88 domIterator.decrement(); | |
| 89 EXPECT_EQ(Position(option2, 0), domIterator.computePosition()); | |
| 90 domIterator.decrement(); | |
| 91 EXPECT_EQ(Position(select, 1), domIterator.computePosition()); | |
| 92 domIterator.decrement(); | |
| 93 EXPECT_EQ(Position::lastPositionInNode(option1), | |
| 94 domIterator.computePosition()); | |
| 95 domIterator.decrement(); | |
| 96 EXPECT_EQ(Position(option1->firstChild(), 1), domIterator.computePosition()); | |
| 97 domIterator.decrement(); | |
| 98 EXPECT_EQ(Position(option1, 0), domIterator.computePosition()); | |
| 99 domIterator.decrement(); | |
| 100 EXPECT_EQ(Position(select, 0), domIterator.computePosition()); | |
| 101 domIterator.decrement(); | 68 domIterator.decrement(); |
| 102 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 69 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 103 domIterator.decrement(); | 70 domIterator.decrement(); |
| 104 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); | 71 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 105 | 72 |
| 106 // Decrement until start of "123" from SELECT on flat tree | 73 // Decrement until start of "123" from SELECT on flat tree |
| 107 PositionIteratorInFlatTree flatIterator( | 74 PositionIteratorInFlatTree flatIterator( |
| 108 PositionInFlatTree::lastPositionInNode(document().body())); | 75 PositionInFlatTree::lastPositionInNode(document().body())); |
| 109 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), | 76 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 110 flatIterator.computePosition()); | 77 flatIterator.computePosition()); |
| 111 flatIterator.decrement(); | 78 flatIterator.decrement(); |
| 112 EXPECT_EQ(PositionInFlatTree::afterNode(select), | 79 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 113 flatIterator.computePosition()); | 80 flatIterator.computePosition()); |
| 114 // TODO(yosin): We should not traverse inside SELECT and OPTION | |
| 115 // Traverse |option2| | |
| 116 flatIterator.decrement(); | 81 flatIterator.decrement(); |
| 117 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2), | 82 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 83 flatIterator.computePosition()) |
| 84 << "This is redundant result, we should not have. see " |
| 85 "http://crbug.com/697283"; |
| 86 flatIterator.decrement(); |
| 87 EXPECT_EQ(PositionInFlatTree::beforeNode(select), |
| 118 flatIterator.computePosition()); | 88 flatIterator.computePosition()); |
| 119 flatIterator.decrement(); | 89 flatIterator.decrement(); |
| 120 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 1), | |
| 121 flatIterator.computePosition()); | |
| 122 flatIterator.decrement(); | |
| 123 EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition()); | |
| 124 flatIterator.decrement(); | |
| 125 EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition()); | |
| 126 // Traverse |option1| | |
| 127 flatIterator.decrement(); | |
| 128 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1), | |
| 129 flatIterator.computePosition()); | |
| 130 flatIterator.decrement(); | |
| 131 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 1), | |
| 132 flatIterator.computePosition()); | |
| 133 flatIterator.decrement(); | |
| 134 EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition()); | |
| 135 flatIterator.decrement(); | |
| 136 EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition()); | |
| 137 flatIterator.decrement(); | |
| 138 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 90 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 139 flatIterator.computePosition()); | 91 flatIterator.computePosition()); |
| 140 flatIterator.decrement(); | 92 flatIterator.decrement(); |
| 141 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); | 93 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 142 } | 94 } |
| 143 | 95 |
| 144 // For http://crbug.com/695317 | 96 // For http://crbug.com/695317 |
| 145 TEST_F(PositionIteratorTest, decrementWithTextAreaElement) { | 97 TEST_F(PositionIteratorTest, decrementWithTextAreaElement) { |
| 146 setBodyContent("123<textarea>456</textarea>"); | 98 setBodyContent("123<textarea>456</textarea>"); |
| 147 Element* const textarea = document().querySelector("textarea"); | 99 Element* const textarea = document().querySelector("textarea"); |
| 148 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea); | |
| 149 Node* const text = textarea->previousSibling(); | 100 Node* const text = textarea->previousSibling(); |
| 150 | 101 |
| 151 // Decrement until end of "123" from after TEXTAREA on DOM tree | 102 // Decrement until end of "123" from after TEXTAREA on DOM tree |
| 152 PositionIterator domIterator(Position::lastPositionInNode(document().body())); | 103 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 153 EXPECT_EQ(Position::lastPositionInNode(document().body()), | 104 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 154 domIterator.computePosition()); | 105 domIterator.computePosition()); |
| 155 domIterator.decrement(); | 106 domIterator.decrement(); |
| 156 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); | 107 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); |
| 157 // TODO(yosin): We should not traverse inside TEXTAREA | |
| 158 domIterator.decrement(); | 108 domIterator.decrement(); |
| 159 EXPECT_EQ(Position(textarea->firstChild(), 3), domIterator.computePosition()); | 109 EXPECT_EQ(Position::beforeNode(textarea), domIterator.computePosition()); |
| 160 domIterator.decrement(); | |
| 161 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition()); | |
| 162 domIterator.decrement(); | 110 domIterator.decrement(); |
| 163 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 111 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 164 domIterator.decrement(); | 112 domIterator.decrement(); |
| 165 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); | 113 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 166 | 114 |
| 167 // Decrement until end of "123" from after TEXTAREA on flat tree | 115 // Decrement until end of "123" from after TEXTAREA on flat tree |
| 168 PositionIteratorInFlatTree flatIterator( | 116 PositionIteratorInFlatTree flatIterator( |
| 169 PositionInFlatTree::lastPositionInNode(document().body())); | 117 PositionInFlatTree::lastPositionInNode(document().body())); |
| 170 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), | 118 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 171 flatIterator.computePosition()); | 119 flatIterator.computePosition()); |
| 172 flatIterator.decrement(); | 120 flatIterator.decrement(); |
| 173 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), | 121 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), |
| 174 flatIterator.computePosition()); | 122 flatIterator.computePosition()); |
| 175 // TODO(yosin): We should not traverse inside TEXTAREA | |
| 176 // Traverse |innerEditor| | |
| 177 flatIterator.decrement(); | 123 flatIterator.decrement(); |
| 178 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), | 124 EXPECT_EQ(PositionInFlatTree::beforeNode(textarea), |
| 179 flatIterator.computePosition()); | 125 flatIterator.computePosition()); |
| 180 flatIterator.decrement(); | 126 flatIterator.decrement(); |
| 181 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3), | |
| 182 flatIterator.computePosition()); | |
| 183 flatIterator.decrement(); | |
| 184 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2), | |
| 185 flatIterator.computePosition()); | |
| 186 flatIterator.decrement(); | |
| 187 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1), | |
| 188 flatIterator.computePosition()); | |
| 189 flatIterator.decrement(); | |
| 190 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0), | |
| 191 flatIterator.computePosition()); | |
| 192 flatIterator.decrement(); | |
| 193 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition()); | |
| 194 flatIterator.decrement(); | |
| 195 EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition()); | |
| 196 flatIterator.decrement(); | |
| 197 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 127 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 198 flatIterator.computePosition()); | 128 flatIterator.computePosition()); |
| 199 flatIterator.decrement(); | 129 flatIterator.decrement(); |
| 200 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); | 130 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 201 } | 131 } |
| 202 | 132 |
| 203 // For http://crbug.com/695317 | 133 // For http://crbug.com/695317 |
| 204 TEST_F(PositionIteratorTest, incrementWithInputElement) { | 134 TEST_F(PositionIteratorTest, incrementWithInputElement) { |
| 205 setBodyContent("<input value='abc'>123"); | 135 setBodyContent("<input value='abc'>123"); |
| 206 Element* const input = document().querySelector("input"); | 136 Element* const input = document().querySelector("input"); |
| 207 Node* const innerEditor = FlatTreeTraversal::firstChild(*input); | |
| 208 Node* const text = input->nextSibling(); | 137 Node* const text = input->nextSibling(); |
| 209 | 138 |
| 210 // Increment until start of "123" from INPUT on DOM tree | 139 // Increment until start of "123" from INPUT on DOM tree |
| 211 PositionIterator domIterator( | 140 PositionIterator domIterator( |
| 212 Position::firstPositionInNode(document().body())); | 141 Position::firstPositionInNode(document().body())); |
| 213 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); | 142 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 214 domIterator.increment(); | 143 domIterator.increment(); |
| 215 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); | 144 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); |
| 216 domIterator.increment(); | 145 domIterator.increment(); |
| 217 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); | 146 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); |
| 218 domIterator.increment(); | 147 domIterator.increment(); |
| 219 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 148 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 220 domIterator.increment(); | 149 domIterator.increment(); |
| 221 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); | 150 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 222 | 151 |
| 223 // Increment until start of "123" from INPUT on flat tree | 152 // Increment until start of "123" from INPUT on flat tree |
| 224 PositionIteratorInFlatTree flatIterator( | 153 PositionIteratorInFlatTree flatIterator( |
| 225 PositionInFlatTree::firstPositionInNode(document().body())); | 154 PositionInFlatTree::firstPositionInNode(document().body())); |
| 226 EXPECT_EQ(PositionInFlatTree(document().body(), 0), | 155 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 227 flatIterator.computePosition()); | 156 flatIterator.computePosition()); |
| 228 // TODO(yosin): We should not traverse inside INPUT | |
| 229 flatIterator.increment(); | 157 flatIterator.increment(); |
| 230 EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition()); | 158 EXPECT_EQ(PositionInFlatTree::beforeNode(input), |
| 231 flatIterator.increment(); | |
| 232 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition()); | |
| 233 flatIterator.increment(); | |
| 234 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0), | |
| 235 flatIterator.computePosition()); | |
| 236 flatIterator.increment(); | |
| 237 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1), | |
| 238 flatIterator.computePosition()); | |
| 239 flatIterator.increment(); | |
| 240 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2), | |
| 241 flatIterator.computePosition()); | |
| 242 flatIterator.increment(); | |
| 243 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3), | |
| 244 flatIterator.computePosition()); | |
| 245 flatIterator.increment(); | |
| 246 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), | |
| 247 flatIterator.computePosition()); | 159 flatIterator.computePosition()); |
| 248 flatIterator.increment(); | 160 flatIterator.increment(); |
| 249 EXPECT_EQ(PositionInFlatTree::afterNode(input), | 161 EXPECT_EQ(PositionInFlatTree::afterNode(input), |
| 250 flatIterator.computePosition()); | 162 flatIterator.computePosition()); |
| 251 flatIterator.increment(); | 163 flatIterator.increment(); |
| 252 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 164 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 253 flatIterator.computePosition()); | 165 flatIterator.computePosition()); |
| 254 flatIterator.increment(); | 166 flatIterator.increment(); |
| 255 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); | 167 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 256 } | 168 } |
| 257 | 169 |
| 258 TEST_F(PositionIteratorTest, incrementWithSelectElement) { | 170 TEST_F(PositionIteratorTest, incrementWithSelectElement) { |
| 259 setBodyContent("<select><option>1</option><option>2</option></select>123"); | 171 setBodyContent("<select><option>1</option><option>2</option></select>123"); |
| 260 Element* const select = document().querySelector("select"); | 172 Element* const select = document().querySelector("select"); |
| 261 Node* const option1 = select->firstChild(); | |
| 262 Node* const option2 = select->lastChild(); | |
| 263 Node* const text = select->nextSibling(); | 173 Node* const text = select->nextSibling(); |
| 264 | 174 |
| 265 // Increment until start of "123" from SELECT on DOM tree | 175 // Increment until start of "123" from SELECT on DOM tree |
| 266 PositionIterator domIterator( | 176 PositionIterator domIterator( |
| 267 Position::firstPositionInNode(document().body())); | 177 Position::firstPositionInNode(document().body())); |
| 268 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); | 178 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 269 // TODO(yosin): We should not traverse inside SELECT | |
| 270 domIterator.increment(); | 179 domIterator.increment(); |
| 271 EXPECT_EQ(Position(select, 0), domIterator.computePosition()); | 180 EXPECT_EQ(Position::beforeNode(select), domIterator.computePosition()); |
| 272 domIterator.increment(); | |
| 273 EXPECT_EQ(Position(option1, 0), domIterator.computePosition()); | |
| 274 domIterator.increment(); | |
| 275 EXPECT_EQ(Position(option1->firstChild(), 0), domIterator.computePosition()); | |
| 276 domIterator.increment(); | |
| 277 EXPECT_EQ(Position::lastPositionInNode(option1), | |
| 278 domIterator.computePosition()); | |
| 279 domIterator.increment(); | |
| 280 EXPECT_EQ(Position(select, 1), domIterator.computePosition()); | |
| 281 domIterator.increment(); | |
| 282 EXPECT_EQ(Position(option2, 0), domIterator.computePosition()); | |
| 283 domIterator.increment(); | |
| 284 EXPECT_EQ(Position(option2->firstChild(), 0), domIterator.computePosition()); | |
| 285 domIterator.increment(); | |
| 286 EXPECT_EQ(Position::lastPositionInNode(option2), | |
| 287 domIterator.computePosition()); | |
| 288 domIterator.increment(); | 181 domIterator.increment(); |
| 289 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); | 182 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); |
| 290 domIterator.increment(); | 183 domIterator.increment(); |
| 184 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()) |
| 185 << "This is redundant result, we should not have. see " |
| 186 "http://crbug.com/697283"; |
| 187 domIterator.increment(); |
| 291 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 188 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 292 domIterator.increment(); | 189 domIterator.increment(); |
| 293 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); | 190 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 294 | 191 |
| 295 // Increment until start of "123" from SELECT on flat tree | 192 // Increment until start of "123" from SELECT on flat tree |
| 296 PositionIteratorInFlatTree flatIterator( | 193 PositionIteratorInFlatTree flatIterator( |
| 297 PositionInFlatTree::firstPositionInNode(document().body())); | 194 PositionInFlatTree::firstPositionInNode(document().body())); |
| 298 EXPECT_EQ(PositionInFlatTree(document().body(), 0), | 195 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 299 flatIterator.computePosition()); | 196 flatIterator.computePosition()); |
| 300 // TODO(yosin): We should not traverse inside SELECT | |
| 301 flatIterator.increment(); | 197 flatIterator.increment(); |
| 302 EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition()); | 198 EXPECT_EQ(PositionInFlatTree::beforeNode(select), |
| 303 flatIterator.increment(); | |
| 304 // Traverse |option2| | |
| 305 EXPECT_EQ(PositionInFlatTree(option1, 0), flatIterator.computePosition()); | |
| 306 flatIterator.increment(); | |
| 307 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option1), 0), | |
| 308 flatIterator.computePosition()); | |
| 309 flatIterator.increment(); | |
| 310 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option1), | |
| 311 flatIterator.computePosition()); | |
| 312 flatIterator.increment(); | |
| 313 EXPECT_EQ(PositionInFlatTree(select, 1), flatIterator.computePosition()); | |
| 314 // Traverse |option2| | |
| 315 flatIterator.increment(); | |
| 316 EXPECT_EQ(PositionInFlatTree(option2, 0), flatIterator.computePosition()); | |
| 317 flatIterator.increment(); | |
| 318 EXPECT_EQ(PositionInFlatTree(FlatTreeTraversal::firstChild(*option2), 0), | |
| 319 flatIterator.computePosition()); | |
| 320 flatIterator.increment(); | |
| 321 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2), | |
| 322 flatIterator.computePosition()); | 199 flatIterator.computePosition()); |
| 323 flatIterator.increment(); | 200 flatIterator.increment(); |
| 324 EXPECT_EQ(PositionInFlatTree::afterNode(select), | 201 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 325 flatIterator.computePosition()); | 202 flatIterator.computePosition()); |
| 326 flatIterator.increment(); | 203 flatIterator.increment(); |
| 204 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 205 flatIterator.computePosition()) |
| 206 << "This is redundant result, we should not have. see " |
| 207 "http://crbug.com/697283"; |
| 208 flatIterator.increment(); |
| 327 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 209 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 328 flatIterator.computePosition()); | 210 flatIterator.computePosition()); |
| 329 flatIterator.increment(); | 211 flatIterator.increment(); |
| 330 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); | 212 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 331 } | 213 } |
| 332 | 214 |
| 333 // For http://crbug.com/695317 | 215 // For http://crbug.com/695317 |
| 334 TEST_F(PositionIteratorTest, incrementWithTextAreaElement) { | 216 TEST_F(PositionIteratorTest, incrementWithTextAreaElement) { |
| 335 setBodyContent("<textarea>123</textarea>456"); | 217 setBodyContent("<textarea>123</textarea>456"); |
| 336 Element* const textarea = document().querySelector("textarea"); | 218 Element* const textarea = document().querySelector("textarea"); |
| 337 Node* const text = textarea->nextSibling(); | 219 Node* const text = textarea->nextSibling(); |
| 338 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea); | |
| 339 | 220 |
| 340 // Increment until start of "123" from TEXTAREA on DOM tree | 221 // Increment until start of "123" from TEXTAREA on DOM tree |
| 341 PositionIterator domIterator( | 222 PositionIterator domIterator( |
| 342 Position::firstPositionInNode(document().body())); | 223 Position::firstPositionInNode(document().body())); |
| 343 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); | 224 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 344 domIterator.increment(); | 225 domIterator.increment(); |
| 345 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition()); | 226 EXPECT_EQ(Position::beforeNode(textarea), domIterator.computePosition()); |
| 346 domIterator.increment(); | |
| 347 EXPECT_EQ(Position(textarea->firstChild(), 0), domIterator.computePosition()); | |
| 348 domIterator.increment(); | 227 domIterator.increment(); |
| 349 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); | 228 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); |
| 350 domIterator.increment(); | 229 domIterator.increment(); |
| 351 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); | 230 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 352 domIterator.increment(); | 231 domIterator.increment(); |
| 353 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); | 232 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 354 | 233 |
| 355 // Increment until start of "123" from TEXTAREA on flat tree | 234 // Increment until start of "123" from TEXTAREA on flat tree |
| 356 PositionIteratorInFlatTree flatIterator( | 235 PositionIteratorInFlatTree flatIterator( |
| 357 PositionInFlatTree::firstPositionInNode(document().body())); | 236 PositionInFlatTree::firstPositionInNode(document().body())); |
| 358 EXPECT_EQ(PositionInFlatTree(document().body(), 0), | 237 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 359 flatIterator.computePosition()); | 238 flatIterator.computePosition()); |
| 360 // TODO(yosin): We should not traverse inside TEXTAREA | 239 // TODO(yosin): We should not traverse inside TEXTAREA |
| 361 flatIterator.increment(); | 240 flatIterator.increment(); |
| 362 EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition()); | 241 EXPECT_EQ(PositionInFlatTree::beforeNode(textarea), |
| 363 // Traverse |innerEditor| | |
| 364 flatIterator.increment(); | |
| 365 EXPECT_EQ(PositionInFlatTree(innerEditor, 0), flatIterator.computePosition()); | |
| 366 flatIterator.increment(); | |
| 367 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 0), | |
| 368 flatIterator.computePosition()); | |
| 369 flatIterator.increment(); | |
| 370 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 1), | |
| 371 flatIterator.computePosition()); | |
| 372 flatIterator.increment(); | |
| 373 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 2), | |
| 374 flatIterator.computePosition()); | |
| 375 flatIterator.increment(); | |
| 376 EXPECT_EQ(PositionInFlatTree(innerEditor->firstChild(), 3), | |
| 377 flatIterator.computePosition()); | |
| 378 flatIterator.increment(); | |
| 379 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), | |
| 380 flatIterator.computePosition()); | 242 flatIterator.computePosition()); |
| 381 flatIterator.increment(); | 243 flatIterator.increment(); |
| 382 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), | 244 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), |
| 383 flatIterator.computePosition()); | 245 flatIterator.computePosition()); |
| 384 flatIterator.increment(); | 246 flatIterator.increment(); |
| 385 EXPECT_EQ(PositionInFlatTree(document().body(), 1), | 247 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 386 flatIterator.computePosition()); | 248 flatIterator.computePosition()); |
| 387 flatIterator.increment(); | 249 flatIterator.increment(); |
| 388 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); | 250 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 389 } | 251 } |
| 390 | 252 |
| 391 } // namespace blink | 253 } // namespace blink |
| OLD | NEW |