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..ebe8ec157faff2c3575b3c24253e03bd1a6d6a6b 100644 |
--- a/third_party/WebKit/Source/web/TextFinder.cpp |
+++ b/third_party/WebKit/Source/web/TextFinder.cpp |
@@ -113,6 +113,41 @@ 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()) { |
yosin_UTC9
2015/11/02 03:44:17
nit: Please get rid of redundant curly braces.
Andrey Kraynov
2015/11/02 14:06:57
Done.
|
+ return resultRange; |
+ } |
+ |
+ // resultRange will be collapsed if the matched text spans over multiple TreeScopes. |
+ // FIXME: Show such matches to users. |
yosin_UTC9
2015/11/02 03:44:17
nit: Please use "TODO(iceman):" instead of "FIXME:
Andrey Kraynov
2015/11/02 14:06:57
Done.
|
+ 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 +180,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. |