| 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 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved. | 3 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 // TODO(yosin) We should move |nextPositionOf()| to "VisibleUnits.cpp". | 71 // TODO(yosin) We should move |nextPositionOf()| to "VisibleUnits.cpp". |
| 72 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo
undaryCrossingRule rule) | 72 VisiblePosition nextPositionOf(const VisiblePosition& visiblePosition, EditingBo
undaryCrossingRule rule) |
| 73 { | 73 { |
| 74 VisiblePosition next(nextVisuallyDistinctCandidate(visiblePosition.deepEquiv
alent()), visiblePosition.affinity()); | 74 VisiblePosition next(nextVisuallyDistinctCandidate(visiblePosition.deepEquiv
alent()), visiblePosition.affinity()); |
| 75 | 75 |
| 76 switch (rule) { | 76 switch (rule) { |
| 77 case CanCrossEditingBoundary: | 77 case CanCrossEditingBoundary: |
| 78 return next; | 78 return next; |
| 79 case CannotCrossEditingBoundary: | 79 case CannotCrossEditingBoundary: |
| 80 return visiblePosition.honorEditingBoundaryAtOrAfter(next); | 80 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalen
t()); |
| 81 case CanSkipOverEditingBoundary: | 81 case CanSkipOverEditingBoundary: |
| 82 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent()
); | 82 return skipToEndOfEditingBoundary(next, visiblePosition.deepEquivalent()
); |
| 83 } | 83 } |
| 84 ASSERT_NOT_REACHED(); | 84 ASSERT_NOT_REACHED(); |
| 85 return visiblePosition.honorEditingBoundaryAtOrAfter(next); | 85 return honorEditingBoundaryAtOrAfter(next, visiblePosition.deepEquivalent())
; |
| 86 } | 86 } |
| 87 | 87 |
| 88 // TODO(yosin) We should move implementation of |skipToStartOfEditingBoundary()| | 88 // TODO(yosin) We should move implementation of |skipToStartOfEditingBoundary()| |
| 89 // here to avoid forward declaration. | 89 // here to avoid forward declaration. |
| 90 static VisiblePosition skipToStartOfEditingBoundary(const VisiblePosition&, cons
t Position& anchor); | 90 static VisiblePosition skipToStartOfEditingBoundary(const VisiblePosition&, cons
t Position& anchor); |
| 91 | 91 |
| 92 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
ngBoundaryCrossingRule rule) | 92 VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
ngBoundaryCrossingRule rule) |
| 93 { | 93 { |
| 94 Position pos = previousVisuallyDistinctCandidate(visiblePosition.deepEquival
ent()); | 94 Position pos = previousVisuallyDistinctCandidate(visiblePosition.deepEquival
ent()); |
| 95 | 95 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 107 // length is 0!). | 107 // length is 0!). |
| 108 if (prev.isNotNull() && visiblePosition.affinity() == TextAffinity::Upstream
) { | 108 if (prev.isNotNull() && visiblePosition.affinity() == TextAffinity::Upstream
) { |
| 109 ASSERT(inSameLine(PositionWithAffinity(prev.deepEquivalent()), PositionW
ithAffinity(prev.deepEquivalent(), TextAffinity::Upstream))); | 109 ASSERT(inSameLine(PositionWithAffinity(prev.deepEquivalent()), PositionW
ithAffinity(prev.deepEquivalent(), TextAffinity::Upstream))); |
| 110 } | 110 } |
| 111 #endif | 111 #endif |
| 112 | 112 |
| 113 switch (rule) { | 113 switch (rule) { |
| 114 case CanCrossEditingBoundary: | 114 case CanCrossEditingBoundary: |
| 115 return prev; | 115 return prev; |
| 116 case CannotCrossEditingBoundary: | 116 case CannotCrossEditingBoundary: |
| 117 return visiblePosition.honorEditingBoundaryAtOrBefore(prev); | 117 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivale
nt()); |
| 118 case CanSkipOverEditingBoundary: | 118 case CanSkipOverEditingBoundary: |
| 119 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent
()); | 119 return skipToStartOfEditingBoundary(prev, visiblePosition.deepEquivalent
()); |
| 120 } | 120 } |
| 121 | 121 |
| 122 ASSERT_NOT_REACHED(); | 122 ASSERT_NOT_REACHED(); |
| 123 return visiblePosition.honorEditingBoundaryAtOrBefore(prev); | 123 return honorEditingBoundaryAtOrBefore(prev, visiblePosition.deepEquivalent()
); |
| 124 } | 124 } |
| 125 | 125 |
| 126 // TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with | 126 // TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with |
| 127 // |rightPositionOf()| to "VisibleUnits.cpp". | 127 // |rightPositionOf()| to "VisibleUnits.cpp". |
| 128 static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
tion) | 128 static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
tion) |
| 129 { | 129 { |
| 130 const Position deepPosition = visiblePosition.deepEquivalent(); | 130 const Position deepPosition = visiblePosition.deepEquivalent(); |
| 131 Position p = deepPosition; | 131 Position p = deepPosition; |
| 132 if (p.isNull()) | 132 if (p.isNull()) |
| 133 return Position(); | 133 return Position(); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition) | 277 VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition) |
| 278 { | 278 { |
| 279 const Position pos = leftVisuallyDistinctCandidate(visiblePosition); | 279 const Position pos = leftVisuallyDistinctCandidate(visiblePosition); |
| 280 // TODO(yosin) Why can't we move left from the last position in a tree? | 280 // TODO(yosin) Why can't we move left from the last position in a tree? |
| 281 if (pos.atStartOfTree() || pos.atEndOfTree()) | 281 if (pos.atStartOfTree() || pos.atEndOfTree()) |
| 282 return VisiblePosition(); | 282 return VisiblePosition(); |
| 283 | 283 |
| 284 VisiblePosition left = VisiblePosition(pos); | 284 VisiblePosition left = VisiblePosition(pos); |
| 285 ASSERT(left.deepEquivalent() != visiblePosition.deepEquivalent()); | 285 ASSERT(left.deepEquivalent() != visiblePosition.deepEquivalent()); |
| 286 | 286 |
| 287 return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? visiblePosi
tion.honorEditingBoundaryAtOrBefore(left) : visiblePosition.honorEditingBoundary
AtOrAfter(left); | 287 return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? honorEditin
gBoundaryAtOrBefore(left, visiblePosition.deepEquivalent()) : honorEditingBounda
ryAtOrAfter(left, visiblePosition.deepEquivalent()); |
| 288 } | 288 } |
| 289 | 289 |
| 290 // TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with | 290 // TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with |
| 291 // |rightPositionOf()| to "VisibleUnits.cpp". | 291 // |rightPositionOf()| to "VisibleUnits.cpp". |
| 292 static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
ition) | 292 static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
ition) |
| 293 { | 293 { |
| 294 const Position deepPosition = visiblePosition.deepEquivalent(); | 294 const Position deepPosition = visiblePosition.deepEquivalent(); |
| 295 Position p = deepPosition; | 295 Position p = deepPosition; |
| 296 if (p.isNull()) | 296 if (p.isNull()) |
| 297 return Position(); | 297 return Position(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition) | 444 VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition) |
| 445 { | 445 { |
| 446 const Position pos = rightVisuallyDistinctCandidate(visiblePosition); | 446 const Position pos = rightVisuallyDistinctCandidate(visiblePosition); |
| 447 // TODO(yosin) Why can't we move left from the last position in a tree? | 447 // TODO(yosin) Why can't we move left from the last position in a tree? |
| 448 if (pos.atStartOfTree() || pos.atEndOfTree()) | 448 if (pos.atStartOfTree() || pos.atEndOfTree()) |
| 449 return VisiblePosition(); | 449 return VisiblePosition(); |
| 450 | 450 |
| 451 VisiblePosition right = VisiblePosition(pos); | 451 VisiblePosition right = VisiblePosition(pos); |
| 452 ASSERT(right.deepEquivalent() != visiblePosition.deepEquivalent()); | 452 ASSERT(right.deepEquivalent() != visiblePosition.deepEquivalent()); |
| 453 | 453 |
| 454 return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? visiblePos
ition.honorEditingBoundaryAtOrAfter(right) : visiblePosition.honorEditingBoundar
yAtOrBefore(right); | 454 return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? honorEditi
ngBoundaryAtOrAfter(right, visiblePosition.deepEquivalent()) : honorEditingBound
aryAtOrBefore(right, visiblePosition.deepEquivalent()); |
| 455 } | 455 } |
| 456 | 456 |
| 457 template <typename Strategy> | 457 template <typename Strategy> |
| 458 PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBeforeAlgorithm(c
onst PositionWithAffinityTemplate<Strategy>& pos, const PositionAlgorithm<Strate
gy>& anchor) | 458 PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBeforeAlgorithm(c
onst PositionWithAffinityTemplate<Strategy>& pos, const PositionAlgorithm<Strate
gy>& anchor) |
| 459 { | 459 { |
| 460 if (pos.isNull()) | 460 if (pos.isNull()) |
| 461 return pos; | 461 return pos; |
| 462 | 462 |
| 463 ContainerNode* highestRoot = highestEditableRoot(anchor); | 463 ContainerNode* highestRoot = highestEditableRoot(anchor); |
| 464 | 464 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 484 PositionWithAffinity honorEditingBoundaryAtOrBeforeOf(const PositionWithAffinity
& pos, const Position& anchor) | 484 PositionWithAffinity honorEditingBoundaryAtOrBeforeOf(const PositionWithAffinity
& pos, const Position& anchor) |
| 485 { | 485 { |
| 486 return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor); | 486 return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor); |
| 487 } | 487 } |
| 488 | 488 |
| 489 PositionInComposedTreeWithAffinity honorEditingBoundaryAtOrBeforeOf(const Positi
onInComposedTreeWithAffinity& pos, const PositionInComposedTree& anchor) | 489 PositionInComposedTreeWithAffinity honorEditingBoundaryAtOrBeforeOf(const Positi
onInComposedTreeWithAffinity& pos, const PositionInComposedTree& anchor) |
| 490 { | 490 { |
| 491 return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor); | 491 return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor); |
| 492 } | 492 } |
| 493 | 493 |
| 494 VisiblePosition VisiblePosition::honorEditingBoundaryAtOrBefore(const VisiblePos
ition &pos) const | 494 VisiblePosition honorEditingBoundaryAtOrBefore(const VisiblePosition& pos, const
Position& anchor) |
| 495 { | 495 { |
| 496 return VisiblePosition(honorEditingBoundaryAtOrBeforeOf(pos.toPositionWithAf
finity(), deepEquivalent())); | 496 return VisiblePosition(honorEditingBoundaryAtOrBeforeOf(pos.toPositionWithAf
finity(), anchor)); |
| 497 } | 497 } |
| 498 | 498 |
| 499 VisiblePosition VisiblePosition::honorEditingBoundaryAtOrAfter(const VisiblePosi
tion &pos) const | 499 VisiblePosition honorEditingBoundaryAtOrAfter(const VisiblePosition& pos, const
Position& anchor) |
| 500 { | 500 { |
| 501 if (pos.isNull()) | 501 if (pos.isNull()) |
| 502 return pos; | 502 return pos; |
| 503 | 503 |
| 504 ContainerNode* highestRoot = highestEditableRoot(deepEquivalent()); | 504 ContainerNode* highestRoot = highestEditableRoot(anchor); |
| 505 | 505 |
| 506 // Return empty position if pos is not somewhere inside the editable region
containing this position | 506 // Return empty position if pos is not somewhere inside the editable region
containing this position |
| 507 if (highestRoot && !pos.deepEquivalent().anchorNode()->isDescendantOf(highes
tRoot)) | 507 if (highestRoot && !pos.deepEquivalent().anchorNode()->isDescendantOf(highes
tRoot)) |
| 508 return VisiblePosition(); | 508 return VisiblePosition(); |
| 509 | 509 |
| 510 // Return pos itself if the two are from the very same editable region, or b
oth are non-editable | 510 // Return pos itself if the two are from the very same editable region, or b
oth are non-editable |
| 511 // FIXME: In the non-editable case, just because the new position is non-edi
table doesn't mean movement | 511 // FIXME: In the non-editable case, just because the new position is non-edi
table doesn't mean movement |
| 512 // to it is allowed. VisibleSelection::adjustForEditableContent has this pr
oblem too. | 512 // to it is allowed. VisibleSelection::adjustForEditableContent has this pr
oblem too. |
| 513 if (highestEditableRoot(pos.deepEquivalent()) == highestRoot) | 513 if (highestEditableRoot(pos.deepEquivalent()) == highestRoot) |
| 514 return pos; | 514 return pos; |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 else | 801 else |
| 802 fprintf(stderr, "Cannot showTree for (nil) VisiblePosition.\n"); | 802 fprintf(stderr, "Cannot showTree for (nil) VisiblePosition.\n"); |
| 803 } | 803 } |
| 804 | 804 |
| 805 void showTree(const blink::VisiblePosition& vpos) | 805 void showTree(const blink::VisiblePosition& vpos) |
| 806 { | 806 { |
| 807 vpos.showTreeForThis(); | 807 vpos.showTreeForThis(); |
| 808 } | 808 } |
| 809 | 809 |
| 810 #endif | 810 #endif |
| OLD | NEW |