OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 int offsetB = positionB.computeOffsetInContainerNode(); | 292 int offsetB = positionB.computeOffsetInContainerNode(); |
293 return comparePositionsInComposedTree(containerA, offsetA, containerB, offse
tB); | 293 return comparePositionsInComposedTree(containerA, offsetA, containerB, offse
tB); |
294 } | 294 } |
295 | 295 |
296 template <typename Strategy> | 296 template <typename Strategy> |
297 int PositionAlgorithm<Strategy>::compareTo(const PositionAlgorithm<Strategy>& ot
her) const | 297 int PositionAlgorithm<Strategy>::compareTo(const PositionAlgorithm<Strategy>& ot
her) const |
298 { | 298 { |
299 return comparePositions(*this, other); | 299 return comparePositions(*this, other); |
300 } | 300 } |
301 | 301 |
| 302 // TODO(yosin) We should move |uncheckedPreviousOffsetForBackwardDeletion()| |
| 303 // to "EditingUtilities.cpp" with |previousPositionOf()|. |
302 // TODO(yosin) To avoid forward declaration, we should move implementation of | 304 // TODO(yosin) To avoid forward declaration, we should move implementation of |
303 // |uncheckedPreviousOffsetForBackwardDeletion()| here. | 305 // |uncheckedPreviousOffsetForBackwardDeletion()| here. |
304 static int uncheckedPreviousOffsetForBackwardDeletion(const Node*, int current); | 306 static int uncheckedPreviousOffsetForBackwardDeletion(const Node*, int current); |
305 | 307 |
306 template <typename Strategy> | 308 template <typename Strategy> |
307 PositionAlgorithm<Strategy> PositionAlgorithm<Strategy>::previous(PositionMoveTy
pe moveType) const | 309 PositionAlgorithm<Strategy> previousPositionOfAlgorithm(const PositionAlgorithm<
Strategy>& position, PositionMoveType moveType) |
308 { | 310 { |
309 Node* node = anchorNode(); | 311 Node* const node = position.anchorNode(); |
310 if (!node) | 312 if (!node) |
311 return PositionAlgorithm<Strategy>(*this); | 313 return position; |
312 | 314 |
313 int offset = computeEditingOffset(); | 315 const int offset = position.computeEditingOffset(); |
314 | 316 |
315 if (offset > 0) { | 317 if (offset > 0) { |
316 if (editingIgnoresContent(node)) | 318 if (editingIgnoresContent(node)) |
317 return beforeNode(node); | 319 return PositionAlgorithm<Strategy>::beforeNode(node); |
318 if (Node* child = Strategy::childAt(*node, offset - 1)) | 320 if (Node* child = Strategy::childAt(*node, offset - 1)) |
319 return lastPositionInOrAfterNode(child); | 321 return PositionAlgorithm<Strategy>::lastPositionInOrAfterNode(child)
; |
320 | 322 |
321 // There are two reasons child might be 0: | 323 // There are two reasons child might be 0: |
322 // 1) The node is node like a text node that is not an element, and th
erefore has no children. | 324 // 1) The node is node like a text node that is not an element, and |
323 // Going backward one character at a time is correct. | 325 // therefore has no children. Going backward one character at a |
324 // 2) The old offset was a bogus offset like (<br>, 1), and there is n
o child. | 326 // time is correct. |
325 // Going from 1 to 0 is correct. | 327 // 2) The old offset was a bogus offset like (<br>, 1), and there is |
| 328 // no child. Going from 1 to 0 is correct. |
326 switch (moveType) { | 329 switch (moveType) { |
327 case CodePoint: | 330 case PositionMoveType::CodePoint: |
328 return PositionAlgorithm<Strategy>(node, offset - 1); | 331 return PositionAlgorithm<Strategy>(node, offset - 1); |
329 case Character: | 332 case PositionMoveType::Character: |
330 return PositionAlgorithm<Strategy>(node, uncheckedPreviousOffset(nod
e, offset)); | 333 return PositionAlgorithm<Strategy>(node, uncheckedPreviousOffset(nod
e, offset)); |
331 case BackwardDeletion: | 334 case PositionMoveType::BackwardDeletion: |
332 return PositionAlgorithm<Strategy>(node, uncheckedPreviousOffsetForB
ackwardDeletion(node, offset)); | 335 return PositionAlgorithm<Strategy>(node, uncheckedPreviousOffsetForB
ackwardDeletion(node, offset)); |
333 } | 336 } |
334 } | 337 } |
335 | 338 |
336 if (ContainerNode* parent = Strategy::parent(*node)) { | 339 if (ContainerNode* parent = Strategy::parent(*node)) { |
337 if (editingIgnoresContent(parent)) | 340 if (editingIgnoresContent(parent)) |
338 return beforeNode(parent); | 341 return PositionAlgorithm<Strategy>::beforeNode(parent); |
339 // TODO(yosin) We should use |Strategy::index(Node&)| instead of | 342 // TODO(yosin) We should use |Strategy::index(Node&)| instead of |
340 // |Node::nodeIndex()|. | 343 // |Node::nodeIndex()|. |
341 return PositionAlgorithm<Strategy>(parent, node->nodeIndex()); | 344 return PositionAlgorithm<Strategy>(parent, node->nodeIndex()); |
342 } | 345 } |
343 return PositionAlgorithm<Strategy>(*this); | 346 return position; |
| 347 } |
| 348 |
| 349 Position previousPositionOf(const Position& position, PositionMoveType moveType) |
| 350 { |
| 351 return previousPositionOfAlgorithm<EditingStrategy>(position, moveType); |
| 352 } |
| 353 |
| 354 PositionInComposedTree previousPositionOf(const PositionInComposedTree& position
, PositionMoveType moveType) |
| 355 { |
| 356 return previousPositionOfAlgorithm<EditingInComposedTreeStrategy>(position,
moveType); |
344 } | 357 } |
345 | 358 |
346 template <typename Strategy> | 359 template <typename Strategy> |
347 PositionAlgorithm<Strategy> PositionAlgorithm<Strategy>::next(PositionMoveType m
oveType) const | 360 PositionAlgorithm<Strategy> nextPositionOfAlgorithm(const PositionAlgorithm<Stra
tegy>& position, PositionMoveType moveType) |
348 { | 361 { |
349 ASSERT(moveType != BackwardDeletion); | 362 ASSERT(moveType != PositionMoveType::BackwardDeletion); |
350 | 363 |
351 Node* node = anchorNode(); | 364 Node* node = position.anchorNode(); |
352 if (!node) | 365 if (!node) |
353 return PositionAlgorithm<Strategy>(*this); | 366 return position; |
354 | 367 |
355 int offset = computeEditingOffset(); | 368 const int offset = position.computeEditingOffset(); |
356 | 369 |
357 if (Node* child = Strategy::childAt(*node, offset)) | 370 if (Node* child = Strategy::childAt(*node, offset)) |
358 return firstPositionInOrBeforeNode(child); | 371 return PositionAlgorithm<Strategy>::firstPositionInOrBeforeNode(child); |
359 | 372 |
360 // TODO(yosin) We should use |Strategy::lastOffsetForEditing()| instead of | 373 // TODO(yosin) We should use |Strategy::lastOffsetForEditing()| instead of |
361 // DOM tree version. | 374 // DOM tree version. |
362 if (!Strategy::hasChildren(*node) && offset < EditingStrategy::lastOffsetFor
Editing(node)) { | 375 if (!Strategy::hasChildren(*node) && offset < EditingStrategy::lastOffsetFor
Editing(node)) { |
363 // There are two reasons child might be 0: | 376 // There are two reasons child might be 0: |
364 // 1) The node is node like a text node that is not an element, and th
erefore has no children. | 377 // 1) The node is node like a text node that is not an element, and |
365 // Going forward one character at a time is correct. | 378 // therefore has no children. Going forward one character at a time |
366 // 2) The new offset is a bogus offset like (<br>, 1), and there is no
child. | 379 // is correct. |
367 // Going from 0 to 1 is correct. | 380 // 2) The new offset is a bogus offset like (<br>, 1), and there is no |
368 return editingPositionOf(node, (moveType == Character) ? uncheckedNextOf
fset(node, offset) : offset + 1); | 381 // child. Going from 0 to 1 is correct. |
| 382 return PositionAlgorithm<Strategy>::editingPositionOf(node, (moveType ==
PositionMoveType::Character) ? uncheckedNextOffset(node, offset) : offset + 1); |
369 } | 383 } |
370 | 384 |
371 if (ContainerNode* parent = Strategy::parent(*node)) | 385 if (ContainerNode* parent = Strategy::parent(*node)) |
372 return editingPositionOf(parent, Strategy::index(*node) + 1); | 386 return PositionAlgorithm<Strategy>::editingPositionOf(parent, Strategy::
index(*node) + 1); |
373 return PositionAlgorithm<Strategy>(*this); | 387 return position; |
| 388 } |
| 389 |
| 390 Position nextPositionOf(const Position& position, PositionMoveType moveType) |
| 391 { |
| 392 return nextPositionOfAlgorithm<EditingStrategy>(position, moveType); |
| 393 } |
| 394 |
| 395 PositionInComposedTree nextPositionOf(const PositionInComposedTree& position, Po
sitionMoveType moveType) |
| 396 { |
| 397 return nextPositionOfAlgorithm<EditingInComposedTreeStrategy>(position, move
Type); |
374 } | 398 } |
375 | 399 |
376 int uncheckedPreviousOffset(const Node* n, int current) | 400 int uncheckedPreviousOffset(const Node* n, int current) |
377 { | 401 { |
378 return n->layoutObject() ? n->layoutObject()->previousOffset(current) : curr
ent - 1; | 402 return n->layoutObject() ? n->layoutObject()->previousOffset(current) : curr
ent - 1; |
379 } | 403 } |
380 | 404 |
381 static int uncheckedPreviousOffsetForBackwardDeletion(const Node* n, int current
) | 405 static int uncheckedPreviousOffsetForBackwardDeletion(const Node* n, int current
) |
382 { | 406 { |
383 return n->layoutObject() ? n->layoutObject()->previousOffsetForBackwardDelet
ion(current) : current - 1; | 407 return n->layoutObject() ? n->layoutObject()->previousOffsetForBackwardDelet
ion(current) : current - 1; |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 | 654 |
631 void showTree(const blink::Position* pos) | 655 void showTree(const blink::Position* pos) |
632 { | 656 { |
633 if (pos) | 657 if (pos) |
634 pos->showTreeForThis(); | 658 pos->showTreeForThis(); |
635 else | 659 else |
636 fprintf(stderr, "Cannot showTree for (nil)\n"); | 660 fprintf(stderr, "Cannot showTree for (nil)\n"); |
637 } | 661 } |
638 | 662 |
639 #endif | 663 #endif |
OLD | NEW |