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