Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(722)

Unified Diff: Source/core/editing/VisiblePosition.cpp

Issue 1321033002: Introduce {left,right}PositionOf() for VisiblePosition (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-08-28T21:59:15 Rebase after merge failure Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/editing/VisiblePosition.h ('k') | Source/core/editing/VisibleUnits.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
« no previous file with comments | « Source/core/editing/VisiblePosition.h ('k') | Source/core/editing/VisibleUnits.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698