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