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

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

Issue 2363363002: Add VisiblePosition validity checks to VisibleUnits.cpp (Closed)
Patch Set: Created 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/editing/VisibleUnits.cpp
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
index 7691d8695260de48c5c590456107a94f85faddcc..d8ea2b43cd52d55eeedb0e71ccada14b7808ea85 100644
--- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
@@ -201,13 +201,14 @@ static PositionWithAffinityTemplate<Strategy> honorEditingBoundaryAtOrBefore(con
template <typename Strategy>
static VisiblePositionTemplate<Strategy> honorEditingBoundaryAtOrBefore(const VisiblePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor)
{
- DCHECK(pos.isValid());
+ DCHECK(pos.isValid()) << pos;
return createVisiblePosition(honorEditingBoundaryAtOrBefore(pos.toPositionWithAffinity(), anchor));
}
template <typename Strategy>
static VisiblePositionTemplate<Strategy> honorEditingBoundaryAtOrAfter(const VisiblePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor)
{
+ DCHECK(pos.isValid()) << pos;
if (pos.isNull())
return pos;
@@ -314,7 +315,7 @@ static Node* nextLeafWithSameEditability(Node* node, EditableType editableType =
// FIXME: consolidate with code in previousLinePosition.
static Position previousRootInlineBoxCandidatePosition(Node* node, const VisiblePosition& visiblePosition, EditableType editableType)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
ContainerNode* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent(), editableType);
Node* previousNode = previousLeafWithSameEditability(node, editableType);
@@ -338,7 +339,7 @@ static Position previousRootInlineBoxCandidatePosition(Node* node, const Visible
static Position nextRootInlineBoxCandidatePosition(Node* node, const VisiblePosition& visiblePosition, EditableType editableType)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
ContainerNode* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent(), editableType);
Node* nextNode = nextLeafWithSameEditability(node, editableType);
while (nextNode && (!nextNode->layoutObject() || inSameLine(createVisiblePosition(firstPositionInOrBeforeNode(nextNode)), visiblePosition)))
@@ -442,6 +443,7 @@ int CachedLogicallyOrderedLeafBoxes::boxIndexInLeaves(const InlineTextBox* box)
static const InlineTextBox* logicallyPreviousBox(const VisiblePosition& visiblePosition, const InlineTextBox* textBox,
bool& previousBoxInDifferentBlock, CachedLogicallyOrderedLeafBoxes& leafBoxes)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const InlineBox* startBox = textBox;
const InlineTextBox* previousBox = leafBoxes.previousTextBox(&startBox->root(), textBox);
@@ -483,6 +485,7 @@ static const InlineTextBox* logicallyPreviousBox(const VisiblePosition& visibleP
static const InlineTextBox* logicallyNextBox(const VisiblePosition& visiblePosition, const InlineTextBox* textBox,
bool& nextBoxInDifferentBlock, CachedLogicallyOrderedLeafBoxes& leafBoxes)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const InlineBox* startBox = textBox;
const InlineTextBox* nextBox = leafBoxes.nextTextBox(&startBox->root(), textBox);
@@ -523,6 +526,7 @@ static const InlineTextBox* logicallyNextBox(const VisiblePosition& visiblePosit
static TextBreakIterator* wordBreakIteratorForMinOffsetBoundary(const VisiblePosition& visiblePosition, const InlineTextBox* textBox,
int& previousBoxLength, bool& previousBoxInDifferentBlock, Vector<UChar, 1024>& string, CachedLogicallyOrderedLeafBoxes& leafBoxes)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
previousBoxInDifferentBlock = false;
// FIXME: Handle the case when we don't have an inline text box.
@@ -544,6 +548,7 @@ static TextBreakIterator* wordBreakIteratorForMinOffsetBoundary(const VisiblePos
static TextBreakIterator* wordBreakIteratorForMaxOffsetBoundary(const VisiblePosition& visiblePosition, const InlineTextBox* textBox,
bool& nextBoxInDifferentBlock, Vector<UChar, 1024>& string, CachedLogicallyOrderedLeafBoxes& leafBoxes)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
nextBoxInDifferentBlock = false;
// FIXME: Handle the case when we don't have an inline text box.
@@ -583,6 +588,7 @@ enum CursorMovementDirection { MoveLeft, MoveRight };
static VisiblePosition visualWordPosition(const VisiblePosition& visiblePosition, CursorMovementDirection direction,
bool skipsSpaceWhenMovingRight)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
if (visiblePosition.isNull())
return VisiblePosition();
@@ -653,6 +659,7 @@ static VisiblePosition visualWordPosition(const VisiblePosition& visiblePosition
VisiblePosition leftWordPosition(const VisiblePosition& visiblePosition, bool skipsSpaceWhenMovingRight)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
VisiblePosition leftWordBreak = visualWordPosition(visiblePosition, MoveLeft, skipsSpaceWhenMovingRight);
leftWordBreak = honorEditingBoundaryAtOrBefore(leftWordBreak, visiblePosition.deepEquivalent());
@@ -666,6 +673,7 @@ VisiblePosition leftWordPosition(const VisiblePosition& visiblePosition, bool sk
VisiblePosition rightWordPosition(const VisiblePosition& visiblePosition, bool skipsSpaceWhenMovingRight)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
VisiblePosition rightWordBreak = visualWordPosition(visiblePosition, MoveRight, skipsSpaceWhenMovingRight);
rightWordBreak = honorEditingBoundaryAtOrBefore(rightWordBreak, visiblePosition.deepEquivalent());
@@ -709,7 +717,7 @@ typedef unsigned (*BoundarySearchFunction)(const UChar*, unsigned length, unsign
template <typename Strategy>
static VisiblePositionTemplate<Strategy> previousBoundary(const VisiblePositionTemplate<Strategy>& c, BoundarySearchFunction searchFunction)
{
- DCHECK(c.isValid());
+ DCHECK(c.isValid()) << c;
const PositionTemplate<Strategy> pos = c.deepEquivalent();
Node* boundary = parentEditingBoundary(pos);
if (!boundary)
@@ -795,7 +803,7 @@ static VisiblePositionTemplate<Strategy> previousBoundary(const VisiblePositionT
template <typename Strategy>
static VisiblePositionTemplate<Strategy> nextBoundary(const VisiblePositionTemplate<Strategy>& c, BoundarySearchFunction searchFunction)
{
- DCHECK(c.isValid());
+ DCHECK(c.isValid()) << c;
PositionTemplate<Strategy> pos = c.deepEquivalent();
Node* boundary = parentEditingBoundary(pos);
if (!boundary)
@@ -910,6 +918,7 @@ static unsigned startWordBoundary(const UChar* characters, unsigned length, unsi
template <typename Strategy>
static VisiblePositionTemplate<Strategy> startOfWordAlgorithm(const VisiblePositionTemplate<Strategy>& c, EWordSide side)
{
+ DCHECK(c.isValid()) << c;
// TODO(yosin) This returns a null VP for c at the start of the document
// and |side| == |LeftWordIfOnBoundary|
VisiblePositionTemplate<Strategy> p = c;
@@ -949,6 +958,7 @@ static unsigned endWordBoundary(const UChar* characters, unsigned length, unsign
template <typename Strategy>
static VisiblePositionTemplate<Strategy> endOfWordAlgorithm(const VisiblePositionTemplate<Strategy>& c, EWordSide side)
{
+ DCHECK(c.isValid()) << c;
VisiblePositionTemplate<Strategy> p = c;
if (side == LeftWordIfOnBoundary) {
if (isStartOfParagraph(c))
@@ -986,6 +996,7 @@ static unsigned previousWordPositionBoundary(const UChar* characters, unsigned l
VisiblePosition previousWordPosition(const VisiblePosition& c)
{
+ DCHECK(c.isValid()) << c;
VisiblePosition prev = previousBoundary(c, previousWordPositionBoundary);
return honorEditingBoundaryAtOrBefore(prev, c.deepEquivalent());
}
@@ -1002,6 +1013,7 @@ static unsigned nextWordPositionBoundary(const UChar* characters, unsigned lengt
VisiblePosition nextWordPosition(const VisiblePosition& c)
{
+ DCHECK(c.isValid()) << c;
VisiblePosition next = nextBoundary(c, nextWordPositionBoundary);
return honorEditingBoundaryAtOrAfter(next, c.deepEquivalent());
}
@@ -1073,13 +1085,13 @@ static PositionInFlatTreeWithAffinity startOfLine(const PositionInFlatTreeWithAf
// FIXME: Rename this function to reflect the fact it ignores bidi levels.
VisiblePosition startOfLine(const VisiblePosition& currentPosition)
{
- DCHECK(currentPosition.isValid());
+ DCHECK(currentPosition.isValid()) << currentPosition;
return createVisiblePosition(startOfLine(currentPosition.toPositionWithAffinity()));
}
VisiblePositionInFlatTree startOfLine(const VisiblePositionInFlatTree& currentPosition)
{
- DCHECK(currentPosition.isValid());
+ DCHECK(currentPosition.isValid()) << currentPosition;
return createVisiblePosition(startOfLine(currentPosition.toPositionWithAffinity()));
}
@@ -1100,20 +1112,20 @@ static PositionWithAffinityTemplate<Strategy> logicalStartOfLineAlgorithm(const
VisiblePosition logicalStartOfLine(const VisiblePosition& currentPosition)
{
- DCHECK(currentPosition.isValid());
+ DCHECK(currentPosition.isValid()) << currentPosition;
return createVisiblePosition(logicalStartOfLineAlgorithm<EditingStrategy>(currentPosition.toPositionWithAffinity()));
}
VisiblePositionInFlatTree logicalStartOfLine(const VisiblePositionInFlatTree& currentPosition)
{
- DCHECK(currentPosition.isValid());
+ DCHECK(currentPosition.isValid()) << currentPosition;
return createVisiblePosition(logicalStartOfLineAlgorithm<EditingInFlatTreeStrategy>(currentPosition.toPositionWithAffinity()));
}
template <typename Strategy>
static VisiblePositionTemplate<Strategy> endPositionForLine(const VisiblePositionTemplate<Strategy>& c, LineEndpointComputationMode mode)
{
- DCHECK(c.isValid());
+ DCHECK(c.isValid()) << c;
if (c.isNull())
return VisiblePositionTemplate<Strategy>();
@@ -1170,6 +1182,7 @@ static VisiblePositionTemplate<Strategy> endPositionForLine(const VisiblePositio
template <typename Strategy>
static VisiblePositionTemplate<Strategy> endOfLineAlgorithm(const VisiblePositionTemplate<Strategy>& currentPosition)
{
+ DCHECK(currentPosition.isValid()) << currentPosition;
// TODO(yosin) this is the current behavior that might need to be fixed.
// Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail.
VisiblePositionTemplate<Strategy> visPos = endPositionForLine(currentPosition, UseInlineBoxOrdering);
@@ -1206,13 +1219,15 @@ VisiblePositionInFlatTree endOfLine(const VisiblePositionInFlatTree& currentPosi
template <typename Strategy>
static bool inSameLogicalLine(const VisiblePositionTemplate<Strategy>& a, const VisiblePositionTemplate<Strategy>& b)
{
+ DCHECK(a.isValid()) << a;
+ DCHECK(b.isValid()) << b;
return a.isNotNull() && logicalStartOfLine(a).deepEquivalent() == logicalStartOfLine(b).deepEquivalent();
}
template <typename Strategy>
VisiblePositionTemplate<Strategy> logicalEndOfLineAlgorithm(const VisiblePositionTemplate<Strategy>& currentPosition)
{
- DCHECK(currentPosition.isValid());
+ DCHECK(currentPosition.isValid()) << currentPosition;
// TODO(yosin) this is the current behavior that might need to be fixed.
// Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail.
VisiblePositionTemplate<Strategy> visPos = endPositionForLine(currentPosition, UseLogicalOrdering);
@@ -1276,17 +1291,22 @@ bool inSameLine(const PositionInFlatTreeWithAffinity& position1, const PositionI
bool inSameLine(const VisiblePosition& position1, const VisiblePosition& position2)
{
+ DCHECK(position1.isValid()) << position1;
+ DCHECK(position2.isValid()) << position2;
return inSameLine(position1.toPositionWithAffinity(), position2.toPositionWithAffinity());
}
bool inSameLine(const VisiblePositionInFlatTree& position1, const VisiblePositionInFlatTree& position2)
{
+ DCHECK(position1.isValid()) << position1;
+ DCHECK(position2.isValid()) << position2;
return inSameLine(position1.toPositionWithAffinity(), position2.toPositionWithAffinity());
}
template <typename Strategy>
bool isStartOfLineAlgorithm(const VisiblePositionTemplate<Strategy>& p)
{
+ DCHECK(p.isValid()) << p;
return p.isNotNull() && p.deepEquivalent() == startOfLine(p).deepEquivalent();
}
@@ -1303,6 +1323,7 @@ bool isStartOfLine(const VisiblePositionInFlatTree& p)
template <typename Strategy>
bool isEndOfLineAlgorithm(const VisiblePositionTemplate<Strategy>& p)
{
+ DCHECK(p.isValid()) << p;
return p.isNotNull() && p.deepEquivalent() == endOfLine(p).deepEquivalent();
}
@@ -1319,6 +1340,7 @@ bool isEndOfLine(const VisiblePositionInFlatTree& p)
template <typename Strategy>
static bool isLogicalEndOfLineAlgorithm(const VisiblePositionTemplate<Strategy>& p)
{
+ DCHECK(p.isValid()) << p;
return p.isNotNull() && p.deepEquivalent() == logicalEndOfLine(p).deepEquivalent();
}
@@ -1348,7 +1370,7 @@ static inline LayoutPoint absoluteLineDirectionPointToLocalPointInBlock(RootInli
VisiblePosition previousLinePosition(const VisiblePosition& visiblePosition, LayoutUnit lineDirectionPoint, EditableType editableType)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Position p = visiblePosition.deepEquivalent();
Node* node = p.anchorNode();
@@ -1401,7 +1423,7 @@ VisiblePosition previousLinePosition(const VisiblePosition& visiblePosition, Lay
VisiblePosition nextLinePosition(const VisiblePosition& visiblePosition, LayoutUnit lineDirectionPoint, EditableType editableType)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Position p = visiblePosition.deepEquivalent();
Node* node = p.anchorNode();
@@ -1467,6 +1489,7 @@ static unsigned startSentenceBoundary(const UChar* characters, unsigned length,
template <typename Strategy>
static VisiblePositionTemplate<Strategy> startOfSentenceAlgorithm(const VisiblePositionTemplate<Strategy>& c)
{
+ DCHECK(c.isValid()) << c;
return previousBoundary(c, startSentenceBoundary);
}
@@ -1491,6 +1514,7 @@ static unsigned endSentenceBoundary(const UChar* characters, unsigned length, un
template <typename Strategy>
static VisiblePositionTemplate<Strategy> endOfSentenceAlgorithm(const VisiblePositionTemplate<Strategy>& c)
{
+ DCHECK(c.isValid()) << c;
return nextBoundary(c, endSentenceBoundary);
}
@@ -1514,6 +1538,7 @@ static unsigned previousSentencePositionBoundary(const UChar* characters, unsign
VisiblePosition previousSentencePosition(const VisiblePosition& c)
{
+ DCHECK(c.isValid()) << c;
VisiblePosition prev = previousBoundary(c, previousSentencePositionBoundary);
return honorEditingBoundaryAtOrBefore(prev, c.deepEquivalent());
}
@@ -1528,6 +1553,7 @@ static unsigned nextSentencePositionBoundary(const UChar* characters, unsigned l
VisiblePosition nextSentencePosition(const VisiblePosition& c)
{
+ DCHECK(c.isValid()) << c;
VisiblePosition next = nextBoundary(c, nextSentencePositionBoundary);
return honorEditingBoundaryAtOrAfter(next, c.deepEquivalent());
}
@@ -1769,6 +1795,7 @@ bool isEndOfParagraph(const VisiblePositionInFlatTree& pos, EditingBoundaryCross
VisiblePosition previousParagraphPosition(const VisiblePosition& p, LayoutUnit x)
{
+ DCHECK(p.isValid()) << p;
VisiblePosition pos = p;
do {
VisiblePosition n = previousLinePosition(pos, x);
@@ -1781,6 +1808,7 @@ VisiblePosition previousParagraphPosition(const VisiblePosition& p, LayoutUnit x
VisiblePosition nextParagraphPosition(const VisiblePosition& p, LayoutUnit x)
{
+ DCHECK(p.isValid()) << p;
VisiblePosition pos = p;
do {
VisiblePosition n = nextLinePosition(pos, x);
@@ -1795,6 +1823,7 @@ VisiblePosition nextParagraphPosition(const VisiblePosition& p, LayoutUnit x)
VisiblePosition startOfBlock(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Position position = visiblePosition.deepEquivalent();
Element* startBlock = position.computeContainerNode() ? enclosingBlock(position.computeContainerNode(), rule) : 0;
return startBlock ? VisiblePosition::firstPositionInNode(startBlock) : VisiblePosition();
@@ -1802,6 +1831,7 @@ VisiblePosition startOfBlock(const VisiblePosition& visiblePosition, EditingBoun
VisiblePosition endOfBlock(const VisiblePosition& visiblePosition, EditingBoundaryCrossingRule rule)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Position position = visiblePosition.deepEquivalent();
Element* endBlock = position.computeContainerNode() ? enclosingBlock(position.computeContainerNode(), rule) : 0;
return endBlock ? VisiblePosition::lastPositionInNode(endBlock) : VisiblePosition();
@@ -1809,16 +1839,20 @@ VisiblePosition endOfBlock(const VisiblePosition& visiblePosition, EditingBounda
bool inSameBlock(const VisiblePosition& a, const VisiblePosition& b)
{
+ // TODO(xiaochengh): Ensure that this function is called with valid |a| and
+ // |b|, and add |DCHECK(a.isValid())| and |DCHECK(b.isValid())|
return !a.isNull() && enclosingBlock(a.deepEquivalent().computeContainerNode()) == enclosingBlock(b.deepEquivalent().computeContainerNode());
}
bool isStartOfBlock(const VisiblePosition& pos)
{
+ DCHECK(pos.isValid()) << pos;
return pos.isNotNull() && pos.deepEquivalent() == startOfBlock(pos, CanCrossEditingBoundary).deepEquivalent();
}
bool isEndOfBlock(const VisiblePosition& pos)
{
+ DCHECK(pos.isValid()) << pos;
return pos.isNotNull() && pos.deepEquivalent() == endOfBlock(pos, CanCrossEditingBoundary).deepEquivalent();
}
@@ -1827,7 +1861,7 @@ bool isEndOfBlock(const VisiblePosition& pos)
template <typename Strategy>
static VisiblePositionTemplate<Strategy> startOfDocumentAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Node* node = visiblePosition.deepEquivalent().anchorNode();
if (!node || !node->document().documentElement())
return VisiblePositionTemplate<Strategy>();
@@ -1848,7 +1882,7 @@ VisiblePositionInFlatTree startOfDocument(const VisiblePositionInFlatTree& c)
template <typename Strategy>
static VisiblePositionTemplate<Strategy> endOfDocumentAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
Node* node = visiblePosition.deepEquivalent().anchorNode();
if (!node || !node->document().documentElement())
return VisiblePositionTemplate<Strategy>();
@@ -1869,11 +1903,13 @@ VisiblePositionInFlatTree endOfDocument(const VisiblePositionInFlatTree& c)
bool isStartOfDocument(const VisiblePosition& p)
{
+ DCHECK(p.isValid()) << p;
return p.isNotNull() && previousPositionOf(p, CanCrossEditingBoundary).isNull();
}
bool isEndOfDocument(const VisiblePosition& p)
{
+ DCHECK(p.isValid()) << p;
return p.isNotNull() && nextPositionOf(p, CanCrossEditingBoundary).isNull();
}
@@ -1881,6 +1917,7 @@ bool isEndOfDocument(const VisiblePosition& p)
VisiblePosition startOfEditableContent(const VisiblePosition& visiblePosition)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
ContainerNode* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent());
if (!highestRoot)
return VisiblePosition();
@@ -1890,6 +1927,7 @@ VisiblePosition startOfEditableContent(const VisiblePosition& visiblePosition)
VisiblePosition endOfEditableContent(const VisiblePosition& visiblePosition)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
ContainerNode* highestRoot = highestEditableRoot(visiblePosition.deepEquivalent());
if (!highestRoot)
return VisiblePosition();
@@ -1899,6 +1937,7 @@ VisiblePosition endOfEditableContent(const VisiblePosition& visiblePosition)
bool isEndOfEditableOrNonEditableContent(const VisiblePosition& position)
{
+ DCHECK(position.isValid()) << position;
return position.isNotNull() && nextPositionOf(position).isNull();
}
@@ -1906,6 +1945,7 @@ bool isEndOfEditableOrNonEditableContent(const VisiblePosition& position)
// this function does, e.g. |isLastVisiblePositionOrEndOfInnerEditor()|.
bool isEndOfEditableOrNonEditableContent(const VisiblePositionInFlatTree& position)
{
+ DCHECK(position.isValid()) << position;
if (position.isNull())
return false;
const VisiblePositionInFlatTree nextPosition = nextPositionOf(position);
@@ -1921,11 +1961,13 @@ bool isEndOfEditableOrNonEditableContent(const VisiblePositionInFlatTree& positi
VisiblePosition leftBoundaryOfLine(const VisiblePosition& c, TextDirection direction)
{
+ DCHECK(c.isValid()) << c;
return direction == LTR ? logicalStartOfLine(c) : logicalEndOfLine(c);
}
VisiblePosition rightBoundaryOfLine(const VisiblePosition& c, TextDirection direction)
{
+ DCHECK(c.isValid()) << c;
return direction == LTR ? logicalEndOfLine(c) : logicalStartOfLine(c);
}
@@ -2187,11 +2229,13 @@ InlineBoxPosition computeInlineBoxPosition(const PositionInFlatTree& position, T
InlineBoxPosition computeInlineBoxPosition(const VisiblePosition& position)
{
+ DCHECK(position.isValid()) << position;
return computeInlineBoxPosition(position.deepEquivalent(), position.affinity());
}
InlineBoxPosition computeInlineBoxPosition(const VisiblePositionInFlatTree& position)
{
+ DCHECK(position.isValid()) << position;
return computeInlineBoxPosition(position.deepEquivalent(), position.affinity());
}
@@ -2808,6 +2852,8 @@ bool isVisuallyEquivalentCandidate(const PositionInFlatTree& position)
template <typename Strategy>
static IntRect absoluteCaretBoundsOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
+ // TODO(xiaochengh): Ensure that this function is called with a valid
+ // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|;
LayoutObject* layoutObject;
LayoutRect localRect = localCaretRectOfPosition(visiblePosition.toPositionWithAffinity(), layoutObject);
if (localRect.isEmpty() || !layoutObject)
@@ -2829,7 +2875,7 @@ IntRect absoluteCaretBoundsOf(const VisiblePositionInFlatTree& visiblePosition)
template <typename Strategy>
static VisiblePositionTemplate<Strategy> skipToEndOfEditingBoundary(const VisiblePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor)
{
- DCHECK(pos.isValid());
+ DCHECK(pos.isValid()) << pos;
if (pos.isNull())
return pos;
@@ -2854,6 +2900,8 @@ static VisiblePositionTemplate<Strategy> skipToEndOfEditingBoundary(const Visibl
template <typename Strategy>
static UChar32 characterAfterAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
+ // TODO(xiaochengh): Ensure that this function is called with a valid
+ // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|
// We canonicalize to the first of two equivalent candidates, but the second
// of the two candidates is the one that will be inside the text node
// containing the character after this visible position.
@@ -2885,6 +2933,8 @@ UChar32 characterAfter(const VisiblePositionInFlatTree& visiblePosition)
template <typename Strategy>
static UChar32 characterBeforeAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
+ // TODO(xiaochengh): Ensure that this function is called with a valid
+ // |visiblePosition|, and add |DCHECK(visiblePosition.isValid())|
return characterAfter(previousPositionOf(visiblePosition));
}
@@ -2901,6 +2951,7 @@ UChar32 characterBefore(const VisiblePositionInFlatTree& visiblePosition)
template <typename Strategy>
static PositionTemplate<Strategy> leftVisuallyDistinctCandidate(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const PositionTemplate<Strategy> deepPosition = visiblePosition.deepEquivalent();
PositionTemplate<Strategy> p = deepPosition;
@@ -3053,7 +3104,7 @@ static PositionTemplate<Strategy> leftVisuallyDistinctCandidate(const VisiblePos
template <typename Strategy>
VisiblePositionTemplate<Strategy> leftPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const PositionTemplate<Strategy> pos = leftVisuallyDistinctCandidate(visiblePosition);
// TODO(yosin) Why can't we move left from the last position in a tree?
if (pos.atStartOfTree() || pos.atEndOfTree())
@@ -3078,6 +3129,7 @@ VisiblePositionInFlatTree leftPositionOf(const VisiblePositionInFlatTree& visibl
template <typename Strategy>
static PositionTemplate<Strategy> rightVisuallyDistinctCandidate(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const PositionTemplate<Strategy> deepPosition = visiblePosition.deepEquivalent();
PositionTemplate<Strategy> p = deepPosition;
if (p.isNull())
@@ -3232,7 +3284,7 @@ static PositionTemplate<Strategy> rightVisuallyDistinctCandidate(const VisiblePo
template <typename Strategy>
static VisiblePositionTemplate<Strategy> rightPositionOfAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition)
{
- DCHECK(visiblePosition.isValid());
+ DCHECK(visiblePosition.isValid()) << visiblePosition;
const PositionTemplate<Strategy> pos = rightVisuallyDistinctCandidate(visiblePosition);
// FIXME: Why can't we move left from the last position in a tree?
if (pos.atStartOfTree() || pos.atEndOfTree())
@@ -3286,7 +3338,7 @@ VisiblePositionInFlatTree nextPositionOf(const VisiblePositionInFlatTree& visibl
template <typename Strategy>
static VisiblePositionTemplate<Strategy> skipToStartOfEditingBoundary(const VisiblePositionTemplate<Strategy>& pos, const PositionTemplate<Strategy>& anchor)
{
- DCHECK(pos.isValid());
+ DCHECK(pos.isValid()) << pos;
if (pos.isNull())
return pos;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698