OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/child/child_thread_impl.h" | 5 #include "content/child/child_thread_impl.h" |
6 | 6 |
7 #include <signal.h> | 7 #include <signal.h> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 return browser_process_io_runner_; | 347 return browser_process_io_runner_; |
348 return ChildProcess::current()->io_task_runner(); | 348 return ChildProcess::current()->io_task_runner(); |
349 } | 349 } |
350 | 350 |
351 void ChildThreadImpl::ConnectChannel(bool use_mojo_channel, | 351 void ChildThreadImpl::ConnectChannel(bool use_mojo_channel, |
352 const std::string& ipc_token) { | 352 const std::string& ipc_token) { |
353 bool create_pipe_now = true; | 353 bool create_pipe_now = true; |
354 if (use_mojo_channel) { | 354 if (use_mojo_channel) { |
355 VLOG(1) << "Mojo is enabled on child"; | 355 VLOG(1) << "Mojo is enabled on child"; |
356 mojo::ScopedMessagePipeHandle handle; | 356 mojo::ScopedMessagePipeHandle handle; |
357 if (!IsInBrowserProcess()) { | 357 std::string token = IsInBrowserProcess() ? ipc_token : |
358 DCHECK(!handle.is_valid()); | 358 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
359 handle = mojo::edk::CreateChildMessagePipe( | 359 switches::kMojoChannelToken); |
360 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 360 if (token.empty()) { |
361 switches::kMojoChannelToken)); | 361 IPC::mojom::BootstrapRequest request = GetProxy(&pending_bootstrap_); |
| 362 handle = request.PassMessagePipe(); |
362 } else { | 363 } else { |
363 handle = mojo::edk::CreateChildMessagePipe(ipc_token); | 364 handle = mojo::edk::CreateChildMessagePipe(token); |
364 } | 365 } |
365 DCHECK(handle.is_valid()); | 366 DCHECK(handle.is_valid()); |
366 channel_->Init(IPC::ChannelMojo::CreateClientFactory(std::move(handle)), | 367 channel_->Init(IPC::ChannelMojo::CreateClientFactory(std::move(handle)), |
367 create_pipe_now); | 368 create_pipe_now); |
368 return; | 369 return; |
369 } | 370 } |
370 | 371 |
371 VLOG(1) << "Mojo is disabled on child"; | 372 VLOG(1) << "Mojo is disabled on child"; |
372 channel_->Init(channel_name_, IPC::Channel::MODE_CLIENT, create_pipe_now); | 373 channel_->Init(channel_name_, IPC::Channel::MODE_CLIENT, create_pipe_now); |
373 } | 374 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 } | 590 } |
590 | 591 |
591 void ChildThreadImpl::RecordComputedAction(const std::string& action) { | 592 void ChildThreadImpl::RecordComputedAction(const std::string& action) { |
592 NOTREACHED(); | 593 NOTREACHED(); |
593 } | 594 } |
594 | 595 |
595 MojoShellConnection* ChildThreadImpl::GetMojoShellConnection() { | 596 MojoShellConnection* ChildThreadImpl::GetMojoShellConnection() { |
596 return mojo_shell_connection_.get(); | 597 return mojo_shell_connection_.get(); |
597 } | 598 } |
598 | 599 |
| 600 bool ChildThreadImpl::AcceptConnection(shell::Connection* connection) { |
| 601 connection->GetInterfaceRegistry()->AddInterface( |
| 602 IPC::mojom::Bootstrap::Name_, |
| 603 base::Bind(&ChildThreadImpl::BindBootstrapRequest, |
| 604 base::Unretained(this))); |
| 605 return true; |
| 606 } |
| 607 |
599 shell::InterfaceRegistry* ChildThreadImpl::GetInterfaceRegistry() { | 608 shell::InterfaceRegistry* ChildThreadImpl::GetInterfaceRegistry() { |
600 if (!interface_registry_.get()) | 609 if (!interface_registry_.get()) |
601 interface_registry_.reset(new shell::InterfaceRegistry(nullptr)); | 610 interface_registry_.reset(new shell::InterfaceRegistry(nullptr)); |
602 return interface_registry_.get(); | 611 return interface_registry_.get(); |
603 } | 612 } |
604 | 613 |
605 shell::InterfaceProvider* ChildThreadImpl::GetRemoteInterfaces() { | 614 shell::InterfaceProvider* ChildThreadImpl::GetRemoteInterfaces() { |
606 if (!remote_interfaces_.get()) | 615 if (!remote_interfaces_.get()) |
607 remote_interfaces_.reset(new shell::InterfaceProvider); | 616 remote_interfaces_.reset(new shell::InterfaceProvider); |
608 return remote_interfaces_.get(); | 617 return remote_interfaces_.get(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 // race conditions if the process refcount is 0 but there's an IPC message | 770 // race conditions if the process refcount is 0 but there's an IPC message |
762 // inflight that would addref it. | 771 // inflight that would addref it. |
763 Send(new ChildProcessHostMsg_ShutdownRequest); | 772 Send(new ChildProcessHostMsg_ShutdownRequest); |
764 } | 773 } |
765 | 774 |
766 void ChildThreadImpl::EnsureConnected() { | 775 void ChildThreadImpl::EnsureConnected() { |
767 VLOG(0) << "ChildThreadImpl::EnsureConnected()"; | 776 VLOG(0) << "ChildThreadImpl::EnsureConnected()"; |
768 base::Process::Current().Terminate(0, false); | 777 base::Process::Current().Terminate(0, false); |
769 } | 778 } |
770 | 779 |
| 780 void ChildThreadImpl::BindBootstrapRequest( |
| 781 mojo::ScopedMessagePipeHandle handle) { |
| 782 IPC::mojom::BootstrapRequest request = |
| 783 mojo::MakeRequest<IPC::mojom::Bootstrap>(std::move(handle)); |
| 784 mojo::FuseInterface(std::move(request), pending_bootstrap_.PassInterface()); |
| 785 } |
| 786 |
771 bool ChildThreadImpl::IsInBrowserProcess() const { | 787 bool ChildThreadImpl::IsInBrowserProcess() const { |
772 return static_cast<bool>(browser_process_io_runner_); | 788 return static_cast<bool>(browser_process_io_runner_); |
773 } | 789 } |
774 | 790 |
775 } // namespace content | 791 } // namespace content |
OLD | NEW |