| Index: Source/core/editing/VisibleUnits.cpp
|
| diff --git a/Source/core/editing/VisibleUnits.cpp b/Source/core/editing/VisibleUnits.cpp
|
| index ee8bd3f25d5e2b2b2515911a3b7bdcdd10fab245..eeed6b1a28b9424474e0893b98889ad0e87bef02 100644
|
| --- a/Source/core/editing/VisibleUnits.cpp
|
| +++ b/Source/core/editing/VisibleUnits.cpp
|
| @@ -2782,14 +2782,15 @@ VisiblePositionInComposedTree leftPositionOf(const VisiblePositionInComposedTree
|
| return leftPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePosition);
|
| }
|
|
|
| -static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
|
| +template <typename Strategy>
|
| +static PositionAlgorithm<Strategy> rightVisuallyDistinctCandidate(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();
|
|
|
| @@ -2827,13 +2828,13 @@ static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
|
| // Overshot to the right.
|
| InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak();
|
| if (!nextBox) {
|
| - Position positionOnRight = primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
| + PositionAlgorithm<Strategy> positionOnRight = primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
| if (positionOnRight.isNull())
|
| - return Position();
|
| + return PositionAlgorithm<Strategy>();
|
|
|
| InlineBox* boxOnRight = computeInlineBoxPosition(positionOnRight, affinity, primaryDirection).inlineBox;
|
| if (boxOnRight && boxOnRight->root() == box->root())
|
| - return Position();
|
| + return PositionAlgorithm<Strategy>();
|
| return positionOnRight;
|
| }
|
|
|
| @@ -2901,8 +2902,7 @@ static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
|
| 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* prevBox = box->prevLeafChild()) {
|
| if (prevBox->bidiLevel() < level)
|
| @@ -2927,7 +2927,7 @@ static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
|
| 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;
|
| @@ -2936,19 +2936,30 @@ static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePos
|
| }
|
| }
|
|
|
| -VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition)
|
| +template <typename Strategy>
|
| +static VisiblePositionTemplate<Strategy> rightPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
|
| {
|
| - const Position pos = rightVisuallyDistinctCandidate(visiblePosition);
|
| - // TODO(yosin) Why can't we move left from the last position in a tree?
|
| + const PositionAlgorithm<Strategy> pos = rightVisuallyDistinctCandidate(visiblePosition);
|
| + // FIXME: Why can't we move left from the last position in a tree?
|
| if (pos.atStartOfTree() || pos.atEndOfTree())
|
| - return VisiblePosition();
|
| + return VisiblePositionTemplate<Strategy>();
|
|
|
| - VisiblePosition right = createVisiblePosition(pos);
|
| + const VisiblePositionTemplate<Strategy> right = createVisiblePosition(pos);
|
| ASSERT(right.deepEquivalent() != visiblePosition.deepEquivalent());
|
|
|
| return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrAfter(right, visiblePosition.deepEquivalent()) : honorEditingBoundaryAtOrBefore(right, visiblePosition.deepEquivalent());
|
| }
|
|
|
| +VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition)
|
| +{
|
| + return rightPositionOfAlgorithm<EditingStrategy>(visiblePosition);
|
| +}
|
| +
|
| +VisiblePositionInComposedTree rightPositionOf(const VisiblePositionInComposedTree& visiblePosition)
|
| +{
|
| + return rightPositionOfAlgorithm<EditingInComposedTreeStrategy>(visiblePosition);
|
| +}
|
| +
|
| template <typename Strategy>
|
| static VisiblePositionTemplate<Strategy> nextPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule rule)
|
| {
|
|
|