OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "core/editing/PositionIterator.h" |
| 6 |
| 7 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 8 #include "core/editing/EditingTestBase.h" |
| 9 |
| 10 namespace blink { |
| 11 |
| 12 class PositionIteratorTest : public EditingTestBase {}; |
| 13 |
| 14 // For http://crbug.com/695317 |
| 15 TEST_F(PositionIteratorTest, decrementWithInputElement) { |
| 16 setBodyContent("123<input value='abc'>"); |
| 17 Element* const input = document().querySelector("input"); |
| 18 Node* const innerEditor = FlatTreeTraversal::firstChild(*input); |
| 19 Node* const text = input->previousSibling(); |
| 20 |
| 21 // Decrement until start of "123" from INPUT on DOM tree |
| 22 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 23 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 24 domIterator.computePosition()); |
| 25 domIterator.decrement(); |
| 26 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); |
| 27 domIterator.decrement(); |
| 28 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); |
| 29 domIterator.decrement(); |
| 30 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 31 domIterator.decrement(); |
| 32 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 33 |
| 34 // Decrement until start of "123" from INPUT on flat tree |
| 35 PositionIteratorInFlatTree flatIterator( |
| 36 PositionInFlatTree::lastPositionInNode(document().body())); |
| 37 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 38 flatIterator.computePosition()); |
| 39 flatIterator.decrement(); |
| 40 EXPECT_EQ(PositionInFlatTree::afterNode(input), |
| 41 flatIterator.computePosition()); |
| 42 // TODO(yosin): We should not traverse inside INPUT |
| 43 flatIterator.decrement(); |
| 44 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), |
| 45 flatIterator.computePosition()); |
| 46 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), |
| 64 flatIterator.computePosition()); |
| 65 flatIterator.decrement(); |
| 66 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 67 } |
| 68 |
| 69 TEST_F(PositionIteratorTest, decrementWithSelectElement) { |
| 70 setBodyContent("123<select><option>1</option><option>2</option></select>"); |
| 71 Element* const select = document().querySelector("select"); |
| 72 Node* const option1 = select->firstChild(); |
| 73 Node* const option2 = select->lastChild(); |
| 74 Node* text = select->previousSibling(); |
| 75 |
| 76 // Decrement until start of "123" from SELECT on DOM tree |
| 77 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 78 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 79 domIterator.computePosition()); |
| 80 domIterator.decrement(); |
| 81 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); |
| 82 // TODO(yosin): We should not traverse inside SELECT and OPTION |
| 83 domIterator.decrement(); |
| 84 EXPECT_EQ(Position::lastPositionInNode(option2), |
| 85 domIterator.computePosition()); |
| 86 domIterator.decrement(); |
| 87 EXPECT_EQ(Position(option2->firstChild(), 1), 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(); |
| 102 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 103 domIterator.decrement(); |
| 104 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 105 |
| 106 // Decrement until start of "123" from SELECT on flat tree |
| 107 PositionIteratorInFlatTree flatIterator( |
| 108 PositionInFlatTree::lastPositionInNode(document().body())); |
| 109 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 110 flatIterator.computePosition()); |
| 111 flatIterator.decrement(); |
| 112 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 113 flatIterator.computePosition()); |
| 114 // TODO(yosin): We should not traverse inside SELECT and OPTION |
| 115 // Traverse |option2| |
| 116 flatIterator.decrement(); |
| 117 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(option2), |
| 118 flatIterator.computePosition()); |
| 119 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), |
| 139 flatIterator.computePosition()); |
| 140 flatIterator.decrement(); |
| 141 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 142 } |
| 143 |
| 144 // For http://crbug.com/695317 |
| 145 TEST_F(PositionIteratorTest, decrementWithTextAreaElement) { |
| 146 setBodyContent("123<textarea>456</textarea>"); |
| 147 Element* const textarea = document().querySelector("textarea"); |
| 148 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea); |
| 149 Node* const text = textarea->previousSibling(); |
| 150 |
| 151 // Decrement until end of "123" from after TEXTAREA on DOM tree |
| 152 PositionIterator domIterator(Position::lastPositionInNode(document().body())); |
| 153 EXPECT_EQ(Position::lastPositionInNode(document().body()), |
| 154 domIterator.computePosition()); |
| 155 domIterator.decrement(); |
| 156 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); |
| 157 // TODO(yosin): We should not traverse inside TEXTAREA |
| 158 domIterator.decrement(); |
| 159 EXPECT_EQ(Position(textarea->firstChild(), 3), domIterator.computePosition()); |
| 160 domIterator.decrement(); |
| 161 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition()); |
| 162 domIterator.decrement(); |
| 163 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 164 domIterator.decrement(); |
| 165 EXPECT_EQ(Position(text, 3), domIterator.computePosition()); |
| 166 |
| 167 // Decrement until end of "123" from after TEXTAREA on flat tree |
| 168 PositionIteratorInFlatTree flatIterator( |
| 169 PositionInFlatTree::lastPositionInNode(document().body())); |
| 170 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(document().body()), |
| 171 flatIterator.computePosition()); |
| 172 flatIterator.decrement(); |
| 173 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), |
| 174 flatIterator.computePosition()); |
| 175 // TODO(yosin): We should not traverse inside TEXTAREA |
| 176 // Traverse |innerEditor| |
| 177 flatIterator.decrement(); |
| 178 EXPECT_EQ(PositionInFlatTree::lastPositionInNode(innerEditor), |
| 179 flatIterator.computePosition()); |
| 180 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), |
| 198 flatIterator.computePosition()); |
| 199 flatIterator.decrement(); |
| 200 EXPECT_EQ(PositionInFlatTree(text, 3), flatIterator.computePosition()); |
| 201 } |
| 202 |
| 203 // For http://crbug.com/695317 |
| 204 TEST_F(PositionIteratorTest, incrementWithInputElement) { |
| 205 setBodyContent("<input value='abc'>123"); |
| 206 Element* const input = document().querySelector("input"); |
| 207 Node* const innerEditor = FlatTreeTraversal::firstChild(*input); |
| 208 Node* const text = input->nextSibling(); |
| 209 |
| 210 // Increment until start of "123" from INPUT on DOM tree |
| 211 PositionIterator domIterator( |
| 212 Position::firstPositionInNode(document().body())); |
| 213 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 214 domIterator.increment(); |
| 215 EXPECT_EQ(Position::beforeNode(input), domIterator.computePosition()); |
| 216 domIterator.increment(); |
| 217 EXPECT_EQ(Position::afterNode(input), domIterator.computePosition()); |
| 218 domIterator.increment(); |
| 219 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 220 domIterator.increment(); |
| 221 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 222 |
| 223 // Increment until start of "123" from INPUT on flat tree |
| 224 PositionIteratorInFlatTree flatIterator( |
| 225 PositionInFlatTree::firstPositionInNode(document().body())); |
| 226 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 227 flatIterator.computePosition()); |
| 228 // TODO(yosin): We should not traverse inside INPUT |
| 229 flatIterator.increment(); |
| 230 EXPECT_EQ(PositionInFlatTree(input, 0), flatIterator.computePosition()); |
| 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()); |
| 248 flatIterator.increment(); |
| 249 EXPECT_EQ(PositionInFlatTree::afterNode(input), |
| 250 flatIterator.computePosition()); |
| 251 flatIterator.increment(); |
| 252 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 253 flatIterator.computePosition()); |
| 254 flatIterator.increment(); |
| 255 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 256 } |
| 257 |
| 258 TEST_F(PositionIteratorTest, incrementWithSelectElement) { |
| 259 setBodyContent("<select><option>1</option><option>2</option></select>123"); |
| 260 Element* const select = document().querySelector("select"); |
| 261 Node* const option1 = select->firstChild(); |
| 262 Node* const option2 = select->lastChild(); |
| 263 Node* const text = select->nextSibling(); |
| 264 |
| 265 // Increment until start of "123" from SELECT on DOM tree |
| 266 PositionIterator domIterator( |
| 267 Position::firstPositionInNode(document().body())); |
| 268 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 269 // TODO(yosin): We should not traverse inside SELECT |
| 270 domIterator.increment(); |
| 271 EXPECT_EQ(Position(select, 0), 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(); |
| 289 EXPECT_EQ(Position::afterNode(select), domIterator.computePosition()); |
| 290 domIterator.increment(); |
| 291 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 292 domIterator.increment(); |
| 293 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 294 |
| 295 // Increment until start of "123" from SELECT on flat tree |
| 296 PositionIteratorInFlatTree flatIterator( |
| 297 PositionInFlatTree::firstPositionInNode(document().body())); |
| 298 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 299 flatIterator.computePosition()); |
| 300 // TODO(yosin): We should not traverse inside SELECT |
| 301 flatIterator.increment(); |
| 302 EXPECT_EQ(PositionInFlatTree(select, 0), flatIterator.computePosition()); |
| 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()); |
| 323 flatIterator.increment(); |
| 324 EXPECT_EQ(PositionInFlatTree::afterNode(select), |
| 325 flatIterator.computePosition()); |
| 326 flatIterator.increment(); |
| 327 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 328 flatIterator.computePosition()); |
| 329 flatIterator.increment(); |
| 330 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 331 } |
| 332 |
| 333 // For http://crbug.com/695317 |
| 334 TEST_F(PositionIteratorTest, incrementWithTextAreaElement) { |
| 335 setBodyContent("<textarea>123</textarea>456"); |
| 336 Element* const textarea = document().querySelector("textarea"); |
| 337 Node* const text = textarea->nextSibling(); |
| 338 Node* const innerEditor = FlatTreeTraversal::firstChild(*textarea); |
| 339 |
| 340 // Increment until start of "123" from TEXTAREA on DOM tree |
| 341 PositionIterator domIterator( |
| 342 Position::firstPositionInNode(document().body())); |
| 343 EXPECT_EQ(Position(document().body(), 0), domIterator.computePosition()); |
| 344 domIterator.increment(); |
| 345 EXPECT_EQ(Position(textarea, 0), domIterator.computePosition()); |
| 346 domIterator.increment(); |
| 347 EXPECT_EQ(Position(textarea->firstChild(), 0), domIterator.computePosition()); |
| 348 domIterator.increment(); |
| 349 EXPECT_EQ(Position::afterNode(textarea), domIterator.computePosition()); |
| 350 domIterator.increment(); |
| 351 EXPECT_EQ(Position(document().body(), 1), domIterator.computePosition()); |
| 352 domIterator.increment(); |
| 353 EXPECT_EQ(Position(text, 0), domIterator.computePosition()); |
| 354 |
| 355 // Increment until start of "123" from TEXTAREA on flat tree |
| 356 PositionIteratorInFlatTree flatIterator( |
| 357 PositionInFlatTree::firstPositionInNode(document().body())); |
| 358 EXPECT_EQ(PositionInFlatTree(document().body(), 0), |
| 359 flatIterator.computePosition()); |
| 360 // TODO(yosin): We should not traverse inside TEXTAREA |
| 361 flatIterator.increment(); |
| 362 EXPECT_EQ(PositionInFlatTree(textarea, 0), flatIterator.computePosition()); |
| 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()); |
| 381 flatIterator.increment(); |
| 382 EXPECT_EQ(PositionInFlatTree::afterNode(textarea), |
| 383 flatIterator.computePosition()); |
| 384 flatIterator.increment(); |
| 385 EXPECT_EQ(PositionInFlatTree(document().body(), 1), |
| 386 flatIterator.computePosition()); |
| 387 flatIterator.increment(); |
| 388 EXPECT_EQ(PositionInFlatTree(text, 0), flatIterator.computePosition()); |
| 389 } |
| 390 |
| 391 } // namespace blink |
OLD | NEW |