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

Unified Diff: content/renderer/render_thread_impl.cc

Issue 285333003: Support exposing Mojo services between render frames, render threads, and their respective hosts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 6 years, 6 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
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | content/renderer/web_ui_mojo.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_thread_impl.cc
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 6e124b321bd57e00648a24a0f89601475a47487a..2cf4fd8cecffcaa949d26ee64c8f173e6c986533 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -51,7 +51,7 @@
#include "content/common/gpu/client/gpu_memory_buffer_impl.h"
#include "content/common/gpu/gpu_messages.h"
#include "content/common/gpu/gpu_process_launch_causes.h"
-#include "content/common/mojo/mojo_service_names.h"
+#include "content/common/render_frame_setup.mojom.h"
#include "content/common/resource_messages.h"
#include "content/common/view_messages.h"
#include "content/common/worker_messages.h"
@@ -95,7 +95,6 @@
#include "content/renderer/service_worker/embedded_worker_context_message_filter.h"
#include "content/renderer/service_worker/embedded_worker_dispatcher.h"
#include "content/renderer/shared_worker/embedded_shared_worker_stub.h"
-#include "content/renderer/web_ui_setup_impl.h"
#include "grit/content_resources.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_forwarding_message_filter.h"
@@ -266,6 +265,31 @@ void NotifyTimezoneChangeOnThisThread() {
v8::Date::DateTimeConfigurationChangeNotification(isolate);
}
+class RenderFrameSetupImpl : public mojo::InterfaceImpl<RenderFrameSetup> {
+ public:
+ virtual void GetServiceProviderForFrame(
+ int32_t frame_routing_id,
+ mojo::InterfaceRequest<mojo::IInterfaceProvider> request) OVERRIDE {
+ RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id);
+ // We can receive a GetServiceProviderForFrame message for a frame not yet
+ // created due to a race between the message and a ViewMsg_New IPC that
+ // triggers creation of the RenderFrame we want.
+ if (!frame) {
+ RenderThreadImpl::current()->RegisterPendingRenderFrameConnect(
+ frame_routing_id, request.PassMessagePipe());
+ return;
+ }
+
+ frame->BindServiceRegistry(request.PassMessagePipe());
+ }
+
+ virtual void OnConnectionError() OVERRIDE { delete this; }
+};
+
+void CreateRenderFrameSetup(mojo::InterfaceRequest<RenderFrameSetup> request) {
+ mojo::BindToRequest(new RenderFrameSetupImpl(), &request);
+}
+
} // namespace
RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() {
@@ -508,10 +532,19 @@ void RenderThreadImpl::Init() {
}
}
+ service_registry()->AddService<RenderFrameSetup>(
+ base::Bind(CreateRenderFrameSetup));
+
TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, "");
}
RenderThreadImpl::~RenderThreadImpl() {
+ for (std::map<int, mojo::MessagePipeHandle>::iterator it =
+ pending_render_frame_connects_.begin();
+ it != pending_render_frame_connects_.end();
+ ++it) {
+ mojo::CloseRaw(it->second);
+ }
}
void RenderThreadImpl::Shutdown() {
@@ -680,6 +713,18 @@ scoped_refptr<base::MessageLoopProxy>
void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) {
ChildThread::GetRouter()->AddRoute(routing_id, listener);
+ std::map<int, mojo::MessagePipeHandle>::iterator it =
+ pending_render_frame_connects_.find(routing_id);
+ if (it == pending_render_frame_connects_.end())
+ return;
+
+ RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id);
+ if (!frame)
+ return;
+
+ mojo::ScopedMessagePipeHandle handle(it->second);
+ pending_render_frame_connects_.erase(it);
+ frame->BindServiceRegistry(handle.Pass());
}
void RenderThreadImpl::RemoveRoute(int32 routing_id) {
@@ -703,6 +748,15 @@ void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32 routing_id) {
}
}
+void RenderThreadImpl::RegisterPendingRenderFrameConnect(
+ int routing_id,
+ mojo::ScopedMessagePipeHandle handle) {
+ std::pair<std::map<int, mojo::MessagePipeHandle>::iterator, bool> result =
+ pending_render_frame_connects_.insert(
+ std::make_pair(routing_id, handle.release()));
+ CHECK(result.second) << "Inserting a duplicate item.";
+}
+
int RenderThreadImpl::GenerateRoutingID() {
int routing_id = MSG_ROUTING_NONE;
Send(new ViewHostMsg_GenerateRoutingID(&routing_id));
@@ -1099,6 +1153,10 @@ void RenderThreadImpl::ReleaseCachedFonts() {
#endif // OS_WIN
+ServiceRegistry* RenderThreadImpl::GetServiceRegistry() {
+ return service_registry();
+}
+
bool RenderThreadImpl::IsMainThread() {
return !!current();
}
@@ -1179,19 +1237,6 @@ scoped_ptr<gfx::GpuMemoryBuffer> RenderThreadImpl::AllocateGpuMemoryBuffer(
.PassAs<gfx::GpuMemoryBuffer>();
}
-void RenderThreadImpl::ConnectToService(
- const mojo::String& service_url,
- const mojo::String& service_name,
- mojo::ScopedMessagePipeHandle message_pipe,
- const mojo::String& requestor_url) {
- // TODO(darin): Invent some kind of registration system to use here.
- if (service_url.To<base::StringPiece>() == kRendererService_WebUISetup) {
- WebUISetupImpl::Bind(message_pipe.Pass());
- } else {
- NOTREACHED() << "Unknown service name";
- }
-}
-
void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() {
suspend_webkit_shared_timer_ = false;
}
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | content/renderer/web_ui_mojo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698