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

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

Issue 1409073004: Return EphemeralRange from Editor::findRangeOfString. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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: third_party/WebKit/Source/core/editing/Editor.cpp
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp
index 7a4237d403016eafaa67be28ab835cdf0c97dda9..d7adb368e311025d2fcb12a65c8d815a60ced601 100644
--- a/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -1145,16 +1145,16 @@ void Editor::computeAndSetTypingStyle(StylePropertySet* style, EditAction editin
bool Editor::findString(const String& target, FindOptions options)
{
- VisibleSelection selection = frame().selection().selection();
-
- // TODO(yosin) We should make |findRangeOfString()| to return
- // |EphemeralRange| rather than|Range| object.
- RefPtrWillBeRawPtr<Range> resultRange = findRangeOfString(target, EphemeralRange(selection.start(), selection.end()), static_cast<FindOptions>(options | FindAPICall));
yosin_UTC9 2015/10/22 02:28:27 Just FYI. We have usage counters - https://www.ch
+ const VisibleSelection& selection = frame().selection().selection();
+ const EphemeralRange& resultRange = findRangeOfString(
yosin_UTC9 2015/10/22 02:28:27 Remove |&|. Does clang allow this?
Andrey Kraynov 2015/10/22 09:53:20 It's a valid C++ code for all compilers ;) http:/
+ target,
+ EphemeralRange(selection.start(), selection.end()),
+ static_cast<FindOptions>(options | FindAPICall));
- if (!resultRange)
+ if (resultRange.isCollapsed())
return false;
- frame().selection().setSelection(VisibleSelection(EphemeralRange(resultRange.get())));
+ frame().selection().setSelection(VisibleSelection(resultRange));
frame().selection().revealSelection();
return true;
}
@@ -1162,7 +1162,7 @@ bool Editor::findString(const String& target, FindOptions options)
template <typename Strategy>
static PassRefPtrWillBeRawPtr<Range> findStringAndScrollToVisibleAlgorithm(Editor& editor, const String& target, const EphemeralRangeTemplate<Strategy>& previousMatch, FindOptions options)
{
- RefPtrWillBeRawPtr<Range> nextMatch = editor.findRangeOfString(target, previousMatch, options);
+ RefPtrWillBeRawPtr<Range> nextMatch = createRange(editor.findRangeOfString(target, previousMatch, options));
yosin_UTC9 2015/10/22 02:28:28 Let's return EphmeralRange here and ask call to ha
Andrey Kraynov 2015/10/30 18:24:25 Done.
if (!nextMatch)
return nullptr;
@@ -1179,24 +1179,43 @@ PassRefPtrWillBeRawPtr<Range> Editor::findStringAndScrollToVisible(const String&
return findStringAndScrollToVisibleAlgorithm<EditingStrategy>(*this, target, EphemeralRange(range), options);
}
-// TODO(yosin) We should return |EphemeralRange| rather than |Range|. We use
-// |Range| object for checking whether start and end position crossing shadow
-// boundaries, however we can do it without |Range| object.
+// This function checks whether start and end position of the |range|
+// crossing shadow boundaries.
+// It should be equivalent to Range::create(ephemeralRange)->collapsed().
template <typename Strategy>
-static PassRefPtrWillBeRawPtr<Range> findStringBetweenPositions(const String& target, const EphemeralRangeTemplate<Strategy>& referenceRange, FindOptions options)
+static bool rangeBoundariesAreValid(const EphemeralRangeTemplate<Strategy>& range)
{
- EphemeralRangeTemplate<Strategy> searchRange(referenceRange);
+ const Node* endRootContainer = range.endPosition().computeContainerNode();
+ const Node* startRootContainer = range.startPosition().computeContainerNode();
+ if (!startRootContainer || !endRootContainer)
+ return false;
+
+ while (endRootContainer->parentNode())
yosin_UTC9 2015/10/22 02:28:28 Can we use Node::commonAncestor()? Why not positi
Andrey Kraynov 2015/10/22 09:53:20 I looked at the checkForDifferentRootContainer() f
yosin_UTC9 2015/10/23 01:52:50 I have no idea when we have a range which start an
Andrey Kraynov 2015/10/30 18:24:25 Done.
+ endRootContainer = endRootContainer->parentNode();
+
+ while (startRootContainer->parentNode())
+ startRootContainer = startRootContainer->parentNode();
+
+ return startRootContainer == endRootContainer
+ && (range.startPosition().compareTo(range.endPosition()) <= 0);
+}
+
+template <typename Strategy>
+static EphemeralRangeTemplate<Strategy> findStringBetweenPositions(const String& target, const EphemeralRangeTemplate<Strategy>& referenceRange, FindOptions options)
+{
+ using EphemeralRangeT = EphemeralRangeTemplate<Strategy>;
yosin_UTC9 2015/10/22 02:28:27 We don't have rule about "using alias". In our exp
Andrey Kraynov 2015/10/22 09:53:20 OK, I'll revert these changes. But sometimes it's
yosin_UTC9 2015/10/23 01:52:50 You're not alone. I think so too. I'm voting to us
Andrey Kraynov 2015/10/30 18:24:25 Done.
+
+ EphemeralRangeT searchRange(referenceRange);
bool forward = !(options & Backwards);
while (true) {
- EphemeralRangeTemplate<Strategy> resultRange = findPlainText(searchRange, target, options);
+ const EphemeralRangeT& resultRange = findPlainText(searchRange, target, options);
yosin_UTC9 2015/10/22 02:28:27 Remove |&|. I think returned object lives on stack
if (resultRange.isCollapsed())
- return nullptr;
+ return EphemeralRangeT();
- RefPtrWillBeRawPtr<Range> rangeObject = Range::create(resultRange.document(), toPositionInDOMTree(resultRange.startPosition()), toPositionInDOMTree(resultRange.endPosition()));
- if (!rangeObject->collapsed())
- return rangeObject.release();
+ if (rangeBoundariesAreValid(resultRange))
+ return resultRange;
// Found text spans over multiple TreeScopes. Since it's impossible to
// return such section as a Range, we skip this match and seek for the
@@ -1205,72 +1224,74 @@ static PassRefPtrWillBeRawPtr<Range> findStringBetweenPositions(const String& ta
if (forward) {
// TODO(yosin) We should use |PositionMoveType::Character|
// for |nextPositionOf()|.
- searchRange = EphemeralRangeTemplate<Strategy>(nextPositionOf(resultRange.startPosition(), PositionMoveType::CodePoint), searchRange.endPosition());
+ searchRange = EphemeralRangeT(nextPositionOf(resultRange.startPosition(), PositionMoveType::CodePoint), searchRange.endPosition());
} else {
// TODO(yosin) We should use |PositionMoveType::Character|
// for |previousPositionOf()|.
- searchRange = EphemeralRangeTemplate<Strategy>(searchRange.startPosition(), previousPositionOf(resultRange.endPosition(), PositionMoveType::CodePoint));
+ searchRange = EphemeralRangeT(searchRange.startPosition(), previousPositionOf(resultRange.endPosition(), PositionMoveType::CodePoint));
}
}
ASSERT_NOT_REACHED();
- return nullptr;
+ return EphemeralRangeT();
}
template <typename Strategy>
-static PassRefPtrWillBeRawPtr<Range> findRangeOfStringAlgorithm(Document& document, const String& target, const EphemeralRangeTemplate<Strategy>& referenceRange, FindOptions options)
+static EphemeralRangeTemplate<Strategy> findRangeOfStringAlgorithm(const String& target, const EphemeralRangeTemplate<Strategy>& referenceRange, FindOptions options)
{
+ using EphemeralRangeT = EphemeralRangeTemplate<Strategy>;
+
if (target.isEmpty())
- return nullptr;
+ return EphemeralRangeT();
// Start from an edge of the reference range. Which edge is used depends on
// whether we're searching forward or backward, and whether startInSelection
// is set.
- EphemeralRangeTemplate<Strategy> documentRange = EphemeralRangeTemplate<Strategy>::rangeOfContents(document);
- EphemeralRangeTemplate<Strategy> searchRange(documentRange);
+ EphemeralRangeT documentRange = EphemeralRangeT::rangeOfContents(referenceRange.document());
+ EphemeralRangeT searchRange(documentRange);
bool forward = !(options & Backwards);
bool startInReferenceRange = false;
if (referenceRange.isNotNull()) {
startInReferenceRange = options & StartInSelection;
if (forward && startInReferenceRange)
- searchRange = EphemeralRangeTemplate<Strategy>(referenceRange.startPosition(), documentRange.endPosition());
+ searchRange = EphemeralRangeT(referenceRange.startPosition(), documentRange.endPosition());
else if (forward)
- searchRange = EphemeralRangeTemplate<Strategy>(referenceRange.endPosition(), documentRange.endPosition());
+ searchRange = EphemeralRangeT(referenceRange.endPosition(), documentRange.endPosition());
else if (startInReferenceRange)
- searchRange = EphemeralRangeTemplate<Strategy>(documentRange.startPosition(), referenceRange.endPosition());
+ searchRange = EphemeralRangeT(documentRange.startPosition(), referenceRange.endPosition());
else
- searchRange = EphemeralRangeTemplate<Strategy>(documentRange.startPosition(), referenceRange.startPosition());
+ searchRange = EphemeralRangeT(documentRange.startPosition(), referenceRange.startPosition());
}
- RefPtrWillBeRawPtr<Range> resultRange = findStringBetweenPositions(target, searchRange, options);
+ EphemeralRangeT resultRange = findStringBetweenPositions(target, searchRange, options);
// If we started in the reference range and the found range exactly matches
// the reference range, find again. Build a selection with the found range
// to remove collapsed whitespace. Compare ranges instead of selection
// objects to ignore the way that the current selection was made.
- if (resultRange && startInReferenceRange && normalizeRange(EphemeralRangeTemplate<Strategy>(resultRange.get())) == referenceRange) {
+ if (!resultRange.isCollapsed() && startInReferenceRange && normalizeRange(resultRange) == referenceRange) {
if (forward)
- searchRange = EphemeralRangeTemplate<Strategy>(fromPositionInDOMTree<Strategy>(resultRange->endPosition()), searchRange.endPosition());
+ searchRange = EphemeralRangeT(resultRange.endPosition(), searchRange.endPosition());
else
- searchRange = EphemeralRangeTemplate<Strategy>(searchRange.startPosition(), fromPositionInDOMTree<Strategy>(resultRange->startPosition()));
+ searchRange = EphemeralRangeT(searchRange.startPosition(), resultRange.startPosition());
resultRange = findStringBetweenPositions(target, searchRange, options);
}
- if (!resultRange && options & WrapAround)
+ if (resultRange.isCollapsed() && options & WrapAround)
return findStringBetweenPositions(target, documentRange, options);
- return resultRange.release();
+ return resultRange;
}
-PassRefPtrWillBeRawPtr<Range> Editor::findRangeOfString(const String& target, const EphemeralRange& reference, FindOptions options)
+EphemeralRange Editor::findRangeOfString(const String& target, const EphemeralRange& reference, FindOptions options)
{
- return findRangeOfStringAlgorithm<EditingStrategy>(*frame().document(), target, reference, options);
+ return findRangeOfStringAlgorithm<EditingStrategy>(target, reference, options);
}
-PassRefPtrWillBeRawPtr<Range> Editor::findRangeOfString(const String& target, const EphemeralRangeInComposedTree& reference, FindOptions options)
+EphemeralRangeInComposedTree Editor::findRangeOfString(const String& target, const EphemeralRangeInComposedTree& reference, FindOptions options)
{
- return findRangeOfStringAlgorithm<EditingInComposedTreeStrategy>(*frame().document(), target, reference, options);
+ return findRangeOfStringAlgorithm<EditingInComposedTreeStrategy>(target, reference, options);
}
void Editor::setMarkedTextMatchesAreHighlighted(bool flag)

Powered by Google App Engine
This is Rietveld 408576698