| Index: content/browser/renderer_host/render_process_host_impl.cc
|
| diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
|
| index a1fb9f888cb71d3ae2f3d4634843fc2a2ac517bf..9474f58ce481045ba62b5dc54744d442218da73d 100644
|
| --- a/content/browser/renderer_host/render_process_host_impl.cc
|
| +++ b/content/browser/renderer_host/render_process_host_impl.cc
|
| @@ -87,7 +87,6 @@
|
| #include "content/browser/renderer_host/pepper/pepper_message_filter.h"
|
| #include "content/browser/renderer_host/pepper/pepper_renderer_connection.h"
|
| #include "content/browser/renderer_host/render_message_filter.h"
|
| -#include "content/browser/renderer_host/render_process_host_mojo_impl.h"
|
| #include "content/browser/renderer_host/render_view_host_delegate.h"
|
| #include "content/browser/renderer_host/render_view_host_impl.h"
|
| #include "content/browser/renderer_host/render_widget_helper.h"
|
| @@ -113,6 +112,8 @@
|
| #include "content/common/child_process_messages.h"
|
| #include "content/common/content_switches_internal.h"
|
| #include "content/common/gpu/gpu_messages.h"
|
| +#include "content/common/mojo/mojo_channel_init.h"
|
| +#include "content/common/mojo/mojo_messages.h"
|
| #include "content/common/resource_messages.h"
|
| #include "content/common/view_messages.h"
|
| #include "content/port/browser/render_widget_host_view_frame_subscriber.h"
|
| @@ -138,6 +139,7 @@
|
| #include "ipc/ipc_logging.h"
|
| #include "ipc/ipc_switches.h"
|
| #include "media/base/media_switches.h"
|
| +#include "mojo/embedder/platform_channel_pair.h"
|
| #include "net/url_request/url_request_context_getter.h"
|
| #include "ppapi/shared_impl/ppapi_switches.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| @@ -169,6 +171,15 @@ static const char* kSiteProcessMapKeyName = "content_site_process_map";
|
| namespace content {
|
| namespace {
|
|
|
| +base::PlatformFile PlatformFileFromScopedPlatformHandle(
|
| + mojo::embedder::ScopedPlatformHandle handle) {
|
| +#if defined(OS_POSIX)
|
| + return handle.release().fd;
|
| +#elif defined(OS_WIN)
|
| + return handle.release().handle;
|
| +#endif
|
| +}
|
| +
|
| void CacheShaderInfo(int32 id, base::FilePath path) {
|
| ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path);
|
| }
|
| @@ -548,6 +559,7 @@ bool RenderProcessHostImpl::Init() {
|
| this,
|
| BrowserThread::GetMessageLoopProxyForThread(
|
| BrowserThread::IO).get()));
|
| + InitializeMojo();
|
|
|
| // Call the embedder first so that their IPC filters have priority.
|
| GetContentClient()->browser()->RenderProcessWillLaunch(this);
|
| @@ -608,6 +620,31 @@ bool RenderProcessHostImpl::Init() {
|
| return true;
|
| }
|
|
|
| +void RenderProcessHostImpl::InitializeMojo() {
|
| + mojo::embedder::PlatformChannelPair channel_pair;
|
| + mojo_channel_init_.reset(new MojoChannelInit);
|
| +
|
| + mojo::ScopedMessagePipeHandle message_pipe = mojo_channel_init_->Init(
|
| + PlatformFileFromScopedPlatformHandle(channel_pair.PassServerHandle()),
|
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
|
| + DCHECK(message_pipe.is_valid());
|
| +
|
| + // The render_process_ is ready to use at this point, but all calls will be
|
| + // queued until the client-side is connected. See ActivateMojo.
|
| + render_process_.reset(
|
| + ScopedIRenderProcessHandle::From(message_pipe.Pass()), this);
|
| +
|
| + // Forward this to the client once we know its process handle.
|
| + mojo_client_handle_ = channel_pair.PassClientHandle();
|
| +}
|
| +
|
| +void RenderProcessHostImpl::ActivateMojo() {
|
| + base::PlatformFile client_file =
|
| + PlatformFileFromScopedPlatformHandle(mojo_client_handle_.Pass());
|
| + Send(new MojoMsg_Activate(
|
| + IPC::GetFileHandleForProcess(client_file, GetHandle(), true)));
|
| +}
|
| +
|
| void RenderProcessHostImpl::CreateMessageFilters() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| AddFilter(new ResourceSchedulerFilter(GetID()));
|
| @@ -1917,7 +1954,8 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead) {
|
|
|
| ClearTransportDIBCache();
|
|
|
| - render_process_host_mojo_.reset();
|
| + render_process_.reset();
|
| + mojo_channel_init_.reset();
|
|
|
| // It's possible that one of the calls out to the observers might have caused
|
| // this object to be no longer needed.
|
| @@ -2052,6 +2090,10 @@ void RenderProcessHostImpl::OnProcessLaunched() {
|
| Source<RenderProcessHost>(this),
|
| NotificationService::NoDetails());
|
|
|
| + // Let the Mojo system get setup on the child process side before any other
|
| + // IPCs arrive. This way those may safely generate Mojo-related RPCs.
|
| + ActivateMojo();
|
| +
|
| while (!queued_messages_.empty()) {
|
| Send(queued_messages_.front());
|
| queued_messages_.pop();
|
| @@ -2061,9 +2103,6 @@ void RenderProcessHostImpl::OnProcessLaunched() {
|
| if (WebRTCInternals::GetInstance()->aec_dump_enabled())
|
| EnableAecDump(WebRTCInternals::GetInstance()->aec_dump_file_path());
|
| #endif
|
| -
|
| - if (render_process_host_mojo_.get())
|
| - render_process_host_mojo_->OnProcessLaunched();
|
| }
|
|
|
| scoped_refptr<AudioRendererHost>
|
| @@ -2140,9 +2179,8 @@ void RenderProcessHostImpl::DecrementWorkerRefCount() {
|
| void RenderProcessHostImpl::SetWebUIHandle(
|
| int32 view_routing_id,
|
| mojo::ScopedMessagePipeHandle handle) {
|
| - if (!render_process_host_mojo_)
|
| - render_process_host_mojo_.reset(new RenderProcessHostMojoImpl(this));
|
| - render_process_host_mojo_->SetWebUIHandle(view_routing_id, handle.Pass());
|
| + DCHECK(!render_process_.is_null());
|
| + render_process_->SetWebUIHandle(view_routing_id, handle.Pass());
|
| }
|
|
|
| } // namespace content
|
|
|