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

Side by Side Diff: third_party/WebKit/Source/web/TextFinder.cpp

Issue 2801483002: Add DocumentMarker::MatchStatus enum for text match markers (Closed)
Patch Set: Update tests Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 }; 109 };
110 110
111 bool TextFinder::find(int identifier, 111 bool TextFinder::find(int identifier,
112 const WebString& searchText, 112 const WebString& searchText,
113 const WebFindOptions& options, 113 const WebFindOptions& options,
114 bool wrapWithinFrame, 114 bool wrapWithinFrame,
115 bool* activeNow) { 115 bool* activeNow) {
116 if (!options.findNext) 116 if (!options.findNext)
117 unmarkAllTextMatches(); 117 unmarkAllTextMatches();
118 else 118 else
119 setMarkerActive(m_activeMatch.get(), false); 119 setMarkerActive(m_activeMatch.get(), DocumentMarker::MatchStatus::Inactive);
120 120
121 if (m_activeMatch && 121 if (m_activeMatch &&
122 &m_activeMatch->ownerDocument() != ownerFrame().frame()->document()) 122 &m_activeMatch->ownerDocument() != ownerFrame().frame()->document())
123 m_activeMatch = nullptr; 123 m_activeMatch = nullptr;
124 124
125 // If the user has selected something since the last Find operation we want 125 // If the user has selected something since the last Find operation we want
126 // to start from there. Otherwise, we start searching from where the last Find 126 // to start from there. Otherwise, we start searching from where the last Find
127 // operation left off (either a Find or a FindNext operation). 127 // operation left off (either a Find or a FindNext operation).
128 VisibleSelection selection(ownerFrame() 128 VisibleSelection selection(ownerFrame()
129 .frame() 129 .frame()
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 ->pageNeedsAutosizing()) { 167 ->pageNeedsAutosizing()) {
168 ownerFrame().viewImpl()->zoomToFindInPageRect( 168 ownerFrame().viewImpl()->zoomToFindInPageRect(
169 ownerFrame().frameView()->contentsToRootFrame( 169 ownerFrame().frameView()->contentsToRootFrame(
170 enclosingIntRect(LayoutObject::absoluteBoundingBoxRectForRange( 170 enclosingIntRect(LayoutObject::absoluteBoundingBoxRectForRange(
171 m_activeMatch.get())))); 171 m_activeMatch.get()))));
172 } 172 }
173 173
174 bool wasActiveFrame = m_currentActiveMatchFrame; 174 bool wasActiveFrame = m_currentActiveMatchFrame;
175 m_currentActiveMatchFrame = true; 175 m_currentActiveMatchFrame = true;
176 176
177 bool isActive = setMarkerActive(m_activeMatch.get(), true); 177 bool isActive =
178 setMarkerActive(m_activeMatch.get(), DocumentMarker::MatchStatus::Active);
178 if (activeNow) 179 if (activeNow)
179 *activeNow = isActive; 180 *activeNow = isActive;
180 181
181 // Make sure no node is focused. See http://crbug.com/38700. 182 // Make sure no node is focused. See http://crbug.com/38700.
182 ownerFrame().frame()->document()->clearFocusedElement(); 183 ownerFrame().frame()->document()->clearFocusedElement();
183 184
184 // Set this frame as focused. 185 // Set this frame as focused.
185 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame()); 186 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame());
186 187
187 if (!options.findNext || activeSelection || !isActive) { 188 if (!options.findNext || activeSelection || !isActive) {
(...skipping 27 matching lines...) Expand all
215 } 216 }
216 217
217 // We found something, so the result of the previous scoping may be outdated. 218 // We found something, so the result of the previous scoping may be outdated.
218 m_lastFindRequestCompletedWithNoMatches = false; 219 m_lastFindRequestCompletedWithNoMatches = false;
219 220
220 return true; 221 return true;
221 } 222 }
222 223
223 void TextFinder::clearActiveFindMatch() { 224 void TextFinder::clearActiveFindMatch() {
224 m_currentActiveMatchFrame = false; 225 m_currentActiveMatchFrame = false;
225 setMarkerActive(m_activeMatch.get(), false); 226 setMarkerActive(m_activeMatch.get(), DocumentMarker::MatchStatus::Inactive);
226 resetActiveMatch(); 227 resetActiveMatch();
227 } 228 }
228 229
229 void TextFinder::stopFindingAndClearSelection() { 230 void TextFinder::stopFindingAndClearSelection() {
230 cancelPendingScopingEffort(); 231 cancelPendingScopingEffort();
231 232
232 // Remove all markers for matches found and turn off the highlighting. 233 // Remove all markers for matches found and turn off the highlighting.
233 ownerFrame().frame()->document()->markers().removeMarkers( 234 ownerFrame().frame()->document()->markers().removeMarkers(
234 DocumentMarker::TextMatch); 235 DocumentMarker::TextMatch);
235 ownerFrame().frame()->editor().setMarkedTextMatchesAreHighlighted(false); 236 ownerFrame().frame()->editor().setMarkedTextMatchesAreHighlighted(false);
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // To stop looking for the active tickmark, we set this flag. 391 // To stop looking for the active tickmark, we set this flag.
391 m_locatingActiveRect = false; 392 m_locatingActiveRect = false;
392 393
393 // Notify browser of new location for the selected rectangle. 394 // Notify browser of new location for the selected rectangle.
394 reportFindInPageSelection( 395 reportFindInPageSelection(
395 ownerFrame().frameView()->contentsToRootFrame(resultBounds), 396 ownerFrame().frameView()->contentsToRootFrame(resultBounds),
396 m_activeMatchIndex + 1, identifier); 397 m_activeMatchIndex + 1, identifier);
397 } 398 }
398 399
399 ownerFrame().frame()->document()->markers().addTextMatchMarker( 400 ownerFrame().frame()->document()->markers().addTextMatchMarker(
400 EphemeralRange(resultRange), foundActiveMatch); 401 EphemeralRange(resultRange),
402 foundActiveMatch ? DocumentMarker::MatchStatus::Active
403 : DocumentMarker::MatchStatus::Inactive);
401 404
402 m_findMatchesCache.push_back( 405 m_findMatchesCache.push_back(
403 FindMatch(resultRange, m_lastMatchCount + matchCount)); 406 FindMatch(resultRange, m_lastMatchCount + matchCount));
404 407
405 // Set the new start for the search range to be the end of the previous 408 // Set the new start for the search range to be the end of the previous
406 // result range. There is no need to use a VisiblePosition here, 409 // result range. There is no need to use a VisiblePosition here,
407 // since findPlainText will use a TextIterator to go over the visible 410 // since findPlainText will use a TextIterator to go over the visible
408 // text nodes. 411 // text nodes.
409 searchStart = result.endPosition(); 412 searchStart = result.endPosition();
410 413
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 627
625 // Check if the match is already selected. 628 // Check if the match is already selected.
626 if (!m_currentActiveMatchFrame || !m_activeMatch || 629 if (!m_currentActiveMatchFrame || !m_activeMatch ||
627 !areRangesEqual(m_activeMatch.get(), range)) { 630 !areRangesEqual(m_activeMatch.get(), range)) {
628 m_activeMatchIndex = m_findMatchesCache[index].m_ordinal - 1; 631 m_activeMatchIndex = m_findMatchesCache[index].m_ordinal - 1;
629 632
630 // Set this frame as the active frame (the one with the active highlight). 633 // Set this frame as the active frame (the one with the active highlight).
631 m_currentActiveMatchFrame = true; 634 m_currentActiveMatchFrame = true;
632 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame()); 635 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame());
633 636
634 if (m_activeMatch) 637 if (m_activeMatch) {
635 setMarkerActive(m_activeMatch.get(), false); 638 setMarkerActive(m_activeMatch.get(),
639 DocumentMarker::MatchStatus::Inactive);
640 }
636 m_activeMatch = range; 641 m_activeMatch = range;
637 setMarkerActive(m_activeMatch.get(), true); 642 setMarkerActive(m_activeMatch.get(), DocumentMarker::MatchStatus::Active);
638 643
639 // Clear any user selection, to make sure Find Next continues on from the 644 // Clear any user selection, to make sure Find Next continues on from the
640 // match we just activated. 645 // match we just activated.
641 ownerFrame().frame()->selection().clear(); 646 ownerFrame().frame()->selection().clear();
642 647
643 // Make sure no node is focused. See http://crbug.com/38700. 648 // Make sure no node is focused. See http://crbug.com/38700.
644 ownerFrame().frame()->document()->clearFocusedElement(); 649 ownerFrame().frame()->document()->clearFocusedElement();
645 } 650 }
646 651
647 IntRect activeMatchRect; 652 IntRect activeMatchRect;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 m_findRequestIdentifier(-1), 689 m_findRequestIdentifier(-1),
685 m_nextInvalidateAfter(0), 690 m_nextInvalidateAfter(0),
686 m_findMatchMarkersVersion(0), 691 m_findMatchMarkersVersion(0),
687 m_locatingActiveRect(false), 692 m_locatingActiveRect(false),
688 m_scopingInProgress(false), 693 m_scopingInProgress(false),
689 m_lastFindRequestCompletedWithNoMatches(false), 694 m_lastFindRequestCompletedWithNoMatches(false),
690 m_findMatchRectsAreValid(false) {} 695 m_findMatchRectsAreValid(false) {}
691 696
692 TextFinder::~TextFinder() {} 697 TextFinder::~TextFinder() {}
693 698
694 bool TextFinder::setMarkerActive(Range* range, bool active) { 699 bool TextFinder::setMarkerActive(Range* range,
700 DocumentMarker::MatchStatus matchStatus) {
695 if (!range || range->collapsed()) 701 if (!range || range->collapsed())
696 return false; 702 return false;
697 return ownerFrame().frame()->document()->markers().setMarkersActive( 703 return ownerFrame().frame()->document()->markers().setMarkersActive(
698 EphemeralRange(range), active); 704 EphemeralRange(range), matchStatus);
699 } 705 }
700 706
701 void TextFinder::unmarkAllTextMatches() { 707 void TextFinder::unmarkAllTextMatches() {
702 LocalFrame* frame = ownerFrame().frame(); 708 LocalFrame* frame = ownerFrame().frame();
703 if (frame && frame->page() && 709 if (frame && frame->page() &&
704 frame->editor().markedTextMatchesAreHighlighted()) 710 frame->editor().markedTextMatchesAreHighlighted())
705 frame->document()->markers().removeMarkers(DocumentMarker::TextMatch); 711 frame->document()->markers().removeMarkers(DocumentMarker::TextMatch);
706 } 712 }
707 713
708 bool TextFinder::shouldScopeMatches(const String& searchText, 714 bool TextFinder::shouldScopeMatches(const String& searchText,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 785
780 DEFINE_TRACE(TextFinder) { 786 DEFINE_TRACE(TextFinder) {
781 visitor->trace(m_ownerFrame); 787 visitor->trace(m_ownerFrame);
782 visitor->trace(m_activeMatch); 788 visitor->trace(m_activeMatch);
783 visitor->trace(m_resumeScopingFromRange); 789 visitor->trace(m_resumeScopingFromRange);
784 visitor->trace(m_deferredScopingWork); 790 visitor->trace(m_deferredScopingWork);
785 visitor->trace(m_findMatchesCache); 791 visitor->trace(m_findMatchesCache);
786 } 792 }
787 793
788 } // namespace blink 794 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698