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 std::string token = IsInBrowserProcess() ? ipc_token : | 357 if (!IsInBrowserProcess()) { |
358 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 358 DCHECK(!handle.is_valid()); |
359 switches::kMojoChannelToken); | 359 handle = mojo::edk::CreateChildMessagePipe( |
360 if (token.empty()) { | 360 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
361 IPC::mojom::BootstrapRequest request = GetProxy(&pending_bootstrap_); | 361 switches::kMojoChannelToken)); |
362 handle = request.PassMessagePipe(); | |
363 } else { | 362 } else { |
364 handle = mojo::edk::CreateChildMessagePipe(token); | 363 handle = mojo::edk::CreateChildMessagePipe(ipc_token); |
365 } | 364 } |
366 DCHECK(handle.is_valid()); | 365 DCHECK(handle.is_valid()); |
367 channel_->Init(IPC::ChannelMojo::CreateClientFactory(std::move(handle)), | 366 channel_->Init(IPC::ChannelMojo::CreateClientFactory(std::move(handle)), |
368 create_pipe_now); | 367 create_pipe_now); |
369 return; | 368 return; |
370 } | 369 } |
371 | 370 |
372 VLOG(1) << "Mojo is disabled on child"; | 371 VLOG(1) << "Mojo is disabled on child"; |
373 channel_->Init(channel_name_, IPC::Channel::MODE_CLIENT, create_pipe_now); | 372 channel_->Init(channel_name_, IPC::Channel::MODE_CLIENT, create_pipe_now); |
374 } | 373 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 } | 589 } |
591 | 590 |
592 void ChildThreadImpl::RecordComputedAction(const std::string& action) { | 591 void ChildThreadImpl::RecordComputedAction(const std::string& action) { |
593 NOTREACHED(); | 592 NOTREACHED(); |
594 } | 593 } |
595 | 594 |
596 MojoShellConnection* ChildThreadImpl::GetMojoShellConnection() { | 595 MojoShellConnection* ChildThreadImpl::GetMojoShellConnection() { |
597 return mojo_shell_connection_.get(); | 596 return mojo_shell_connection_.get(); |
598 } | 597 } |
599 | 598 |
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 | |
608 shell::InterfaceRegistry* ChildThreadImpl::GetInterfaceRegistry() { | 599 shell::InterfaceRegistry* ChildThreadImpl::GetInterfaceRegistry() { |
609 if (!interface_registry_.get()) | 600 if (!interface_registry_.get()) |
610 interface_registry_.reset(new shell::InterfaceRegistry(nullptr)); | 601 interface_registry_.reset(new shell::InterfaceRegistry(nullptr)); |
611 return interface_registry_.get(); | 602 return interface_registry_.get(); |
612 } | 603 } |
613 | 604 |
614 shell::InterfaceProvider* ChildThreadImpl::GetRemoteInterfaces() { | 605 shell::InterfaceProvider* ChildThreadImpl::GetRemoteInterfaces() { |
615 if (!remote_interfaces_.get()) | 606 if (!remote_interfaces_.get()) |
616 remote_interfaces_.reset(new shell::InterfaceProvider); | 607 remote_interfaces_.reset(new shell::InterfaceProvider); |
617 return remote_interfaces_.get(); | 608 return remote_interfaces_.get(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 // race conditions if the process refcount is 0 but there's an IPC message | 761 // race conditions if the process refcount is 0 but there's an IPC message |
771 // inflight that would addref it. | 762 // inflight that would addref it. |
772 Send(new ChildProcessHostMsg_ShutdownRequest); | 763 Send(new ChildProcessHostMsg_ShutdownRequest); |
773 } | 764 } |
774 | 765 |
775 void ChildThreadImpl::EnsureConnected() { | 766 void ChildThreadImpl::EnsureConnected() { |
776 VLOG(0) << "ChildThreadImpl::EnsureConnected()"; | 767 VLOG(0) << "ChildThreadImpl::EnsureConnected()"; |
777 base::Process::Current().Terminate(0, false); | 768 base::Process::Current().Terminate(0, false); |
778 } | 769 } |
779 | 770 |
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 | |
787 bool ChildThreadImpl::IsInBrowserProcess() const { | 771 bool ChildThreadImpl::IsInBrowserProcess() const { |
788 return static_cast<bool>(browser_process_io_runner_); | 772 return static_cast<bool>(browser_process_io_runner_); |
789 } | 773 } |
790 | 774 |
791 } // namespace content | 775 } // namespace content |
OLD | NEW |