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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1605863002: Restart search in page when new text is found. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 10 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 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 5075 matching lines...) Expand 10 before | Expand all | Expand 10 after
5086 5086
5087 // Check for multiple searchable frames. 5087 // Check for multiple searchable frames.
5088 bool multi_frame = (main_frame->traverseNextLocal(true) != main_frame); 5088 bool multi_frame = (main_frame->traverseNextLocal(true) != main_frame);
5089 5089
5090 // If we have multiple frames, we don't want to wrap the search within the 5090 // If we have multiple frames, we don't want to wrap the search within the
5091 // frame, so we check here if we only have |main_frame| in the chain. 5091 // frame, so we check here if we only have |main_frame| in the chain.
5092 bool wrap_within_frame = !multi_frame; 5092 bool wrap_within_frame = !multi_frame;
5093 5093
5094 WebRect selection_rect; 5094 WebRect selection_rect;
5095 bool result = false; 5095 bool result = false;
5096 bool active_now;
5096 5097
5097 // If something is selected when we start searching it means we cannot just 5098 // If something is selected when we start searching it means we cannot just
5098 // increment the current match ordinal; we need to re-generate it. 5099 // increment the current match ordinal; we need to re-generate it.
5099 WebRange current_selection = focused_frame->selectionRange(); 5100 WebRange current_selection = focused_frame->selectionRange();
5100 5101
5101 do { 5102 do {
5102 result = search_frame->find(request_id, search_text, options, 5103 result =
5103 wrap_within_frame, &selection_rect); 5104 search_frame->find(request_id, search_text, options, wrap_within_frame,
5105 &selection_rect, &active_now);
5104 5106
5105 if (!result) { 5107 if (!result) {
5106 // Don't leave text selected as you move to the next frame. 5108 // Don't leave text selected as you move to the next frame.
5107 search_frame->executeCommand(WebString::fromUTF8("Unselect"), 5109 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
5108 GetFocusedElement()); 5110 GetFocusedElement());
5109 5111
5110 // Find the next frame, but skip the invisible ones. 5112 // Find the next frame, but skip the invisible ones.
5111 do { 5113 do {
5112 // What is the next frame to search (we might be going backwards)? Note 5114 // What is the next frame to search (we might be going backwards)? Note
5113 // that we specify wrap=true so that search_frame never becomes NULL. 5115 // that we specify wrap=true so that search_frame never becomes NULL.
5114 search_frame = options.forward 5116 search_frame = options.forward
5115 ? search_frame->traverseNextLocal(true) 5117 ? search_frame->traverseNextLocal(true)
5116 : search_frame->traversePreviousLocal(true); 5118 : search_frame->traversePreviousLocal(true);
5117 } while (!search_frame->hasVisibleContent() && 5119 } while (!search_frame->hasVisibleContent() &&
5118 search_frame != focused_frame); 5120 search_frame != focused_frame);
5119 5121
5120 // Make sure selection doesn't affect the search operation in new frame. 5122 // Make sure selection doesn't affect the search operation in new frame.
5121 search_frame->executeCommand(WebString::fromUTF8("Unselect"), 5123 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
5122 GetFocusedElement()); 5124 GetFocusedElement());
5123 5125
5124 // If we have multiple frames and we have wrapped back around to the 5126 // If we have multiple frames and we have wrapped back around to the
5125 // focused frame, we need to search it once more allowing wrap within 5127 // focused frame, we need to search it once more allowing wrap within
5126 // the frame, otherwise it will report 'no match' if the focused frame has 5128 // the frame, otherwise it will report 'no match' if the focused frame has
5127 // reported matches, but no frames after the focused_frame contain a 5129 // reported matches, but no frames after the focused_frame contain a
5128 // match for the search word(s). 5130 // match for the search word(s).
5129 if (multi_frame && search_frame == focused_frame) { 5131 if (multi_frame && search_frame == focused_frame) {
5130 result = search_frame->find(request_id, search_text, options, 5132 result = search_frame->find(request_id, search_text, options,
5131 true, // Force wrapping. 5133 true, // Force wrapping.
5132 &selection_rect); 5134 &selection_rect, &active_now);
5133 } 5135 }
5134 } 5136 }
5135 5137
5136 render_view_->webview()->setFocusedFrame(search_frame); 5138 render_view_->webview()->setFocusedFrame(search_frame);
5137 } while (!result && search_frame != focused_frame); 5139 } while (!result && search_frame != focused_frame);
5138 5140
5139 if (options.findNext && current_selection.isNull()) { 5141 if (options.findNext && current_selection.isNull() && active_now) {
5140 // Force the main_frame to report the actual count. 5142 // Force the main_frame to report the actual count.
5141 main_frame->increaseMatchCount(0, request_id); 5143 main_frame->increaseMatchCount(0, request_id);
5142 } else { 5144 } else {
5143 // If nothing is found, set result to "0 of 0", otherwise, set it to 5145 // If nothing is found, set result to "0 of 0", otherwise, set it to
5144 // "-1 of 1" to indicate that we found at least one item, but we don't know 5146 // "-1 of 1" to indicate that we found at least one item, but we don't know
5145 // yet what is active. 5147 // yet what is active.
5146 int ordinal = result ? -1 : 0; // -1 here means we might know more later. 5148 int ordinal = result ? -1 : 0; // -1 here means we might know more later.
5147 int match_count = result ? 1 : 0; // 1 here means possibly more coming. 5149 int match_count = result ? 1 : 0; // 1 here means possibly more coming.
5148 5150
5149 // If we find no matches then this will be our last status update. 5151 // If we find no matches then this will be our last status update.
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after
6129 int match_count, 6131 int match_count,
6130 int ordinal, 6132 int ordinal,
6131 const WebRect& selection_rect, 6133 const WebRect& selection_rect,
6132 bool final_status_update) { 6134 bool final_status_update) {
6133 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, 6135 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count,
6134 selection_rect, ordinal, 6136 selection_rect, ordinal,
6135 final_status_update)); 6137 final_status_update));
6136 } 6138 }
6137 6139
6138 } // namespace content 6140 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698