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

Side by Side Diff: content/renderer/render_view_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, clean-up Created 4 years, 11 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_view_impl.h" 5 #include "content/renderer/render_view_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 2341 matching lines...) Expand 10 before | Expand all | Expand 10 after
2352 WebFrame* search_frame = focused_frame; // start searching focused frame. 2352 WebFrame* search_frame = focused_frame; // start searching focused frame.
2353 2353
2354 bool multi_frame = (frame_after_main != main_frame); 2354 bool multi_frame = (frame_after_main != main_frame);
2355 2355
2356 // If we have multiple frames, we don't want to wrap the search within the 2356 // If we have multiple frames, we don't want to wrap the search within the
2357 // frame, so we check here if we only have main_frame in the chain. 2357 // frame, so we check here if we only have main_frame in the chain.
2358 bool wrap_within_frame = !multi_frame; 2358 bool wrap_within_frame = !multi_frame;
2359 2359
2360 WebRect selection_rect; 2360 WebRect selection_rect;
2361 bool result = false; 2361 bool result = false;
2362 bool new_text_found;
2362 2363
2363 // If something is selected when we start searching it means we cannot just 2364 // If something is selected when we start searching it means we cannot just
2364 // increment the current match ordinal; we need to re-generate it. 2365 // increment the current match ordinal; we need to re-generate it.
2365 WebRange current_selection = focused_frame->selectionRange(); 2366 WebRange current_selection = focused_frame->selectionRange();
2366 2367
2367 do { 2368 do {
2368 result = search_frame->find( 2369 result =
2369 request_id, search_text, options, wrap_within_frame, &selection_rect); 2370 search_frame->find(request_id, search_text, options, wrap_within_frame,
2371 &selection_rect, new_text_found);
2370 2372
2371 if (!result) { 2373 if (!result) {
2372 // don't leave text selected as you move to the next frame. 2374 // don't leave text selected as you move to the next frame.
2373 search_frame->executeCommand(WebString::fromUTF8("Unselect"), 2375 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
2374 GetFocusedElement()); 2376 GetFocusedElement());
2375 2377
2376 // Find the next frame, but skip the invisible ones. 2378 // Find the next frame, but skip the invisible ones.
2377 do { 2379 do {
2378 // What is the next frame to search? (we might be going backwards). Note 2380 // What is the next frame to search? (we might be going backwards). Note
2379 // that we specify wrap=true so that search_frame never becomes NULL. 2381 // that we specify wrap=true so that search_frame never becomes NULL.
2380 search_frame = options.forward ? 2382 search_frame = options.forward ?
2381 search_frame->traverseNext(true) : 2383 search_frame->traverseNext(true) :
2382 search_frame->traversePrevious(true); 2384 search_frame->traversePrevious(true);
2383 } while (!search_frame->hasVisibleContent() && 2385 } while (!search_frame->hasVisibleContent() &&
2384 search_frame != focused_frame); 2386 search_frame != focused_frame);
2385 2387
2386 // Make sure selection doesn't affect the search operation in new frame. 2388 // Make sure selection doesn't affect the search operation in new frame.
2387 search_frame->executeCommand(WebString::fromUTF8("Unselect"), 2389 search_frame->executeCommand(WebString::fromUTF8("Unselect"),
2388 GetFocusedElement()); 2390 GetFocusedElement());
2389 2391
2390 // If we have multiple frames and we have wrapped back around to the 2392 // If we have multiple frames and we have wrapped back around to the
2391 // focused frame, we need to search it once more allowing wrap within 2393 // focused frame, we need to search it once more allowing wrap within
2392 // the frame, otherwise it will report 'no match' if the focused frame has 2394 // the frame, otherwise it will report 'no match' if the focused frame has
2393 // reported matches, but no frames after the focused_frame contain a 2395 // reported matches, but no frames after the focused_frame contain a
2394 // match for the search word(s). 2396 // match for the search word(s).
2395 if (multi_frame && search_frame == focused_frame) { 2397 if (multi_frame && search_frame == focused_frame) {
2396 result = search_frame->find( 2398 result = search_frame->find(request_id, search_text, options,
2397 request_id, search_text, options, true, // Force wrapping. 2399 true, // Force wrapping.
2398 &selection_rect); 2400 &selection_rect, new_text_found);
2399 } 2401 }
2400 } 2402 }
2401 2403
2402 webview()->setFocusedFrame(search_frame); 2404 webview()->setFocusedFrame(search_frame);
2403 } while (!result && search_frame != focused_frame); 2405 } while (!result && search_frame != focused_frame);
2404 2406
2405 if (options.findNext && current_selection.isNull()) { 2407 if (options.findNext && current_selection.isNull() && !new_text_found) {
2406 // Force the main_frame to report the actual count. 2408 // Force the main_frame to report the actual count.
2407 main_frame->increaseMatchCount(0, request_id); 2409 main_frame->increaseMatchCount(0, request_id);
2408 } else { 2410 } else {
2409 // If nothing is found, set result to "0 of 0", otherwise, set it to 2411 // If nothing is found, set result to "0 of 0", otherwise, set it to
2410 // "-1 of 1" to indicate that we found at least one item, but we don't know 2412 // "-1 of 1" to indicate that we found at least one item, but we don't know
2411 // yet what is active. 2413 // yet what is active.
2412 int ordinal = result ? -1 : 0; // -1 here means, we might know more later. 2414 int ordinal = result ? -1 : 0; // -1 here means, we might know more later.
2413 int match_count = result ? 1 : 0; // 1 here means possibly more coming. 2415 int match_count = result ? 1 : 0; // 1 here means possibly more coming.
2414 2416
2415 // If we find no matches then this will be our last status update. 2417 // If we find no matches then this will be our last status update.
(...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after
3727 if (IsUseZoomForDSFEnabled()) { 3729 if (IsUseZoomForDSFEnabled()) {
3728 webview()->setZoomFactorForDeviceScaleFactor(device_scale_factor_); 3730 webview()->setZoomFactorForDeviceScaleFactor(device_scale_factor_);
3729 } else { 3731 } else {
3730 webview()->setDeviceScaleFactor(device_scale_factor_); 3732 webview()->setDeviceScaleFactor(device_scale_factor_);
3731 } 3733 }
3732 webview()->settings()->setPreferCompositingToLCDTextEnabled( 3734 webview()->settings()->setPreferCompositingToLCDTextEnabled(
3733 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_)); 3735 PreferCompositingToLCDText(compositor_deps_, device_scale_factor_));
3734 } 3736 }
3735 3737
3736 } // namespace content 3738 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698