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 |