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

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

Issue 1310953005: Move {left,right}PositionOf() for VisiblePosition to VisibleUnits.cpp (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-09-01T21:47:52 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.h » ('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 a19eb3d65d2bba75f76b452ea62b2dc9340a5652..d293a59e78f61ec8733eb8d6cb153b83b65c48fa 100644
--- a/Source/core/editing/VisiblePosition.cpp
+++ b/Source/core/editing/VisiblePosition.cpp
@@ -64,337 +64,6 @@ VisiblePosition VisiblePosition::createWithoutCanonicalization(const PositionWit
return visiblePosition;
}
-// TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with
-// |rightPositionOf()| to "VisibleUnits.cpp".
-static Position leftVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
-{
- 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, affinity, primaryDirection);
- InlineBox* box = boxPosition.inlineBox;
- int offset = boxPosition.offsetInBox;
- if (!box)
- 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(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
-
- if (!layoutObject->node()) {
- box = box->prevLeafChild();
- if (!box)
- return primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
- layoutObject = &box->layoutObject();
- offset = box->caretRightmostOffset();
- continue;
- }
-
- offset = box->isLeftToRightDirection() ? layoutObject->previousOffset(offset) : layoutObject->nextOffset(offset);
-
- int caretMinOffset = box->caretMinOffset();
- int caretMaxOffset = box->caretMaxOffset();
-
- if (offset > caretMinOffset && offset < caretMaxOffset)
- break;
-
- if (box->isLeftToRightDirection() ? offset < caretMinOffset : offset > caretMaxOffset) {
- // Overshot to the left.
- InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak();
- if (!prevBox) {
- Position positionOnLeft = primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition);
- if (positionOnLeft.isNull())
- return Position();
-
- InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLeft, affinity, primaryDirection).inlineBox;
- if (boxOnLeft && boxOnLeft->root() == box->root())
- return Position();
- return positionOnLeft;
- }
-
- // Reposition at the other logical position corresponding to our edge's visual position and go for another round.
- box = prevBox;
- layoutObject = &box->layoutObject();
- offset = prevBox->caretRightmostOffset();
- continue;
- }
-
- ASSERT(offset == box->caretLeftmostOffset());
-
- unsigned char level = box->bidiLevel();
- InlineBox* prevBox = box->prevLeafChild();
-
- if (box->direction() == primaryDirection) {
- if (!prevBox) {
- InlineBox* logicalStart = 0;
- if (primaryDirection == LTR ? box->root().getLogicalStartBoxWithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) {
- box = logicalStart;
- layoutObject = &box->layoutObject();
- offset = primaryDirection == LTR ? box->caretMinOffset() : box->caretMaxOffset();
- }
- break;
- }
- if (prevBox->bidiLevel() >= level)
- break;
-
- level = prevBox->bidiLevel();
-
- InlineBox* nextBox = box;
- do {
- nextBox = nextBox->nextLeafChild();
- } while (nextBox && nextBox->bidiLevel() > level);
-
- if (nextBox && nextBox->bidiLevel() == level)
- break;
-
- box = prevBox;
- layoutObject = &box->layoutObject();
- offset = box->caretRightmostOffset();
- if (box->direction() == primaryDirection)
- break;
- continue;
- }
-
- while (prevBox && !prevBox->layoutObject().node())
- prevBox = prevBox->prevLeafChild();
-
- if (prevBox) {
- box = prevBox;
- layoutObject = &box->layoutObject();
- offset = box->caretRightmostOffset();
- if (box->bidiLevel() > level) {
- do {
- prevBox = prevBox->prevLeafChild();
- } while (prevBox && prevBox->bidiLevel() > level);
-
- if (!prevBox || prevBox->bidiLevel() < level)
- continue;
- }
- } else {
- // 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)
- break;
- box = nextBox;
- }
- if (box->bidiLevel() == level)
- break;
- level = box->bidiLevel();
- while (InlineBox* prevBox = box->prevLeafChild()) {
- if (prevBox->bidiLevel() < level)
- break;
- box = prevBox;
- }
- if (box->bidiLevel() == level)
- break;
- level = box->bidiLevel();
- }
- layoutObject = &box->layoutObject();
- offset = primaryDirection == LTR ? box->caretMinOffset() : box->caretMaxOffset();
- }
- break;
- }
-
- p = Position::editingPositionOf(layoutObject->node(), offset);
-
- if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
- return p;
-
- ASSERT(p != deepPosition);
- }
-}
-
-// TODO(yosin) We should move |leftPositionOf()| to "VisibleUnits.cpp".
-VisiblePosition leftPositionOf(const VisiblePosition& visiblePosition)
-{
- 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() != visiblePosition.deepEquivalent());
-
- return directionOfEnclosingBlock(left.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrBefore(left, visiblePosition.deepEquivalent()) : honorEditingBoundaryAtOrAfter(left, visiblePosition.deepEquivalent());
-}
-
-// TODO(yosin) We should move |rightVisuallyDistinctCandidate()| with
-// |rightPositionOf()| to "VisibleUnits.cpp".
-static Position rightVisuallyDistinctCandidate(const VisiblePosition& visiblePosition)
-{
- 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, affinity, primaryDirection);
- InlineBox* box = boxPosition.inlineBox;
- int offset = boxPosition.offsetInBox;
- if (!box)
- 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(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
-
- if (!layoutObject->node()) {
- box = box->nextLeafChild();
- if (!box)
- return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
- layoutObject = &box->layoutObject();
- offset = box->caretLeftmostOffset();
- continue;
- }
-
- offset = box->isLeftToRightDirection() ? layoutObject->nextOffset(offset) : layoutObject->previousOffset(offset);
-
- int caretMinOffset = box->caretMinOffset();
- int caretMaxOffset = box->caretMaxOffset();
-
- if (offset > caretMinOffset && offset < caretMaxOffset)
- break;
-
- if (box->isLeftToRightDirection() ? offset > caretMaxOffset : offset < caretMinOffset) {
- // Overshot to the right.
- InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak();
- if (!nextBox) {
- Position positionOnRight = primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition);
- if (positionOnRight.isNull())
- return Position();
-
- InlineBox* boxOnRight = computeInlineBoxPosition(positionOnRight, affinity, primaryDirection).inlineBox;
- if (boxOnRight && boxOnRight->root() == box->root())
- return Position();
- return positionOnRight;
- }
-
- // Reposition at the other logical position corresponding to our edge's visual position and go for another round.
- box = nextBox;
- layoutObject = &box->layoutObject();
- offset = nextBox->caretLeftmostOffset();
- continue;
- }
-
- ASSERT(offset == box->caretRightmostOffset());
-
- unsigned char level = box->bidiLevel();
- InlineBox* nextBox = box->nextLeafChild();
-
- if (box->direction() == primaryDirection) {
- if (!nextBox) {
- InlineBox* logicalEnd = 0;
- if (primaryDirection == LTR ? box->root().getLogicalEndBoxWithNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) {
- box = logicalEnd;
- layoutObject = &box->layoutObject();
- offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset();
- }
- break;
- }
-
- if (nextBox->bidiLevel() >= level)
- break;
-
- level = nextBox->bidiLevel();
-
- InlineBox* prevBox = box;
- do {
- prevBox = prevBox->prevLeafChild();
- } while (prevBox && prevBox->bidiLevel() > level);
-
- if (prevBox && prevBox->bidiLevel() == level) // For example, abc FED 123 ^ CBA
- break;
-
- // For example, abc 123 ^ CBA or 123 ^ CBA abc
- box = nextBox;
- layoutObject = &box->layoutObject();
- offset = box->caretLeftmostOffset();
- if (box->direction() == primaryDirection)
- break;
- continue;
- }
-
- while (nextBox && !nextBox->layoutObject().node())
- nextBox = nextBox->nextLeafChild();
-
- if (nextBox) {
- box = nextBox;
- layoutObject = &box->layoutObject();
- offset = box->caretLeftmostOffset();
-
- if (box->bidiLevel() > level) {
- do {
- nextBox = nextBox->nextLeafChild();
- } while (nextBox && nextBox->bidiLevel() > level);
-
- if (!nextBox || nextBox->bidiLevel() < level)
- continue;
- }
- } else {
- // 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)
- break;
- box = prevBox;
- }
- if (box->bidiLevel() == level)
- break;
- level = box->bidiLevel();
- while (InlineBox* nextBox = box->nextLeafChild()) {
- if (nextBox->bidiLevel() < level)
- break;
- box = nextBox;
- }
- if (box->bidiLevel() == level)
- break;
- level = box->bidiLevel();
- }
- layoutObject = &box->layoutObject();
- offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset();
- }
- break;
- }
-
- p = Position::editingPositionOf(layoutObject->node(), offset);
-
- if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) != downstreamStart) || p.atStartOfTree() || p.atEndOfTree())
- return p;
-
- ASSERT(p != deepPosition);
- }
-}
-
-// TODO(yosin) We should move |rightPositionOf()| to "VisibleUnits.cpp".
-VisiblePosition rightPositionOf(const VisiblePosition& visiblePosition)
-{
- 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() != visiblePosition.deepEquivalent());
-
- return directionOfEnclosingBlock(right.deepEquivalent()) == LTR ? honorEditingBoundaryAtOrAfter(right, visiblePosition.deepEquivalent()) : honorEditingBoundaryAtOrBefore(right, visiblePosition.deepEquivalent());
-}
-
template <typename Strategy>
PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBeforeAlgorithm(const PositionWithAffinityTemplate<Strategy>& pos, const PositionAlgorithm<Strategy>& anchor)
{
« no previous file with comments | « Source/core/editing/VisiblePosition.h ('k') | Source/core/editing/VisibleUnits.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698