| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 #include "content/public/common/connection_filter.h" | 54 #include "content/public/common/connection_filter.h" |
| 55 #include "content/public/common/content_switches.h" | 55 #include "content/public/common/content_switches.h" |
| 56 #include "content/public/common/mojo_channel_switches.h" | 56 #include "content/public/common/mojo_channel_switches.h" |
| 57 #include "content/public/common/mojo_shell_connection.h" | 57 #include "content/public/common/mojo_shell_connection.h" |
| 58 #include "content/public/common/service_names.h" | 58 #include "content/public/common/service_names.h" |
| 59 #include "ipc/attachment_broker.h" | 59 #include "ipc/attachment_broker.h" |
| 60 #include "ipc/attachment_broker_unprivileged.h" | 60 #include "ipc/attachment_broker_unprivileged.h" |
| 61 #include "ipc/ipc_channel_mojo.h" | 61 #include "ipc/ipc_channel_mojo.h" |
| 62 #include "ipc/ipc_logging.h" | 62 #include "ipc/ipc_logging.h" |
| 63 #include "ipc/ipc_platform_file.h" | 63 #include "ipc/ipc_platform_file.h" |
| 64 #include "ipc/ipc_switches.h" | |
| 65 #include "ipc/ipc_sync_channel.h" | 64 #include "ipc/ipc_sync_channel.h" |
| 66 #include "ipc/ipc_sync_message_filter.h" | 65 #include "ipc/ipc_sync_message_filter.h" |
| 67 #include "mojo/edk/embedder/embedder.h" | 66 #include "mojo/edk/embedder/embedder.h" |
| 68 #include "mojo/edk/embedder/named_platform_channel_pair.h" | 67 #include "mojo/edk/embedder/named_platform_channel_pair.h" |
| 69 #include "mojo/edk/embedder/platform_channel_pair.h" | 68 #include "mojo/edk/embedder/platform_channel_pair.h" |
| 70 #include "mojo/edk/embedder/scoped_ipc_support.h" | 69 #include "mojo/edk/embedder/scoped_ipc_support.h" |
| 71 #include "services/shell/public/cpp/connector.h" | 70 #include "services/shell/public/cpp/connector.h" |
| 72 #include "services/shell/public/cpp/interface_factory.h" | 71 #include "services/shell/public/cpp/interface_factory.h" |
| 73 #include "services/shell/public/cpp/interface_provider.h" | 72 #include "services/shell/public/cpp/interface_provider.h" |
| 74 #include "services/shell/public/cpp/interface_registry.h" | 73 #include "services/shell/public/cpp/interface_registry.h" |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 DISALLOW_COPY_AND_ASSIGN(ChannelBootstrapFilter); | 285 DISALLOW_COPY_AND_ASSIGN(ChannelBootstrapFilter); |
| 287 }; | 286 }; |
| 288 | 287 |
| 289 } // namespace | 288 } // namespace |
| 290 | 289 |
| 291 ChildThread* ChildThread::Get() { | 290 ChildThread* ChildThread::Get() { |
| 292 return ChildThreadImpl::current(); | 291 return ChildThreadImpl::current(); |
| 293 } | 292 } |
| 294 | 293 |
| 295 ChildThreadImpl::Options::Options() | 294 ChildThreadImpl::Options::Options() |
| 296 : channel_name(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 295 : auto_start_mojo_shell_connection(true), connect_to_browser(false) {} |
| 297 switches::kProcessChannelID)), | |
| 298 use_mojo_channel(base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 299 switches::kMojoApplicationChannelToken) || | |
| 300 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 301 switches::kMojoChannelToken)), | |
| 302 auto_start_mojo_shell_connection(true), | |
| 303 connect_to_browser(false) {} | |
| 304 | 296 |
| 305 ChildThreadImpl::Options::Options(const Options& other) = default; | 297 ChildThreadImpl::Options::Options(const Options& other) = default; |
| 306 | 298 |
| 307 ChildThreadImpl::Options::~Options() { | 299 ChildThreadImpl::Options::~Options() { |
| 308 } | 300 } |
| 309 | 301 |
| 310 ChildThreadImpl::Options::Builder::Builder() { | 302 ChildThreadImpl::Options::Builder::Builder() { |
| 311 } | 303 } |
| 312 | 304 |
| 313 ChildThreadImpl::Options::Builder& | 305 ChildThreadImpl::Options::Builder& |
| 314 ChildThreadImpl::Options::Builder::InBrowserProcess( | 306 ChildThreadImpl::Options::Builder::InBrowserProcess( |
| 315 const InProcessChildThreadParams& params) { | 307 const InProcessChildThreadParams& params) { |
| 316 options_.browser_process_io_runner = params.io_runner(); | 308 options_.browser_process_io_runner = params.io_runner(); |
| 317 options_.channel_name = params.channel_name(); | |
| 318 options_.in_process_application_token = params.application_token(); | 309 options_.in_process_application_token = params.application_token(); |
| 319 return *this; | 310 return *this; |
| 320 } | 311 } |
| 321 | 312 |
| 322 ChildThreadImpl::Options::Builder& | 313 ChildThreadImpl::Options::Builder& |
| 323 ChildThreadImpl::Options::Builder::UseMojoChannel(bool use_mojo_channel) { | |
| 324 options_.use_mojo_channel = use_mojo_channel; | |
| 325 return *this; | |
| 326 } | |
| 327 | |
| 328 ChildThreadImpl::Options::Builder& | |
| 329 ChildThreadImpl::Options::Builder::AutoStartMojoShellConnection( | 314 ChildThreadImpl::Options::Builder::AutoStartMojoShellConnection( |
| 330 bool auto_start) { | 315 bool auto_start) { |
| 331 options_.auto_start_mojo_shell_connection = auto_start; | 316 options_.auto_start_mojo_shell_connection = auto_start; |
| 332 return *this; | 317 return *this; |
| 333 } | 318 } |
| 334 | 319 |
| 335 ChildThreadImpl::Options::Builder& | 320 ChildThreadImpl::Options::Builder& |
| 336 ChildThreadImpl::Options::Builder::ConnectToBrowser( | 321 ChildThreadImpl::Options::Builder::ConnectToBrowser( |
| 337 bool connect_to_browser) { | 322 bool connect_to_browser) { |
| 338 options_.connect_to_browser = connect_to_browser; | 323 options_.connect_to_browser = connect_to_browser; |
| 339 return *this; | 324 return *this; |
| 340 } | 325 } |
| 341 | 326 |
| 342 ChildThreadImpl::Options::Builder& | 327 ChildThreadImpl::Options::Builder& |
| 343 ChildThreadImpl::Options::Builder::WithChannelName( | |
| 344 const std::string& channel_name) { | |
| 345 options_.channel_name = channel_name; | |
| 346 return *this; | |
| 347 } | |
| 348 | |
| 349 ChildThreadImpl::Options::Builder& | |
| 350 ChildThreadImpl::Options::Builder::AddStartupFilter( | 328 ChildThreadImpl::Options::Builder::AddStartupFilter( |
| 351 IPC::MessageFilter* filter) { | 329 IPC::MessageFilter* filter) { |
| 352 options_.startup_filters.push_back(filter); | 330 options_.startup_filters.push_back(filter); |
| 353 return *this; | 331 return *this; |
| 354 } | 332 } |
| 355 | 333 |
| 356 ChildThreadImpl::Options ChildThreadImpl::Options::Builder::Build() { | 334 ChildThreadImpl::Options ChildThreadImpl::Options::Builder::Build() { |
| 357 return options_; | 335 return options_; |
| 358 } | 336 } |
| 359 | 337 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 weak_factory_(this) { | 378 weak_factory_(this) { |
| 401 Init(options); | 379 Init(options); |
| 402 } | 380 } |
| 403 | 381 |
| 404 scoped_refptr<base::SequencedTaskRunner> ChildThreadImpl::GetIOTaskRunner() { | 382 scoped_refptr<base::SequencedTaskRunner> ChildThreadImpl::GetIOTaskRunner() { |
| 405 if (IsInBrowserProcess()) | 383 if (IsInBrowserProcess()) |
| 406 return browser_process_io_runner_; | 384 return browser_process_io_runner_; |
| 407 return ChildProcess::current()->io_task_runner(); | 385 return ChildProcess::current()->io_task_runner(); |
| 408 } | 386 } |
| 409 | 387 |
| 410 void ChildThreadImpl::ConnectChannel(bool use_mojo_channel) { | 388 void ChildThreadImpl::ConnectChannel() { |
| 411 bool create_pipe_now = true; | 389 std::string channel_token; |
| 412 if (use_mojo_channel) { | 390 mojo::ScopedMessagePipeHandle handle; |
| 413 VLOG(1) << "Mojo is enabled on child"; | 391 if (!IsInBrowserProcess()) { |
| 414 std::string channel_token; | 392 channel_token = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 415 mojo::ScopedMessagePipeHandle handle; | 393 switches::kMojoChannelToken); |
| 416 if (!IsInBrowserProcess()) { | |
| 417 channel_token = | |
| 418 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 419 switches::kMojoChannelToken); | |
| 420 } | |
| 421 | |
| 422 if (!channel_token.empty()) { | |
| 423 // TODO(rockot): Remove all paths which lead to this branch. The Channel | |
| 424 // connection should always be established by a shell connection from the | |
| 425 // browser. http://crbug.com/623396. | |
| 426 handle = mojo::edk::CreateChildMessagePipe(channel_token); | |
| 427 } else { | |
| 428 DCHECK(mojo_shell_connection_); | |
| 429 IPC::mojom::ChannelBootstrapPtr bootstrap; | |
| 430 handle = mojo::GetProxy(&bootstrap).PassMessagePipe(); | |
| 431 mojo_shell_connection_->AddConnectionFilter( | |
| 432 base::MakeUnique<ChannelBootstrapFilter>(bootstrap.PassInterface())); | |
| 433 } | |
| 434 | |
| 435 DCHECK(handle.is_valid()); | |
| 436 channel_->Init( | |
| 437 IPC::ChannelMojo::CreateClientFactory( | |
| 438 std::move(handle), ChildProcess::current()->io_task_runner()), | |
| 439 create_pipe_now); | |
| 440 return; | |
| 441 } | 394 } |
| 442 | 395 |
| 443 VLOG(1) << "Mojo is disabled on child"; | 396 if (!channel_token.empty()) { |
| 444 channel_->Init(channel_name_, IPC::Channel::MODE_CLIENT, create_pipe_now); | 397 // TODO(rockot): Remove all paths which lead to this branch. The Channel |
| 398 // connection should always be established by a shell connection from the |
| 399 // browser. http://crbug.com/623396. |
| 400 handle = mojo::edk::CreateChildMessagePipe(channel_token); |
| 401 } else { |
| 402 DCHECK(mojo_shell_connection_); |
| 403 IPC::mojom::ChannelBootstrapPtr bootstrap; |
| 404 handle = mojo::GetProxy(&bootstrap).PassMessagePipe(); |
| 405 mojo_shell_connection_->AddConnectionFilter( |
| 406 base::MakeUnique<ChannelBootstrapFilter>(bootstrap.PassInterface())); |
| 407 } |
| 408 |
| 409 DCHECK(handle.is_valid()); |
| 410 channel_->Init( |
| 411 IPC::ChannelMojo::CreateClientFactory( |
| 412 std::move(handle), ChildProcess::current()->io_task_runner()), |
| 413 true /* create_pipe_now */); |
| 445 } | 414 } |
| 446 | 415 |
| 447 void ChildThreadImpl::Init(const Options& options) { | 416 void ChildThreadImpl::Init(const Options& options) { |
| 448 channel_name_ = options.channel_name; | |
| 449 | |
| 450 g_lazy_tls.Pointer()->Set(this); | 417 g_lazy_tls.Pointer()->Set(this); |
| 451 on_channel_error_called_ = false; | 418 on_channel_error_called_ = false; |
| 452 message_loop_ = base::MessageLoop::current(); | 419 message_loop_ = base::MessageLoop::current(); |
| 453 #ifdef IPC_MESSAGE_LOG_ENABLED | 420 #ifdef IPC_MESSAGE_LOG_ENABLED |
| 454 // We must make sure to instantiate the IPC Logger *before* we create the | 421 // We must make sure to instantiate the IPC Logger *before* we create the |
| 455 // channel, otherwise we can get a callback on the IO thread which creates | 422 // channel, otherwise we can get a callback on the IO thread which creates |
| 456 // the logger, and the logger does not like being created on the IO thread. | 423 // the logger, and the logger does not like being created on the IO thread. |
| 457 IPC::Logging::GetInstance(); | 424 IPC::Logging::GetInstance(); |
| 458 #endif | 425 #endif |
| 459 | 426 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 } | 535 } |
| 569 | 536 |
| 570 IPC::AttachmentBroker* broker = IPC::AttachmentBroker::GetGlobal(); | 537 IPC::AttachmentBroker* broker = IPC::AttachmentBroker::GetGlobal(); |
| 571 if (broker && !broker->IsPrivilegedBroker()) | 538 if (broker && !broker->IsPrivilegedBroker()) |
| 572 broker->RegisterBrokerCommunicationChannel(channel_.get()); | 539 broker->RegisterBrokerCommunicationChannel(channel_.get()); |
| 573 | 540 |
| 574 channel_->AddAssociatedInterface( | 541 channel_->AddAssociatedInterface( |
| 575 base::Bind(&ChildThreadImpl::OnRouteProviderRequest, | 542 base::Bind(&ChildThreadImpl::OnRouteProviderRequest, |
| 576 base::Unretained(this))); | 543 base::Unretained(this))); |
| 577 | 544 |
| 578 ConnectChannel(options.use_mojo_channel); | 545 ConnectChannel(); |
| 579 | 546 |
| 580 // This must always be done after ConnectChannel, because ConnectChannel() may | 547 // This must always be done after ConnectChannel, because ConnectChannel() may |
| 581 // add a ConnectionFilter to the connection. | 548 // add a ConnectionFilter to the connection. |
| 582 if (options.auto_start_mojo_shell_connection && mojo_shell_connection_) | 549 if (options.auto_start_mojo_shell_connection && mojo_shell_connection_) |
| 583 StartMojoShellConnection(); | 550 StartMojoShellConnection(); |
| 584 | 551 |
| 585 int connection_timeout = kConnectionTimeoutS; | 552 int connection_timeout = kConnectionTimeoutS; |
| 586 std::string connection_override = | 553 std::string connection_override = |
| 587 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 554 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 588 switches::kIPCConnectionTimeout); | 555 switches::kIPCConnectionTimeout); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 894 Listener* route = router_.GetRoute(routing_id); | 861 Listener* route = router_.GetRoute(routing_id); |
| 895 if (route) | 862 if (route) |
| 896 route->OnAssociatedInterfaceRequest(name, request.PassHandle()); | 863 route->OnAssociatedInterfaceRequest(name, request.PassHandle()); |
| 897 } | 864 } |
| 898 | 865 |
| 899 bool ChildThreadImpl::IsInBrowserProcess() const { | 866 bool ChildThreadImpl::IsInBrowserProcess() const { |
| 900 return static_cast<bool>(browser_process_io_runner_); | 867 return static_cast<bool>(browser_process_io_runner_); |
| 901 } | 868 } |
| 902 | 869 |
| 903 } // namespace content | 870 } // namespace content |
| OLD | NEW |