Index: chrome/browser/guest_view/web_view/web_view_find_helper.h |
diff --git a/chrome/browser/guest_view/web_view/web_view_find_helper.h b/chrome/browser/guest_view/web_view/web_view_find_helper.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b257a727ee903736996c7eb2e6c1ce103b12f834 |
--- /dev/null |
+++ b/chrome/browser/guest_view/web_view/web_view_find_helper.h |
@@ -0,0 +1,190 @@ |
+// 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 CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_ |
+#define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_ |
+ |
+#include <map> |
+#include <vector> |
+ |
+#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<WebViewInternalFindFunction> 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: |
+ FindInfo( |
+ int request_id, |
+ const base::string16& search_text, |
+ const blink::WebFindOptions& options, |
+ scoped_refptr<WebViewInternalFindFunction> find_function); |
+ ~FindInfo(); |
+ |
+ // Add another request to |find_next_requests_|. |
+ void AddFindNextRequest(const base::WeakPtr<FindInfo>& 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<FindInfo> 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: |
+ const int request_id_; |
+ const base::string16 search_text_; |
+ blink::WebFindOptions options_; |
+ scoped_refptr<WebViewInternalFindFunction> 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<base::WeakPtr<FindInfo> > find_next_requests_; |
+ |
+ // Weak pointer used to access the find info of fin. |
+ base::WeakPtrFactory<FindInfo> weak_ptr_factory_; |
+ |
+ friend void WebViewFindHelper::EndFindSession(int session_request_id, |
+ bool canceled); |
+ |
+ 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<FindUpdateEvent> find_update_event_; |
+ |
+ // Pointer to the first request of the current find session. |
+ linked_ptr<FindInfo> 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. |
+ typedef std::map<int, linked_ptr<FindInfo> > FindInfoMap; |
+ FindInfoMap find_info_map_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WebViewFindHelper); |
+}; |
+ |
+} // namespace extensions |
+ |
+#endif // CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_ |