Home | History | Annotate | Download | only in browser
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef ANDROID_WEBVIEW_BROWSER_FIND_HELPER_H_
      6 #define ANDROID_WEBVIEW_BROWSER_FIND_HELPER_H_
      7 
      8 #include "base/memory/weak_ptr.h"
      9 #include "content/public/browser/web_contents_observer.h"
     10 
     11 namespace android_webview {
     12 
     13 // Handles the WebView find-in-page API requests.
     14 class FindHelper : public content::WebContentsObserver {
     15  public:
     16   class Listener {
     17    public:
     18     // Called when receiving a new find-in-page update.
     19     // This will be triggered when the results of FindAllSync, FindAllAsync and
     20     // FindNext are available. The value provided in active_ordinal is 0-based.
     21     virtual void OnFindResultReceived(int active_ordinal,
     22                                       int match_count,
     23                                       bool finished) = 0;
     24     virtual ~Listener() {}
     25   };
     26 
     27   explicit FindHelper(content::WebContents* web_contents);
     28   virtual ~FindHelper();
     29 
     30   // Sets the listener to receive find result updates.
     31   // Does not own the listener and must set to NULL when invalid.
     32   void SetListener(Listener* listener);
     33 
     34   // Asynchronous API.
     35   void FindAllAsync(const base::string16& search_string);
     36   void HandleFindReply(int request_id,
     37                        int match_count,
     38                        int active_ordinal,
     39                        bool finished);
     40 
     41   // Methods valid in both synchronous and asynchronous modes.
     42   void FindNext(bool forward);
     43   void ClearMatches();
     44 
     45  private:
     46   void StartNewRequest(const base::string16& search_string);
     47   void NotifyResults(int active_ordinal, int match_count, bool finished);
     48 
     49   // Listener results are reported to.
     50   Listener* listener_;
     51 
     52   // Used to check the validity of FindNext operations.
     53   bool async_find_started_;
     54   bool sync_find_started_;
     55 
     56   // Used to provide different ids to each request and for result
     57   // verification in asynchronous calls.
     58   int find_request_id_counter_;
     59   int current_request_id_;
     60 
     61   // Required by FindNext and the incremental find replies.
     62   base::string16 last_search_string_;
     63   int last_match_count_;
     64   int last_active_ordinal_;
     65 
     66   // Used to post synchronous result notifications to ourselves.
     67   base::WeakPtrFactory<FindHelper> weak_factory_;
     68 
     69   DISALLOW_COPY_AND_ASSIGN(FindHelper);
     70 };
     71 
     72 }  // namespace android_webview
     73 
     74 #endif  // ANDROID_WEBVIEW_BROWSER_FIND_HELPER_H_
     75