15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_FIND_BAR_FIND_TAB_HELPER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_FIND_BAR_FIND_TAB_HELPER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_notification_details.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/range/range.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RectF; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Per-tab find manager. Handles dealing with the life cycle of find sessions. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FindTabHelper : public content::WebContentsObserver, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsUserData<FindTabHelper> { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FindTabHelper(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the Find operation by calling StartFinding on the Tab. This function 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be called from the outside as a result of hot-keys, so it uses the 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last remembered search string as specified with set_find_string(). This 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function does not block while a search is in progress. The controller will 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive the results through the notification mechanism. See Observe(...) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for details. 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartFinding(base::string16 search_string, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool forward_direction, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool case_sensitive); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops the current Find operation. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopFinding(FindBarController::SelectionAction selection_action); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessors/Setters for find_ui_active_. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_ui_active() const { return find_ui_active_; } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_find_ui_active(bool find_ui_active) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_ui_active_ = find_ui_active; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setter for find_op_aborted_. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_find_op_aborted(bool find_op_aborted) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_op_aborted_ = find_op_aborted; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used _only_ by testing to get or set the current request ID. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_find_request_id() { return current_find_request_id_; } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_current_find_request_id(int current_find_request_id) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_find_request_id_ = current_find_request_id; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for find_text_. Used to determine if this WebContents has any 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active searches. 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 find_text() const { return find_text_; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for the previous search we issued. 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 previous_find_text() const { return previous_find_text_; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Range selected_range() const { return selected_range_; } 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void set_selected_range(const gfx::Range& selected_range) { 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) selected_range_ = selected_range; 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for find_result_. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FindNotificationDetails& find_result() const { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_search_result_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selects and zooms to the find result nearest to the point (x,y) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // defined in find-in-page coordinates. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ActivateNearestFindResult(float x, float y); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the renderer to send the rects of the current find matches. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestFindMatchRects(int current_version); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleFindReply(int request_id, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FindTabHelper(content::WebContents* web_contents); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::WebContentsUserData<FindTabHelper>; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each time a search request comes in we assign it an id before passing it 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // over the IPC so that when the results come in we can evaluate whether we 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still care about the results of the search (in some cases we don't because 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user has issued a new search). 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int find_request_id_counter_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the Find UI is active for this Tab. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_ui_active_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if a Find operation was aborted. This can happen if the Find box is 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed or if the search term inside the Find box is erased while a search 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is in progress. This can also be set if a page has been reloaded, and will 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on FindNext result in a full Find operation so that the highlighting for 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inactive matches can be repainted. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_op_aborted_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This variable keeps track of what the most recent request id is. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_find_request_id_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current string we are/just finished searching for. This is used to 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // figure out if this is a Find or a FindNext operation (FindNext should not 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increase the request id). 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 find_text_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The string we searched for before |find_text_|. 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 previous_find_text_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The selection within the text. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Range selected_range_; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the last search was case sensitive or not. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_search_case_sensitive_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last find result. This object contains details about the number of 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matches, the find selection rectangle, etc. The UI can access this 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // information to build its presentation. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindNotificationDetails last_search_result_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FindTabHelper); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_FIND_BAR_FIND_TAB_HELPER_H_ 132