• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
~Listener()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