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