blob: 6ec34e0c71c84e5201e4bd06ba81921d1748efb4 [file] [log] [blame]
// 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 <map>
#include <vector>
#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<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 base::RefCounted<FindInfo> {
public:
FindInfo(int request_id,
const base::string16& search_text,
const blink::WebFindOptions& options,
scoped_refptr<WebViewInternalFindFunction> find_function);
// 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:
friend class base::RefCounted<FindInfo>;
~FindInfo();
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_;
friend void WebViewFindHelper::EndFindSession(int session_request_id,
bool canceled);
base::WeakPtrFactory<FindInfo> 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<FindUpdateEvent> find_update_event_;
// Pointer to the first request of the current find session. find_info_map_
// retains ownership.
scoped_refptr<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.
using FindInfoMap = std::map<int, scoped_refptr<FindInfo>>;
FindInfoMap find_info_map_;
DISALLOW_COPY_AND_ASSIGN(WebViewFindHelper);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_GUEST_VIEW_WEB_VIEW_WEB_VIEW_FIND_HELPER_H_