find_tab_helper.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RectF; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Per-tab find manager. Handles dealing with the life cycle of find sessions. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FindTabHelper : public content::WebContentsObserver, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsUserData<FindTabHelper> { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FindTabHelper(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the Find operation by calling StartFinding on the Tab. This function 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be called from the outside as a result of hot-keys, so it uses the 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last remembered search string as specified with set_find_string(). This 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function does not block while a search is in progress. The controller will 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive the results through the notification mechanism. See Observe(...) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for details. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFinding(string16 search_string, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool forward_direction, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool case_sensitive); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops the current Find operation. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopFinding(FindBarController::SelectionAction selection_action); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessors/Setters for find_ui_active_. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_ui_active() const { return find_ui_active_; } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_find_ui_active(bool find_ui_active) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_ui_active_ = find_ui_active; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setter for find_op_aborted_. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_find_op_aborted(bool find_op_aborted) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_op_aborted_ = find_op_aborted; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used _only_ by testing to get or set the current request ID. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_find_request_id() { return current_find_request_id_; } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_current_find_request_id(int current_find_request_id) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_find_request_id_ = current_find_request_id; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for find_text_. Used to determine if this WebContents has any 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active searches. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 find_text() const { return find_text_; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for the previous search we issued. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 previous_find_text() const { return previous_find_text_; } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessor for find_result_. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FindNotificationDetails& find_result() const { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_search_result_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selects and zooms to the find result nearest to the point (x,y) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // defined in find-in-page coordinates. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ActivateNearestFindResult(float x, float y); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the renderer to send the rects of the current find matches. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestFindMatchRects(int current_version); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleFindReply(int request_id, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_matches, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& selection_rect, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_match_ordinal, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool final_update); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FindTabHelper(content::WebContents* web_contents); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::WebContentsUserData<FindTabHelper>; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each time a search request comes in we assign it an id before passing it 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // over the IPC so that when the results come in we can evaluate whether we 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still care about the results of the search (in some cases we don't because 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user has issued a new search). 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int find_request_id_counter_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the Find UI is active for this Tab. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_ui_active_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if a Find operation was aborted. This can happen if the Find box is 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed or if the search term inside the Find box is erased while a search 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is in progress. This can also be set if a page has been reloaded, and will 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on FindNext result in a full Find operation so that the highlighting for 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inactive matches can be repainted. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool find_op_aborted_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This variable keeps track of what the most recent request id is. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_find_request_id_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current string we are/just finished searching for. This is used to 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // figure out if this is a Find or a FindNext operation (FindNext should not 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increase the request id). 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 find_text_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The string we searched for before |find_text_|. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 previous_find_text_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the last search was case sensitive or not. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool last_search_case_sensitive_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last find result. This object contains details about the number of 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matches, the find selection rectangle, etc. The UI can access this 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // information to build its presentation. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindNotificationDetails last_search_result_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FindTabHelper); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_FIND_BAR_FIND_TAB_HELPER_H_ 123