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
11namespace android_webview {
12
13// Handles the WebView find-in-page API requests.
14class 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