Index: chrome/browser/service_process/service_process_control.cc |
diff --git a/chrome/browser/service_process/service_process_control.cc b/chrome/browser/service_process/service_process_control.cc |
index c1b7bd815e2213df7249b59e4af7777a618ec723..0977d09818058c20198bafa400031fd1c270b853 100644 |
--- a/chrome/browser/service_process/service_process_control.cc |
+++ b/chrome/browser/service_process/service_process_control.cc |
@@ -28,9 +28,29 @@ |
#include "chrome/common/service_process_util.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_service.h" |
+#include "ipc/ipc_channel_mojo.h" |
+#include "mojo/edk/embedder/embedder.h" |
+#include "mojo/edk/embedder/named_platform_handle.h" |
+#include "mojo/edk/embedder/named_platform_handle_utils.h" |
using content::BrowserThread; |
+namespace { |
+ |
+void ConnectOnBlockingPool(mojo::ScopedMessagePipeHandle handle, |
+ mojo::edk::NamedPlatformHandle os_pipe) { |
+ mojo::edk::ScopedPlatformHandle os_pipe_handle = |
+ mojo::edk::CreateClientHandle(os_pipe); |
+ if (!os_pipe_handle.is_valid()) |
+ return; |
+ |
+ mojo::FuseMessagePipes( |
+ mojo::edk::ConnectToPeerProcess(std::move(os_pipe_handle)), |
+ std::move(handle)); |
+} |
+ |
+} // namespace |
+ |
// ServiceProcessControl implementation. |
ServiceProcessControl::ServiceProcessControl() { |
} |
@@ -49,11 +69,18 @@ void ServiceProcessControl::ConnectInternal() { |
// Actually going to connect. |
DVLOG(1) << "Connecting to Service Process IPC Server"; |
+ mojo::MessagePipe pipe; |
+ BrowserThread::PostBlockingPoolTask( |
+ FROM_HERE, base::Bind(&ConnectOnBlockingPool, base::Passed(&pipe.handle1), |
+ mojo::edk::NamedPlatformHandle( |
+ GetServiceProcessChannel().name))); |
// TODO(hclam): Handle error connecting to channel. |
- const IPC::ChannelHandle channel_id = GetServiceProcessChannel(); |
- SetChannel(IPC::ChannelProxy::Create( |
- channel_id, IPC::Channel::MODE_NAMED_CLIENT, this, |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::IO).get())); |
+ auto io_task_runner = |
+ BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); |
+ SetChannel( |
+ IPC::ChannelProxy::Create(IPC::ChannelMojo::CreateClientFactory( |
+ std::move(pipe.handle0), io_task_runner), |
+ this, io_task_runner)); |
} |
void ServiceProcessControl::SetChannel( |