Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Unified Diff: chrome/browser/ui/search/search_ipc_router.cc

Issue 2688453002: NTP: simplify mojo connection setup (Closed)
Patch Set: Merge Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/search/search_ipc_router.cc
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc
index e5e2ac711de61360f88b4ecf6897382afe3ca4b1..6d44095a9d3898e5d435b1ad396d0b05c347bc7e 100644
--- a/chrome/browser/ui/search/search_ipc_router.cc
+++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -7,6 +7,8 @@
#include <utility>
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/instant_service.h"
+#include "chrome/browser/search/instant_service_factory.h"
#include "chrome/browser/search/search.h"
#include "chrome/common/render_messages.h"
#include "components/search/search.h"
@@ -19,67 +21,65 @@
namespace {
-bool IsRenderedInInstantProcess(content::WebContents* web_contents) {
- // TODO(tibell): Instead of rejecting messages check at connection time if we
- // want to talk to the render frame or not. Later, in an out-of-process iframe
- // world, the IsRenderedInInstantProcess check will have to be done, as it's
- // based on the RenderView.
- Profile* profile =
- Profile::FromBrowserContext(web_contents->GetBrowserContext());
- return search::IsRenderedInInstantProcess(web_contents, profile);
+bool IsInInstantProcess(content::RenderFrameHost* render_frame) {
+ content::RenderProcessHost* process_host = render_frame->GetProcess();
+ const InstantService* instant_service = InstantServiceFactory::GetForProfile(
+ Profile::FromBrowserContext(process_host->GetBrowserContext()));
+ if (!instant_service)
+ return false;
+
+ return instant_service->IsInstantProcess(process_host->GetID());
}
class SearchBoxClientFactoryImpl
- : public SearchIPCRouter::SearchBoxClientFactory {
+ : public SearchIPCRouter::SearchBoxClientFactory,
+ public chrome::mojom::EmbeddedSearchConnector {
public:
- // The |web_contents| must outlive this object.
- explicit SearchBoxClientFactoryImpl(content::WebContents* web_contents)
- : web_contents_(web_contents),
- last_connected_rfh_(
- std::make_pair(content::ChildProcessHost::kInvalidUniqueID,
- MSG_ROUTING_NONE)) {}
- chrome::mojom::SearchBox* GetSearchBox() override;
+ // |web_contents| and |binding| must outlive this object.
+ SearchBoxClientFactoryImpl(
+ content::WebContents* web_contents,
+ mojo::AssociatedBinding<chrome::mojom::Instant>* binding)
+ : client_binding_(binding), factory_bindings_(web_contents, this) {
+ DCHECK(web_contents);
+ DCHECK(binding);
+ // Before we are connected to a frame we throw away all messages.
+ mojo::GetIsolatedProxy(&search_box_);
+ }
+
+ chrome::mojom::SearchBox* GetSearchBox() override {
+ return search_box_.get();
+ }
private:
- void OnConnectionError();
+ void Connect(chrome::mojom::InstantAssociatedRequest request,
+ chrome::mojom::SearchBoxAssociatedPtrInfo client) override;
- content::WebContents* web_contents_;
+ // An interface used to push updates to the frame that connected to us. Before
+ // we've been connected to a frame, messages sent on this interface go into
+ // the void.
chrome::mojom::SearchBoxAssociatedPtr search_box_;
- // The proccess ID and routing ID of the last connected main frame. May be
- // (ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE) if we haven't
- // connected yet.
- std::pair<int, int> last_connected_rfh_;
+ // Used to bind incoming interface requests to the implementation, which lives
+ // in SearchIPCRouter.
+ mojo::AssociatedBinding<chrome::mojom::Instant>* client_binding_;
+
+ // Binding used to listen to connection requests.
+ content::WebContentsFrameBindingSet<chrome::mojom::EmbeddedSearchConnector>
+ factory_bindings_;
DISALLOW_COPY_AND_ASSIGN(SearchBoxClientFactoryImpl);
};
-chrome::mojom::SearchBox* SearchBoxClientFactoryImpl::GetSearchBox() {
- content::RenderFrameHost* frame = web_contents_->GetMainFrame();
- auto id = std::make_pair(frame->GetProcess()->GetID(), frame->GetRoutingID());
- // Avoid reconnecting repeatedly to the same RenderFrameHost for performance
- // reasons.
- if (id != last_connected_rfh_) {
- if (IsRenderedInInstantProcess(web_contents_)) {
- frame->GetRemoteAssociatedInterfaces()->GetInterface(&search_box_);
- search_box_.set_connection_error_handler(
- base::Bind(&SearchBoxClientFactoryImpl::OnConnectionError,
- base::Unretained(this)));
- } else {
- // Renderer is not an instant process. We'll create a connection that
- // drops all messages.
- mojo::GetIsolatedProxy(&search_box_);
- }
- last_connected_rfh_ = id;
+void SearchBoxClientFactoryImpl::Connect(
+ chrome::mojom::InstantAssociatedRequest request,
+ chrome::mojom::SearchBoxAssociatedPtrInfo client) {
+ content::RenderFrameHost* frame = factory_bindings_.GetCurrentTargetFrame();
+ const bool is_main_frame = frame->GetParent() == nullptr;
+ if (!IsInInstantProcess(frame) || !is_main_frame) {
+ return;
}
- return search_box_.get();
-}
-
-void SearchBoxClientFactoryImpl::OnConnectionError() {
- search_box_.reset();
- last_connected_rfh_ = std::make_pair(
- content::ChildProcessHost::kInvalidUniqueID,
- MSG_ROUTING_NONE);
+ client_binding_->Bind(std::move(request));
+ search_box_.Bind(std::move(client));
}
} // namespace
@@ -92,14 +92,15 @@ SearchIPCRouter::SearchIPCRouter(content::WebContents* web_contents,
policy_(std::move(policy)),
commit_counter_(0),
is_active_tab_(false),
- bindings_(web_contents, this),
- search_box_client_factory_(new SearchBoxClientFactoryImpl(web_contents)) {
+ binding_(this),
+ search_box_client_factory_(
+ new SearchBoxClientFactoryImpl(web_contents, &binding_)) {
DCHECK(web_contents);
DCHECK(delegate);
DCHECK(policy_.get());
}
-SearchIPCRouter::~SearchIPCRouter() {}
+SearchIPCRouter::~SearchIPCRouter() = default;
void SearchIPCRouter::OnNavigationEntryCommitted() {
++commit_counter_;
@@ -183,8 +184,6 @@ void SearchIPCRouter::OnTabDeactivated() {
void SearchIPCRouter::InstantSupportDetermined(int page_seq_no,
bool instant_support) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -192,8 +191,6 @@ void SearchIPCRouter::InstantSupportDetermined(int page_seq_no,
}
void SearchIPCRouter::FocusOmnibox(int page_seq_no, OmniboxFocusState state) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -205,8 +202,6 @@ void SearchIPCRouter::FocusOmnibox(int page_seq_no, OmniboxFocusState state) {
}
void SearchIPCRouter::DeleteMostVisitedItem(int page_seq_no, const GURL& url) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -219,8 +214,6 @@ void SearchIPCRouter::DeleteMostVisitedItem(int page_seq_no, const GURL& url) {
void SearchIPCRouter::UndoMostVisitedDeletion(int page_seq_no,
const GURL& url) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -232,8 +225,6 @@ void SearchIPCRouter::UndoMostVisitedDeletion(int page_seq_no,
}
void SearchIPCRouter::UndoAllMostVisitedDeletions(int page_seq_no) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -247,8 +238,6 @@ void SearchIPCRouter::UndoAllMostVisitedDeletions(int page_seq_no) {
void SearchIPCRouter::LogEvent(int page_seq_no,
NTPLoggingEventType event,
base::TimeDelta time) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -263,8 +252,6 @@ void SearchIPCRouter::LogMostVisitedImpression(
int page_seq_no,
int position,
ntp_tiles::NTPTileSource tile_source) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -280,8 +267,6 @@ void SearchIPCRouter::LogMostVisitedNavigation(
int page_seq_no,
int position,
ntp_tiles::NTPTileSource tile_source) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -295,8 +280,6 @@ void SearchIPCRouter::LogMostVisitedNavigation(
void SearchIPCRouter::PasteAndOpenDropdown(int page_seq_no,
const base::string16& text) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -309,8 +292,6 @@ void SearchIPCRouter::PasteAndOpenDropdown(int page_seq_no,
void SearchIPCRouter::ChromeIdentityCheck(int page_seq_no,
const base::string16& identity) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
@@ -322,8 +303,6 @@ void SearchIPCRouter::ChromeIdentityCheck(int page_seq_no,
}
void SearchIPCRouter::HistorySyncCheck(int page_seq_no) {
- if (!IsRenderedInInstantProcess(web_contents()))
- return;
if (page_seq_no != commit_counter_)
return;
« no previous file with comments | « chrome/browser/ui/search/search_ipc_router.h ('k') | chrome/browser/ui/search/search_ipc_router_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698