| Index: Source/core/editing/VisibleUnits.cpp
|
| diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp
|
| index 0feccec2f599e5a704cc678dbd444562b1ea1efb..741285dcbb0f0c7e8cef3a843f160807b33b1382 100644
|
| --- a/Source/core/editing/VisibleUnits.cpp
|
| +++ b/Source/core/editing/VisibleUnits.cpp
|
| @@ -162,7 +162,7 @@ PositionInComposedTree canonicalPositionOf(const PositionInComposedTree& positio
|
| }
|
|
|
| template <typename Strategy>
|
| -static PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBeforeAlgorithm(const PositionWithAffinityTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
|
| +static PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBefore(const PositionWithAffinityTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
|
| {
|
| if (pos.isNull())
|
| return pos;
|
| @@ -193,22 +193,14 @@ static PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBeforeAlgo
|
| return lastEditablePositionBeforePositionInRoot(pos.position(), highestRoot);
|
| }
|
|
|
| -static PositionWithAffinity honorEditingBoundaryAtOrBeforeOf(const PositionWithAffinity& pos, const Position& anchor)
|
| -{
|
| - return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor);
|
| -}
|
| -
|
| -static PositionInComposedTreeWithAffinity honorEditingBoundaryAtOrBeforeOf(const PositionInComposedTreeWithAffinity& pos, const PositionInComposedTree& anchor)
|
| -{
|
| - return honorEditingBoundaryAtOrBeforeAlgorithm(pos, anchor);
|
| -}
|
| -
|
| -static VisiblePosition honorEditingBoundaryAtOrBefore(const VisiblePosition& pos, const Position& anchor)
|
| +template <typename Strategy>
|
| +static VisiblePositionTemplate<Strategy> honorEditingBoundaryAtOrBefore(const VisiblePositionTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
|
| {
|
| - return createVisiblePosition(honorEditingBoundaryAtOrBeforeOf(pos.toPositionWithAffinity(), anchor));
|
| + return createVisiblePosition(honorEditingBoundaryAtOrBefore(pos.toPositionWithAffinity(), anchor));
|
| }
|
|
|
| -static VisiblePosition honorEditingBoundaryAtOrAfter(const VisiblePosition& pos, const Position& anchor)
|
| +template <typename Strategy>
|
| +static VisiblePositionTemplate<Strategy> honorEditingBoundaryAtOrAfter(const VisiblePositionTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
|
| {
|
| if (pos.isNull())
|
| return pos;
|
| @@ -216,9 +208,9 @@ static VisiblePosition honorEditingBoundaryAtOrAfter(const VisiblePosition& pos,
|
| ContainerNode* highestRoot = highestEditableRoot(anchor);
|
|
|
| // Return empty position if |pos| is not somewhere inside the editable
|
| - // region // containing this position
|
| + // region containing this position
|
| if (highestRoot && !pos.deepEquivalent().anchorNode()->isDescendantOf(highestRoot))
|
| - return VisiblePosition();
|
| + return VisiblePositionTemplate<Strategy>();
|
|
|
| // Return |pos| itself if the two are from the very same editable region, or
|
| // both are non-editable
|
| @@ -229,10 +221,10 @@ static VisiblePosition honorEditingBoundaryAtOrAfter(const VisiblePosition& pos,
|
| return pos;
|
|
|
| // Return empty position if this position is non-editable, but |pos| is
|
| - // editable
|
| + // editable.
|
| // TODO(yosin) Move to the next non-editable region.
|
| if (!highestRoot)
|
| - return VisiblePosition();
|
| + return VisiblePositionTemplate<Strategy>();
|
|
|
| // Return the next position after |pos| that is in the same editable region
|
| // as this position
|
| @@ -960,7 +952,7 @@ static PositionWithAffinityTemplate<Strategy> startOfLine(const PositionWithAffi
|
| }
|
| }
|
|
|
| - return honorEditingBoundaryAtOrBeforeOf(visPos, c.position());
|
| + return honorEditingBoundaryAtOrBefore(visPos, c.position());
|
| }
|
|
|
| static PositionWithAffinity startOfLine(const PositionWithAffinity& currentPosition)
|
| @@ -2584,14 +2576,16 @@ UChar32 characterBefore(const VisiblePosition& visiblePosition)
|
| return characterAfter(previousPositionOf(visiblePosition));
|
| }
|
|
|
| -static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
|
| +template <typename Strategy>
|
| +static PositionAlgorithm<Strategy> leftVisuallyDistinctCandidate(const VisiblePositionTemplate<Strategy>& visiblePosition)
|
| {
|
| - const Position deepPosition = visiblePosition.deepEquivalent();
|
| - Position p = deepPosition;
|
| + const PositionAlgorithm<Strategy> deepPosition = visiblePosition.deepEquivalent();
|
| + PositionAlgorithm<Strategy> p = deepPosition;
|
| +
|
| if (p.isNull())
|
| - return Position();
|
| + return PositionAlgorithm<Strategy>();
|
|
|
| - Position downstreamStart = mostForwardCaretPosition(p);
|
| + const PositionAlgorithm<Strategy> downstreamStart = mostForwardCaretPosition(p);
|
| TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode());
|
| const TextAffinity affinity = visiblePosition.affinity();
|
|
|
| @@ -2629,13 +2623,13 @@ static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
|
| // Overshot to the left.
|
| InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak();
|
| if (!prevBox) {
|
| - Position positionOnLeft = primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
|
| + PositionAlgorithm<Strategy> positionOnLeft = primaryDirection == LTR ? previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent()) : nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent());
|
| if (positionOnLeft.isNull())
|
| - return Position();
|
| + return PositionAlgorithm<Strategy>();
|
|
|
| InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLeft, affinity, primaryDirection).inlineBox;
|
| if (boxOnLeft && boxOnLeft->root() == box->root())
|
| - return Position();
|
| + return PositionAlgorithm<Strategy>();
|
| return positionOnLeft;
|
| }
|
|
|
| @@ -2699,7 +2693,8 @@ static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
|
| continue;
|
| }
|
| } else {
|
| - // Trailing edge of a secondary run. Set to the leading edge of the entire run.
|
| + // Trailing edge of a secondary run. Set to the leading edge of
|
| + // the entire run.
|
| while (true) {
|
| while (InlineBox* nextBox = box->nextLeafChild()) {
|
| if (nextBox->bidiLevel() < level)
|
| @@ -2724,7 +2719,7 @@ static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
|
| break;
|
| }
|
|
|
| - p = Position::editingPositionOf(layoutObject->node(), offset);
|
| + p = PositionAlgorithm<Strategy>::editingPositionOf(layoutObject->node(), offset);
|
|
|
| if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
|
| return p;
|
| @@ -2733,19 +2728,30 @@ static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosi
|
| }
|
| }
|
|
|
| -VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition)
|
| +template <typename Strategy>
|
| +VisiblePositionTemplate<Strategy> leftPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
|
| {
|
| - const Position pos = leftVisuallyDistinctCandidate(visiblePosition);
|
| + const PositionAlgorithm<Strategy> pos = leftVisuallyDistinctCandidate(visiblePosition);
|
| // TODO(yosin) Why can't we move left from the last position in a tree?
|
| if (pos.atStartOfTree() || pos.atEndOfTree())
|
| - return VisiblePosition();
|
| + return VisiblePositionTemplate<Strategy>();
|
|
|
| - VisiblePosition left = createVisiblePosition(pos);
|
| + const VisiblePositionTemplate<Strategy> left = createVisiblePosition(pos);
|
| ASSERT(left.deepEquivalent() != visiblePosition.deepEquivalent());
|
|
|
| return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrBefore(left, visiblePosition.deepEquivalent()) : honorEditingBoundaryAtOrAfter(left, visiblePosition.deepEquivalent());
|
| }
|
|
|
| +VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition)
|
| +{
|
| + return leftPositionOfAlgorithm<EditingStrategy>(visiblePosition);
|
| +}
|
| +
|
| +VisiblePositionInComposedTree leftPositionOf(const VisiblePositionInComposedTree& visiblePosition)
|
| +{
|
| + return leftPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePosition);
|
| +}
|
| +
|
| static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
|
| {
|
| const Position deepPosition = visiblePosition.deepEquivalent();
|
|
|