// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_ #define EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_ #include #include #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "content/public/browser/web_contents.h" #include "third_party/WebKit/public/web/WebFindOptions.h" #include "ui/gfx/geometry/rect.h" namespace extensions { class WebViewInternalFindFunction; class WebViewGuest; // Helper class for find requests and replies for the web_view_internal find // API. class WebViewFindHelper { public: explicit WebViewFindHelper(WebViewGuest* webview_guest); ~WebViewFindHelper(); // Cancels all find requests in progress and calls their callback functions. void CancelAllFindSessions(); // Dispatches the |findupdate| event. void DispatchFindUpdateEvent(bool canceled, bool final_update); // Ends the find session with id |session_request_id| and calls the // appropriate callbacks. void EndFindSession(int session_request_id, bool canceled); // Helper function for WebViewGuest::Find(). void Find(content::WebContents* guest_web_contents, const base::string16& search_text, const blink::WebFindOptions& options, scoped_refptr find_function); // Helper function for WeViewGuest:FindReply(). void FindReply(int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update); private: // A wrapper to store find results. class FindResults { public: FindResults(); ~FindResults(); // Aggregate the find results. void AggregateResults(int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update); // Stores find results into a DictionaryValue. void PrepareResults(base::DictionaryValue* results); private: int number_of_matches_; int active_match_ordinal_; gfx::Rect selection_rect_; friend void WebViewFindHelper::EndFindSession(int session_request_id, bool canceled); DISALLOW_COPY_AND_ASSIGN(FindResults); }; // Stores and processes the results for the |findupdate| event. class FindUpdateEvent { public: explicit FindUpdateEvent(const base::string16& search_text); ~FindUpdateEvent(); // Aggregate the find results. void AggregateResults(int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update); // Stores find results and other event info into a DictionaryValue. void PrepareResults(base::DictionaryValue* results); private: const base::string16 search_text_; FindResults find_results_; DISALLOW_COPY_AND_ASSIGN(FindUpdateEvent); }; // Handles all information about a find request and its results. class FindInfo : public base::RefCounted { public: FindInfo(int request_id, const base::string16& search_text, const blink::WebFindOptions& options, scoped_refptr find_function); // Add another request to |find_next_requests_|. void AddFindNextRequest(const base::WeakPtr& request) { find_next_requests_.push_back(request); } // Aggregate the find results. void AggregateResults(int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update); base::WeakPtr AsWeakPtr(); blink::WebFindOptions* options() { return &options_; } bool replied() { return replied_; } int request_id() { return request_id_; } const base::string16& search_text() { return search_text_; } // Calls the callback function within |find_function_| with the find results // from within |find_results_|. void SendResponse(bool canceled); private: friend class base::RefCounted; ~FindInfo(); const int request_id_; const base::string16 search_text_; blink::WebFindOptions options_; scoped_refptr find_function_; FindResults find_results_; // A find reply has been received for this find request. bool replied_; // Stores pointers to all the find next requests if this is the first // request of a find session. std::vector > find_next_requests_; friend void WebViewFindHelper::EndFindSession(int session_request_id, bool canceled); base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(FindInfo); }; // Pointer to the webview that is being helped. WebViewGuest* const webview_guest_; // A counter to generate a unique request id for a find request. // We only need the ids to be unique for a given WebViewGuest. int current_find_request_id_; // Stores aggregated find results and other info for the |findupdate| event. scoped_ptr find_update_event_; // Pointer to the first request of the current find session. find_info_map_ // retains ownership. scoped_refptr current_find_session_; // Stores each find request's information by request_id so that its callback // function can be called when its find results are available. using FindInfoMap = std::map>; FindInfoMap find_info_map_; DISALLOW_COPY_AND_ASSIGN(WebViewFindHelper); }; } // namespace extensions #endif // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_