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 3373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 VisiblePo sitionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) |
3393 { | 3393 { |
3394 // TODO(xiaochengh): Ensure that this function is called with a valid | 3394 DCHECK(visiblePosition.isValid()) << visiblePosition; |
3395 // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|; | 3395 const VisiblePositionTemplate<Strategy> next = createVisiblePosition(nextVis uallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosition.affini ty()); |
3396 const VisiblePositionTemplate<Strategy> next = createVisiblePositionDeprecat ed(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosit ion.affinity()); | |
3397 | 3396 |
3398 switch (rule) { | 3397 switch (rule) { |
3399 case CanCrossEditingBoundary: | 3398 case CanCrossEditingBoundary: |
3400 return next; | 3399 return next; |
3401 case CannotCrossEditingBoundary: | 3400 case CannotCrossEditingBoundary: |
3402 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalen t()); | 3401 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalen t()); |
3403 case CanSkipOverEditingBoundary: | 3402 case CanSkipOverEditingBoundary: |
3404 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent() ); | 3403 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent() ); |
3405 } | 3404 } |
3406 NOTREACHED(); | 3405 NOTREACHED(); |
3407 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalent()) ; | 3406 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalent()) ; |
3408 } | 3407 } |
3409 | 3408 |
3410 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo undaryCrossingRule rule) | 3409 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo undaryCrossingRule rule) |
3411 { | 3410 { |
3412 return nextPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3411 return nextPositionOfAlgorithm<EditingStrategy>(visiblePosition, 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 return nextPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePosition, r ule); |
3418 } | 3417 } |
3419 | 3418 |
3420 template <typename Strategy> | 3419 template <typename Strategy> |
3420 static VisiblePositionTemplate<Strategy> nextPositionOfAlgorithmDeprecated(const VisiblePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) | |
yosin_UTC9
2016/09/27 10:05:39
How about making nextPositionOfAlgorithm to take P
Xiaocheng
2016/09/27 12:27:08
Good idea. Done.
| |
3421 { | |
3422 const VisiblePositionTemplate<Strategy> next = createVisiblePositionDeprecat ed(nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()), visiblePosit ion.affinity()); | |
3423 | |
3424 switch (rule) { | |
3425 case CanCrossEditingBoundary: | |
3426 return next; | |
3427 case CannotCrossEditingBoundary: | |
3428 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalen t()); | |
3429 case CanSkipOverEditingBoundary: | |
3430 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent() ); | |
3431 } | |
3432 NOTREACHED(); | |
3433 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalent()) ; | |
3434 } | |
3435 | |
3436 VisiblePosition nextPositionOfDeprecated(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule) | |
3437 { | |
3438 return nextPositionOfAlgorithmDeprecated<EditingStrategy>(visiblePosition, r ule); | |
3439 } | |
3440 | |
3441 VisiblePositionInFlatTree nextPositionOfDeprecated(const VisiblePositionInFlatTr ee& visiblePosition, EditingBoundaryCrossingRule rule) | |
3442 { | |
3443 return nextPositionOfAlgorithmDeprecated<EditingInFlatTreeStrategy>(visibleP osition, rule); | |
3444 } | |
3445 | |
3446 template <typename Strategy> | |
3421 static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const Visi blePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor) | 3447 static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const Visi blePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor) |
3422 { | 3448 { |
3423 DCHECK(pos.isValid()) << pos; | 3449 DCHECK(pos.isValid()) << pos; |
3424 if (pos.isNull()) | 3450 if (pos.isNull()) |
3425 return pos; | 3451 return pos; |
3426 | 3452 |
3427 ContainerNode* highestRoot = highestEditableRoot(anchor); | 3453 ContainerNode* highestRoot = highestEditableRoot(anchor); |
3428 ContainerNode* highestRootOfPos = highestEditableRoot(pos.deepEquivalent()); | 3454 ContainerNode* highestRootOfPos = highestEditableRoot(pos.deepEquivalent()); |
3429 | 3455 |
3430 // Return |pos| itself if the two are from the very same editable region, or | 3456 // Return |pos| itself if the two are from the very same editable region, or |
3431 // both are non-editable. | 3457 // both are non-editable. |
3432 if (highestRootOfPos == highestRoot) | 3458 if (highestRootOfPos == highestRoot) |
3433 return pos; | 3459 return pos; |
3434 | 3460 |
3435 // If this is not editable but |pos| has an editable root, skip to the start | 3461 // If this is not editable but |pos| has an editable root, skip to the start |
3436 if (!highestRoot && highestRootOfPos) | 3462 if (!highestRoot && highestRootOfPos) |
3437 return createVisiblePosition(previousVisuallyDistinctCandidate(PositionT emplate<Strategy>(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnch oredEquivalent())); | 3463 return createVisiblePosition(previousVisuallyDistinctCandidate(PositionT emplate<Strategy>(highestRootOfPos, PositionAnchorType::BeforeAnchor).parentAnch oredEquivalent())); |
3438 | 3464 |
3439 // That must mean that |pos| is not editable. Return the last position | 3465 // 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 | 3466 // before |pos| that is in the same editable region as this position |
3441 DCHECK(highestRoot); | 3467 DCHECK(highestRoot); |
3442 return lastEditableVisiblePositionBeforePositionInRoot(pos.deepEquivalent(), *highestRoot); | 3468 return lastEditableVisiblePositionBeforePositionInRoot(pos.deepEquivalent(), *highestRoot); |
3443 } | 3469 } |
3444 | 3470 |
3445 template <typename Strategy> | 3471 template <typename Strategy> |
3446 static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithm(const Visib lePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) | 3472 static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithm(const Visib lePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule) |
3447 { | 3473 { |
3448 // TODO(xiaochengh): Ensure that this function is called with a valid | 3474 DCHECK(visiblePosition.isValid()) << visiblePosition; |
3449 // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|; | |
3450 const PositionTemplate<Strategy> pos = previousVisuallyDistinctCandidate(vis iblePosition.deepEquivalent()); | 3475 const PositionTemplate<Strategy> pos = previousVisuallyDistinctCandidate(vis iblePosition.deepEquivalent()); |
3451 | 3476 |
3452 // return null visible position if there is no previous visible position | 3477 // return null visible position if there is no previous visible position |
3453 if (pos.atStartOfTree()) | 3478 if (pos.atStartOfTree()) |
3454 return VisiblePositionTemplate<Strategy>(); | 3479 return VisiblePositionTemplate<Strategy>(); |
3455 | 3480 |
3456 // we should always be able to make the affinity |TextAffinity::Downstream|, | 3481 // we should always be able to make the affinity |TextAffinity::Downstream|, |
3457 // because going previous from an |TextAffinity::Upstream| position can | 3482 // because going previous from an |TextAffinity::Upstream| position can |
3458 // never yield another |TextAffinity::Upstream position| (unless line wrap | 3483 // never yield another |TextAffinity::Upstream position| (unless line wrap |
3459 // length is 0!). | 3484 // length is 0!). |
3460 const VisiblePositionTemplate<Strategy> prev = createVisiblePositionDeprecat ed(pos); | 3485 const VisiblePositionTemplate<Strategy> prev = createVisiblePosition(pos); |
3461 if (prev.deepEquivalent() == visiblePosition.deepEquivalent()) | 3486 if (prev.deepEquivalent() == visiblePosition.deepEquivalent()) |
3462 return VisiblePositionTemplate<Strategy>(); | 3487 return VisiblePositionTemplate<Strategy>(); |
3463 | 3488 |
3464 switch (rule) { | 3489 switch (rule) { |
3465 case CanCrossEditingBoundary: | 3490 case CanCrossEditingBoundary: |
3466 return prev; | 3491 return prev; |
3467 case CannotCrossEditingBoundary: | 3492 case CannotCrossEditingBoundary: |
3468 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivale nt()); | 3493 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivale nt()); |
3469 case CanSkipOverEditingBoundary: | 3494 case CanSkipOverEditingBoundary: |
3470 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent ()); | 3495 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent ()); |
3471 } | 3496 } |
3472 | 3497 |
3473 NOTREACHED(); | 3498 NOTREACHED(); |
3474 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent() ); | 3499 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent() ); |
3475 } | 3500 } |
3476 | 3501 |
3477 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi ngBoundaryCrossingRule rule) | 3502 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi ngBoundaryCrossingRule rule) |
3478 { | 3503 { |
3479 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3504 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); |
3480 } | 3505 } |
3481 | 3506 |
3482 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi siblePosition, EditingBoundaryCrossingRule rule) | 3507 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi siblePosition, EditingBoundaryCrossingRule rule) |
3483 { | 3508 { |
3484 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio n, rule); | 3509 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio n, rule); |
3485 } | 3510 } |
3486 | 3511 |
3512 template <typename Strategy> | |
3513 static VisiblePositionTemplate<Strategy> previousPositionOfAlgorithmDeprecated(c onst VisiblePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossing Rule rule) | |
yosin_UTC9
2016/09/27 10:05:39
Ditto as nextPositionOfAlgorithm.
Xiaocheng
2016/09/27 12:27:08
Done.
| |
3514 { | |
3515 const PositionTemplate<Strategy> pos = previousVisuallyDistinctCandidate(vis iblePosition.deepEquivalent()); | |
3516 | |
3517 // return null visible position if there is no previous visible position | |
3518 if (pos.atStartOfTree()) | |
3519 return VisiblePositionTemplate<Strategy>(); | |
3520 | |
3521 // we should always be able to make the affinity |TextAffinity::Downstream|, | |
3522 // because going previous from an |TextAffinity::Upstream| position can | |
3523 // never yield another |TextAffinity::Upstream position| (unless line wrap | |
3524 // length is 0!). | |
3525 const VisiblePositionTemplate<Strategy> prev = createVisiblePositionDeprecat ed(pos); | |
3526 if (prev.deepEquivalent() == visiblePosition.deepEquivalent()) | |
3527 return VisiblePositionTemplate<Strategy>(); | |
3528 | |
3529 switch (rule) { | |
3530 case CanCrossEditingBoundary: | |
3531 return prev; | |
3532 case CannotCrossEditingBoundary: | |
3533 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivale nt()); | |
3534 case CanSkipOverEditingBoundary: | |
3535 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent ()); | |
3536 } | |
3537 | |
3538 NOTREACHED(); | |
3539 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent() ); | |
3540 } | |
3541 | |
3542 VisiblePosition previousPositionOfDeprecated(const VisiblePosition& visiblePosit ion, EditingBoundaryCrossingRule rule) | |
3543 { | |
3544 return previousPositionOfAlgorithmDeprecated<EditingStrategy>(visiblePositio n, rule); | |
3545 } | |
3546 | |
3547 VisiblePositionInFlatTree previousPositionOfDeprecated(const VisiblePositionInFl atTree& visiblePosition, EditingBoundaryCrossingRule rule) | |
3548 { | |
3549 return previousPositionOfAlgorithmDeprecated<EditingInFlatTreeStrategy>(visi blePosition, rule); | |
3550 } | |
3551 | |
3487 } // namespace blink | 3552 } // namespace blink |
OLD | NEW |