| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
| 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 3371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3382 { | 3382 { |
| 3383 return rightPositionOfAlgorithm<EditingStrategy>(visiblePosition); | 3383 return rightPositionOfAlgorithm<EditingStrategy>(visiblePosition); |
| 3384 } | 3384 } |
| 3385 | 3385 |
| 3386 VisiblePositionInFlatTree rightPositionOf(const VisiblePositionInFlatTree& visib
lePosition) | 3386 VisiblePositionInFlatTree rightPositionOf(const VisiblePositionInFlatTree& visib
lePosition) |
| 3387 { | 3387 { |
| 3388 return rightPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition); | 3388 return rightPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition); |
| 3389 } | 3389 } |
| 3390 | 3390 |
| 3391 template <typename Strategy> | 3391 template <typename Strategy> |
| 3392 static VisiblePositionTemplate<Strategy> nextPositionOfAlgorithm(const VisiblePo
sitionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) | 3392 static VisiblePositionTemplate<Strategy> nextPositionOfAlgorithm(const PositionW
ithAffinityTemplate<Strategy>& position, EditingBoundaryCrossingRule rule) |
| 3393 { | 3393 { |
| 3394 // TODO(xiaochengh): Ensure that this function is called with a valid | 3394 const VisiblePositionTemplate<Strategy> next = createVisiblePosition(nextVis
uallyDistinctCandidate(position.position()), position.affinity()); |
| 3395 // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|; | |
| 3396 const VisiblePositionTemplate<Strategy> next = createVisiblePositionDeprecat
ed(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosit
ion.affinity()); | |
| 3397 | 3395 |
| 3398 switch (rule) { | 3396 switch (rule) { |
| 3399 case CanCrossEditingBoundary: | 3397 case CanCrossEditingBoundary: |
| 3400 return next; | 3398 return next; |
| 3401 case CannotCrossEditingBoundary: | 3399 case CannotCrossEditingBoundary: |
| 3402 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalen
t()); | 3400 return honorEditingBoundaryAtOrAfter(next, position.position()); |
| 3403 case CanSkipOverEditingBoundary: | 3401 case CanSkipOverEditingBoundary: |
| 3404 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent()
); | 3402 return skipToEndOfEditingBoundary(next, position.position()); |
| 3405 } | 3403 } |
| 3406 NOTREACHED(); | 3404 NOTREACHED(); |
| 3407 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalent())
; | 3405 return honorEditingBoundaryAtOrAfter(next, position.position()); |
| 3408 } | 3406 } |
| 3409 | 3407 |
| 3410 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo
undaryCrossingRule rule) | 3408 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo
undaryCrossingRule rule) |
| 3411 { | 3409 { |
| 3412 return nextPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3410 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 3411 return nextPositionOfAlgorithm<EditingStrategy>(visiblePosition.toPositionWi
thAffinity(), rule); |
| 3413 } | 3412 } |
| 3414 | 3413 |
| 3415 VisiblePositionInFlatTree nextPositionOf(const VisiblePositionInFlatTree& visibl
ePosition, EditingBoundaryCrossingRule rule) | 3414 VisiblePositionInFlatTree nextPositionOf(const VisiblePositionInFlatTree& visibl
ePosition, EditingBoundaryCrossingRule rule) |
| 3416 { | 3415 { |
| 3417 return nextPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition, r
ule); | 3416 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 3417 return nextPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition.to
PositionWithAffinity(), rule); |
| 3418 } |
| 3419 |
| 3420 VisiblePosition nextPositionOfDeprecated(const VisiblePosition& visiblePosition,
EditingBoundaryCrossingRule rule) |
| 3421 { |
| 3422 if (visiblePosition.isNull()) |
| 3423 return VisiblePosition(); |
| 3424 visiblePosition.deepEquivalent().document()->updateStyleAndLayoutIgnorePendi
ngStylesheets(); |
| 3425 return nextPositionOfAlgorithm<EditingStrategy>(visiblePosition.toPositionWi
thAffinity(), rule); |
| 3426 } |
| 3427 |
| 3428 VisiblePositionInFlatTree nextPositionOfDeprecated(const VisiblePositionInFlatTr
ee& visiblePosition, EditingBoundaryCrossingRule rule) |
| 3429 { |
| 3430 if (visiblePosition.isNull()) |
| 3431 return VisiblePositionInFlatTree(); |
| 3432 visiblePosition.deepEquivalent().document()->updateStyleAndLayoutIgnorePendi
ngStylesheets(); |
| 3433 return nextPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition.to
PositionWithAffinity(), rule); |
| 3418 } | 3434 } |
| 3419 | 3435 |
| 3420 template <typename Strategy> | 3436 template <typename Strategy> |
| 3421 static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const Visi
blePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor) | 3437 static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const Visi
blePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor) |
| 3422 { | 3438 { |
| 3423 DCHECK(pos.isValid()) << pos; | 3439 DCHECK(pos.isValid()) << pos; |
| 3424 if (pos.isNull()) | 3440 if (pos.isNull()) |
| 3425 return pos; | 3441 return pos; |
| 3426 | 3442 |
| 3427 ContainerNode* highestRoot = highestEditableRoot(anchor); | 3443 ContainerNode* highestRoot = highestEditableRoot(anchor); |
| 3428 ContainerNode* highestRootOfPos = highestEditableRoot(pos.deepEquivalent()); | 3444 ContainerNode* highestRootOfPos = highestEditableRoot(pos.deepEquivalent()); |
| 3429 | 3445 |
| 3430 // Return |pos| itself if the two are from the very same editable region, or | 3446 // Return |pos| itself if the two are from the very same editable region, or |
| 3431 // both are non-editable. | 3447 // both are non-editable. |
| 3432 if (highestRootOfPos == highestRoot) | 3448 if (highestRootOfPos == highestRoot) |
| 3433 return pos; | 3449 return pos; |
| 3434 | 3450 |
| 3435 // If this is not editable but |pos| has an editable root, skip to the start | 3451 // If this is not editable but |pos| has an editable root, skip to the start |
| 3436 if (!highestRoot && highestRootOfPos) | 3452 if (!highestRoot && highestRootOfPos) |
| 3437 return createVisiblePosition(previousVisuallyDistinctCandidate(PositionT
emplate<Strategy>(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnch
oredEquivalent())); | 3453 return createVisiblePosition(previousVisuallyDistinctCandidate(PositionT
emplate<Strategy>(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnch
oredEquivalent())); |
| 3438 | 3454 |
| 3439 // That must mean that |pos| is not editable. Return the last position | 3455 // That must mean that |pos| is not editable. Return the last position |
| 3440 // before |pos| that is in the same editable region as this position | 3456 // before |pos| that is in the same editable region as this position |
| 3441 DCHECK(highestRoot); | 3457 DCHECK(highestRoot); |
| 3442 return lastEditableVisiblePositionBeforePositionInRoot(pos.deepEquivalent(),
*highestRoot); | 3458 return lastEditableVisiblePositionBeforePositionInRoot(pos.deepEquivalent(),
*highestRoot); |
| 3443 } | 3459 } |
| 3444 | 3460 |
| 3445 template <typename Strategy> | 3461 template <typename Strategy> |
| 3446 static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithm(const Visib
lePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) | 3462 static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithm(const Posit
ionTemplate<Strategy>& position, EditingBoundaryCrossingRule rule) |
| 3447 { | 3463 { |
| 3448 // TODO(xiaochengh): Ensure that this function is called with a valid | 3464 const PositionTemplate<Strategy> prevPosition = previousVisuallyDistinctCand
idate(position); |
| 3449 // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|; | |
| 3450 const PositionTemplate<Strategy> pos = previousVisuallyDistinctCandidate(vis
iblePosition.deepEquivalent()); | |
| 3451 | 3465 |
| 3452 // return null visible position if there is no previous visible position | 3466 // return null visible position if there is no previous visible position |
| 3453 if (pos.atStartOfTree()) | 3467 if (prevPosition.atStartOfTree()) |
| 3454 return VisiblePositionTemplate<Strategy>(); | 3468 return VisiblePositionTemplate<Strategy>(); |
| 3455 | 3469 |
| 3456 // we should always be able to make the affinity |TextAffinity::Downstream|, | 3470 // we should always be able to make the affinity |TextAffinity::Downstream|, |
| 3457 // because going previous from an |TextAffinity::Upstream| position can | 3471 // because going previous from an |TextAffinity::Upstream| position can |
| 3458 // never yield another |TextAffinity::Upstream position| (unless line wrap | 3472 // never yield another |TextAffinity::Upstream position| (unless line wrap |
| 3459 // length is 0!). | 3473 // length is 0!). |
| 3460 const VisiblePositionTemplate<Strategy> prev = createVisiblePositionDeprecat
ed(pos); | 3474 const VisiblePositionTemplate<Strategy> prev = createVisiblePosition(prevPos
ition); |
| 3461 if (prev.deepEquivalent() == visiblePosition.deepEquivalent()) | 3475 if (prev.deepEquivalent() == position) |
| 3462 return VisiblePositionTemplate<Strategy>(); | 3476 return VisiblePositionTemplate<Strategy>(); |
| 3463 | 3477 |
| 3464 switch (rule) { | 3478 switch (rule) { |
| 3465 case CanCrossEditingBoundary: | 3479 case CanCrossEditingBoundary: |
| 3466 return prev; | 3480 return prev; |
| 3467 case CannotCrossEditingBoundary: | 3481 case CannotCrossEditingBoundary: |
| 3468 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivale
nt()); | 3482 return honorEditingBoundaryAtOrBefore(prev, position); |
| 3469 case CanSkipOverEditingBoundary: | 3483 case CanSkipOverEditingBoundary: |
| 3470 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent
()); | 3484 return skipToStartOfEditingBoundary(prev, position); |
| 3471 } | 3485 } |
| 3472 | 3486 |
| 3473 NOTREACHED(); | 3487 NOTREACHED(); |
| 3474 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent()
); | 3488 return honorEditingBoundaryAtOrBefore(prev, position); |
| 3475 } | 3489 } |
| 3476 | 3490 |
| 3477 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
ngBoundaryCrossingRule rule) | 3491 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
ngBoundaryCrossingRule rule) |
| 3478 { | 3492 { |
| 3479 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3493 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 3494 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition.deepEqui
valent(), rule); |
| 3480 } | 3495 } |
| 3481 | 3496 |
| 3482 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi
siblePosition, EditingBoundaryCrossingRule rule) | 3497 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi
siblePosition, EditingBoundaryCrossingRule rule) |
| 3483 { | 3498 { |
| 3484 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio
n, rule); | 3499 DCHECK(visiblePosition.isValid()) << visiblePosition; |
| 3500 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio
n.deepEquivalent(), rule); |
| 3501 } |
| 3502 |
| 3503 VisiblePosition previousPositionOfDeprecated(const VisiblePosition& visiblePosit
ion, EditingBoundaryCrossingRule rule) |
| 3504 { |
| 3505 if (visiblePosition.isNull()) |
| 3506 return VisiblePosition(); |
| 3507 visiblePosition.deepEquivalent().document()->updateStyleAndLayoutIgnorePendi
ngStylesheets(); |
| 3508 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition.deepEqui
valent(), rule); |
| 3509 } |
| 3510 |
| 3511 VisiblePositionInFlatTree previousPositionOfDeprecated(const VisiblePositionInFl
atTree& visiblePosition, EditingBoundaryCrossingRule rule) |
| 3512 { |
| 3513 if (visiblePosition.isNull()) |
| 3514 return VisiblePositionInFlatTree(); |
| 3515 visiblePosition.deepEquivalent().document()->updateStyleAndLayoutIgnorePendi
ngStylesheets(); |
| 3516 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio
n.deepEquivalent(), rule); |
| 3485 } | 3517 } |
| 3486 | 3518 |
| 3487 } // namespace blink | 3519 } // namespace blink |
| OLD | NEW |