| Index: Source/core/editing/VisiblePosition.cpp
|
| diff --git a/Source/core/editing/VisiblePosition.cpp b/Source/core/editing/VisiblePosition.cpp
|
| index 834b42b6c355bcab6801873d069b00cbec626c98..a71db00bb38ae0abc9d67eb99346b983112ba179 100644
|
| --- a/Source/core/editing/VisiblePosition.cpp
|
| +++ b/Source/core/editing/VisiblePosition.cpp
|
| @@ -115,32 +115,36 @@ VisiblePosition previousPositionOf(const VisiblePosition& visiblePosition, Editi
|
| return visiblePosition.honorEditingBoundaryAtOrBefore(prev);
|
| }
|
|
|
| -Position VisiblePosition::leftVisuallyDistinctCandidate() const
|
| +// TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with
|
| +// |rightPositionOf()| to "VisibleUnits.cpp".
|
| +static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
|
| {
|
| - Position p = m_deepPosition;
|
| + const Position deepPosition = visiblePosition.deepEquivalent();
|
| + Position p = deepPosition;
|
| if (p.isNull())
|
| return Position();
|
|
|
| Position downstreamStart = mostForwardCaretPosition(p);
|
| TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode());
|
| + const TextAffinity affinity = visiblePosition.affinity();
|
|
|
| while (true) {
|
| - InlineBoxPosition boxPosition = computeInlineBoxPosition(p, m_affinity, primaryDirection);
|
| + InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, primaryDirection);
|
| InlineBox* box = boxPosition.inlineBox;
|
| int offset = boxPosition.offsetInBox;
|
| if (!box)
|
| - return primaryDirection == LTR ? previousVisuallyDistinctCandidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition);
|
| + return primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
|
|
|
| LayoutObject* layoutObject = &box->layoutObject();
|
|
|
| while (true) {
|
| if ((layoutObject->isReplaced() || layoutObject->isBR()) && offset == box->caretRightmostOffset())
|
| - return box->isLeftToRightDirection() ? previousVisuallyDistinctCandidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition);
|
| + return box->isLeftToRightDirection() ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
|
|
|
| if (!layoutObject->node()) {
|
| box = box->prevLeafChild();
|
| if (!box)
|
| - return primaryDirection == LTR ? previousVisuallyDistinctCandidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition);
|
| + return primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
|
| layoutObject = &box->layoutObject();
|
| offset = box->caretRightmostOffset();
|
| continue;
|
| @@ -158,11 +162,11 @@ Position VisiblePosition::leftVisuallyDistinctCandidate() const
|
| // Overshot to the left.
|
| InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak();
|
| if (!prevBox) {
|
| - Position positionOnLeft = primaryDirection == LTR ? previousVisuallyDistinctCandidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition);
|
| + Position positionOnLeft = primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
|
| if (positionOnLeft.isNull())
|
| return Position();
|
|
|
| - InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLeft, m_affinity, primaryDirection).inlineBox;
|
| + InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLeft, affinity, primaryDirection).inlineBox;
|
| if (boxOnLeft && boxOnLeft->root() == box->root())
|
| return Position();
|
| return positionOnLeft;
|
| @@ -257,49 +261,54 @@ Position VisiblePosition::leftVisuallyDistinctCandidate() const
|
| if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
|
| return p;
|
|
|
| - ASSERT(p != m_deepPosition);
|
| + ASSERT(p != deepPosition);
|
| }
|
| }
|
|
|
| -VisiblePosition VisiblePosition::left() const
|
| +// TODO(yosin) We should move |leftPositionOf()| to "VisibleUnits.cpp".
|
| +VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition)
|
| {
|
| - Position pos = leftVisuallyDistinctCandidate();
|
| - // FIXME: Why can't we move left from the last position in a tree?
|
| + const Position 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();
|
|
|
| VisiblePosition left = VisiblePosition(pos);
|
| - ASSERT(left.deepEquivalent() != m_deepPosition);
|
| + ASSERT(left.deepEquivalent() != visiblePosition.deepEquivalent());
|
|
|
| - return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrBefore(left) : honorEditingBoundaryAtOrAfter(left);
|
| + return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? visiblePosition.honorEditingBoundaryAtOrBefore(left) : visiblePosition.honorEditingBoundaryAtOrAfter(left);
|
| }
|
|
|
| -Position VisiblePosition::rightVisuallyDistinctCandidate() const
|
| +// TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with
|
| +// |rightPositionOf()| to "VisibleUnits.cpp".
|
| +static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
|
| {
|
| - Position p = m_deepPosition;
|
| + const Position deepPosition = visiblePosition.deepEquivalent();
|
| + Position p = deepPosition;
|
| if (p.isNull())
|
| return Position();
|
|
|
| Position downstreamStart = mostForwardCaretPosition(p);
|
| TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode());
|
| + const TextAffinity affinity = visiblePosition.affinity();
|
|
|
| while (true) {
|
| - InlineBoxPosition boxPosition = computeInlineBoxPosition(p, m_affinity, primaryDirection);
|
| + InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, primaryDirection);
|
| InlineBox* box = boxPosition.inlineBox;
|
| int offset = boxPosition.offsetInBox;
|
| if (!box)
|
| - return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
|
| + return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
|
|
| LayoutObject* layoutObject = &box->layoutObject();
|
|
|
| while (true) {
|
| if ((layoutObject->isReplaced() || layoutObject->isBR()) && offset == box->caretLeftmostOffset())
|
| - return box->isLeftToRightDirection() ? nextVisuallyDistinctCandidate(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
|
| + return box->isLeftToRightDirection() ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
|
|
| if (!layoutObject->node()) {
|
| box = box->nextLeafChild();
|
| if (!box)
|
| - return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
|
| + return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
| layoutObject = &box->layoutObject();
|
| offset = box->caretLeftmostOffset();
|
| continue;
|
| @@ -317,11 +326,11 @@ Position VisiblePosition::rightVisuallyDistinctCandidate() const
|
| // Overshot to the right.
|
| InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak();
|
| if (!nextBox) {
|
| - Position positionOnRight = primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
|
| + Position positionOnRight = primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
|
| if (positionOnRight.isNull())
|
| return Position();
|
|
|
| - InlineBox* boxOnRight = computeInlineBoxPosition(positionOnRight, m_affinity, primaryDirection).inlineBox;
|
| + InlineBox* boxOnRight = computeInlineBoxPosition(positionOnRight, affinity, primaryDirection).inlineBox;
|
| if (boxOnRight && boxOnRight->root() == box->root())
|
| return Position();
|
| return positionOnRight;
|
| @@ -419,21 +428,22 @@ Position VisiblePosition::rightVisuallyDistinctCandidate() const
|
| if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
|
| return p;
|
|
|
| - ASSERT(p != m_deepPosition);
|
| + ASSERT(p != deepPosition);
|
| }
|
| }
|
|
|
| -VisiblePosition VisiblePosition::right() const
|
| +// TODO(yosin) We should move |rightPositionOf()| to "VisibleUnits.cpp".
|
| +VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition)
|
| {
|
| - Position pos = rightVisuallyDistinctCandidate();
|
| - // FIXME: Why can't we move left from the last position in a tree?
|
| + const Position pos = rightVisuallyDistinctCandidate(visiblePosition);
|
| + // TODO(yosin) Why can't we move left from the last position in a tree?
|
| if (pos.atStartOfTree() || pos.atEndOfTree())
|
| return VisiblePosition();
|
|
|
| VisiblePosition right = VisiblePosition(pos);
|
| - ASSERT(right.deepEquivalent() != m_deepPosition);
|
| + ASSERT(right.deepEquivalent() != visiblePosition.deepEquivalent());
|
|
|
| - return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrAfter(right) : honorEditingBoundaryAtOrBefore(right);
|
| + return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? visiblePosition.honorEditingBoundaryAtOrAfter(right) : visiblePosition.honorEditingBoundaryAtOrBefore(right);
|
| }
|
|
|
| template <typename Strategy>
|
|
|