Home | History | Annotate | Download | only in web_view
      1 // Copyright 2014 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 EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_
      6 #define EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_
      7 
      8 #include <map>
      9 #include <vector>
     10 
     11 #include "base/memory/weak_ptr.h"
     12 #include "base/values.h"
     13 #include "content/public/browser/web_contents.h"
     14 #include "third_party/WebKit/public/web/WebFindOptions.h"
     15 #include "ui/gfx/geometry/rect.h"
     16 
     17 namespace extensions {
     18 class WebViewInternalFindFunction;
     19 class WebViewGuest;
     20 
     21 // Helper class for find requests and replies for the web_view_internal find
     22 // API.
     23 class WebViewFindHelper {
     24  public:
     25   explicit WebViewFindHelper(WebViewGuest* webview_guest);
     26   ~WebViewFindHelper();
     27 
     28   // Cancels all find requests in progress and calls their callback functions.
     29   void CancelAllFindSessions();
     30 
     31   // Dispatches the |findupdate| event.
     32   void DispatchFindUpdateEvent(bool canceled, bool final_update);
     33 
     34   // Ends the find session with id |session_request_id|  and calls the
     35   // appropriate callbacks.
     36   void EndFindSession(int session_request_id, bool canceled);
     37 
     38   // Helper function for WebViewGuest::Find().
     39   void Find(content::WebContents* guest_web_contents,
     40             const base::string16& search_text,
     41             const blink::WebFindOptions& options,
     42             scoped_refptr<WebViewInternalFindFunction> find_function);
     43 
     44   // Helper function for WeViewGuest:FindReply().
     45   void FindReply(int request_id,
     46                  int number_of_matches,
     47                  const gfx::Rect& selection_rect,
     48                  int active_match_ordinal,
     49                  bool final_update);
     50 
     51  private:
     52   // A wrapper to store find results.
     53   class FindResults {
     54    public:
     55     FindResults();
     56     ~FindResults();
     57 
     58     // Aggregate the find results.
     59     void AggregateResults(int number_of_matches,
     60                           const gfx::Rect& selection_rect,
     61                           int active_match_ordinal,
     62                           bool final_update);
     63 
     64     // Stores find results into a DictionaryValue.
     65     void PrepareResults(base::DictionaryValue* results);
     66 
     67    private:
     68     int number_of_matches_;
     69     int active_match_ordinal_;
     70     gfx::Rect selection_rect_;
     71 
     72     friend void WebViewFindHelper::EndFindSession(int session_request_id,
     73                                                   bool canceled);
     74 
     75     DISALLOW_COPY_AND_ASSIGN(FindResults);
     76   };
     77 
     78   // Stores and processes the results for the |findupdate| event.
     79   class FindUpdateEvent {
     80    public:
     81     explicit FindUpdateEvent(const base::string16& search_text);
     82     ~FindUpdateEvent();
     83 
     84     // Aggregate the find results.
     85     void AggregateResults(int number_of_matches,
     86                           const gfx::Rect& selection_rect,
     87                           int active_match_ordinal,
     88                           bool final_update);
     89 
     90     // Stores find results and other event info into a DictionaryValue.
     91     void PrepareResults(base::DictionaryValue* results);
     92 
     93    private:
     94     const base::string16 search_text_;
     95     FindResults find_results_;
     96 
     97     DISALLOW_COPY_AND_ASSIGN(FindUpdateEvent);
     98   };
     99 
    100   // Handles all information about a find request and its results.
    101   class FindInfo {
    102    public:
    103     FindInfo(int request_id,
    104              const base::string16& search_text,
    105              const blink::WebFindOptions& options,
    106              scoped_refptr<WebViewInternalFindFunction> find_function);
    107     ~FindInfo();
    108 
    109     // Add another request to |find_next_requests_|.
    110     void AddFindNextRequest(const base::WeakPtr<FindInfo>& request) {
    111       find_next_requests_.push_back(request);
    112     }
    113 
    114     // Aggregate the find results.
    115     void AggregateResults(int number_of_matches,
    116                           const gfx::Rect& selection_rect,
    117                           int active_match_ordinal,
    118                           bool final_update);
    119 
    120     base::WeakPtr<FindInfo> AsWeakPtr();
    121 
    122     blink::WebFindOptions* options() {
    123       return &options_;
    124     }
    125 
    126     bool replied() {
    127       return replied_;
    128     }
    129 
    130     int request_id() {
    131       return request_id_;
    132     }
    133 
    134     const base::string16& search_text() {
    135       return search_text_;
    136     }
    137 
    138     // Calls the callback function within |find_function_| with the find results
    139     // from within |find_results_|.
    140     void SendResponse(bool canceled);
    141 
    142    private:
    143     const int request_id_;
    144     const base::string16 search_text_;
    145     blink::WebFindOptions options_;
    146     scoped_refptr<WebViewInternalFindFunction> find_function_;
    147     FindResults find_results_;
    148 
    149     // A find reply has been received for this find request.
    150     bool replied_;
    151 
    152     // Stores pointers to all the find next requests if this is the first
    153     // request of a find session.
    154     std::vector<base::WeakPtr<FindInfo> > find_next_requests_;
    155 
    156     friend void WebViewFindHelper::EndFindSession(int session_request_id,
    157                                                   bool canceled);
    158 
    159     base::WeakPtrFactory<FindInfo> weak_ptr_factory_;
    160 
    161     DISALLOW_COPY_AND_ASSIGN(FindInfo);
    162   };
    163 
    164   // Pointer to the webview that is being helped.
    165   WebViewGuest* const webview_guest_;
    166 
    167   // A counter to generate a unique request id for a find request.
    168   // We only need the ids to be unique for a given WebViewGuest.
    169   int current_find_request_id_;
    170 
    171   // Stores aggregated find results and other info for the |findupdate| event.
    172   scoped_ptr<FindUpdateEvent> find_update_event_;
    173 
    174   // Pointer to the first request of the current find session.
    175   linked_ptr<FindInfo> current_find_session_;
    176 
    177   // Stores each find request's information by request_id so that its callback
    178   // function can be called when its find results are available.
    179   typedef std::map<int, linked_ptr<FindInfo> > FindInfoMap;
    180   FindInfoMap find_info_map_;
    181 
    182   DISALLOW_COPY_AND_ASSIGN(WebViewFindHelper);
    183 };
    184 
    185 } // namespace extensions
    186 
    187 #endif  // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_
    188