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. |