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 |