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

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

Issue 1326313002: Introduce composed tree version of leftPositionOf() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 2015-09-08T16:21:19 Created 5 years, 3 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
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();

Powered by Google App Engine
This is Rietveld 408576698