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

Unified Diff: third_party/WebKit/Source/web/TextFinder.cpp

Issue 1409073004: Return EphemeralRange from Editor::findRangeOfString. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Extract text bounds collecting to a function Created 5 years, 1 month 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/web/TextFinder.cpp
diff --git a/third_party/WebKit/Source/web/TextFinder.cpp b/third_party/WebKit/Source/web/TextFinder.cpp
index c7bf5df78082fb3b81d86ccfc523f9d678440ed5..0f1a70355dae6af9bd64fe6b1fd0317e6f36f359 100644
--- a/third_party/WebKit/Source/web/TextFinder.cpp
+++ b/third_party/WebKit/Source/web/TextFinder.cpp
@@ -113,6 +113,40 @@ private:
const bool m_reset;
};
+template <typename Strategy>
+static PassRefPtrWillBeRawPtr<Range> findStringAndScrollToVisibleAlgorithm(
+ Editor& editor,
+ const String& searchText,
+ EphemeralRangeTemplate<Strategy> searchRange,
+ FindOptions findOptions)
+{
+ do {
+ EphemeralRangeTemplate<Strategy> result = editor.findStringAndScrollToVisible(searchText, searchRange, findOptions);
+ if (result.isCollapsed()) {
+ // Not found.
+ return nullptr;
+ }
+
+ RefPtrWillBeRawPtr<Range> resultRange = Range::create(result.document(), toPositionInDOMTree(result.startPosition()), toPositionInDOMTree(result.endPosition()));
+ if (!resultRange->collapsed())
+ return resultRange;
+
+ // |resultRange| will be collapsed if the matched text spans over multiple TreeScopes.
+ // TODO(iceman): Show such matches to users.
+ searchRange = EphemeralRangeTemplate<Strategy>(result.endPosition(), searchRange.endPosition());
+ } while (!searchRange.isCollapsed());
+
+ return nullptr;
+}
+
+PassRefPtrWillBeRawPtr<Range> TextFinder::findStringAndScrollToVisible(const String& searchText, FindOptions findOptions)
+{
+ if (RuntimeEnabledFeatures::selectionForComposedTreeEnabled())
+ return findStringAndScrollToVisibleAlgorithm(ownerFrame().frame()->editor(), searchText, EphemeralRangeInComposedTree(m_activeMatch.get()), findOptions);
+
+ return findStringAndScrollToVisibleAlgorithm(ownerFrame().frame()->editor(), searchText, EphemeralRange(m_activeMatch.get()), findOptions);
+}
+
bool TextFinder::find(int identifier, const WebString& searchText, const WebFindOptions& options, bool wrapWithinFrame, WebRect* selectionRect)
{
if (!ownerFrame().frame() || !ownerFrame().frame()->page())
@@ -145,7 +179,7 @@ bool TextFinder::find(int identifier, const WebString& searchText, const WebFind
| (options.wordStart ? AtWordStarts : 0)
| (options.medialCapitalAsWordStart ? TreatMedialCapitalAsWordStart : 0)
| (options.findNext ? 0 : StartInSelection);
- m_activeMatch = ownerFrame().frame()->editor().findStringAndScrollToVisible(searchText, m_activeMatch.get(), findOptions);
+ m_activeMatch = findStringAndScrollToVisible(searchText, findOptions);
if (!m_activeMatch) {
// If we're finding next the next active match might not be in the current frame.

Powered by Google App Engine
This is Rietveld 408576698