| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 // Represents the browser side of the browser <--> renderer communication | 5 // Represents the browser side of the browser <--> renderer communication |
| 6 // channel. There will be one RenderProcessHost per renderer process. | 6 // channel. There will be one RenderProcessHost per renderer process. |
| 7 | 7 |
| 8 #include "content/browser/renderer_host/render_process_host_impl.h" | 8 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 if (renderer_path.empty()) | 824 if (renderer_path.empty()) |
| 825 return false; | 825 return false; |
| 826 | 826 |
| 827 sent_render_process_ready_ = false; | 827 sent_render_process_ready_ = false; |
| 828 | 828 |
| 829 // We may reach Init() during process death notification (e.g. | 829 // We may reach Init() during process death notification (e.g. |
| 830 // RenderProcessExited on some observer). In this case the Channel may be | 830 // RenderProcessExited on some observer). In this case the Channel may be |
| 831 // null, so we re-initialize it here. | 831 // null, so we re-initialize it here. |
| 832 if (!channel_) | 832 if (!channel_) |
| 833 InitializeChannelProxy(); | 833 InitializeChannelProxy(); |
| 834 DCHECK(pending_connection_); |
| 834 | 835 |
| 835 // Unpause the Channel briefly. This will be paused again below if we launch a | 836 // Unpause the Channel briefly. This will be paused again below if we launch a |
| 836 // real child process. Note that messages may be sent in the short window | 837 // real child process. Note that messages may be sent in the short window |
| 837 // between now and then (e.g. in response to RenderProcessWillLaunch) and we | 838 // between now and then (e.g. in response to RenderProcessWillLaunch) and we |
| 838 // depend on those messages being sent right away. | 839 // depend on those messages being sent right away. |
| 839 // | 840 // |
| 840 // |channel_| must always be non-null here: either it was initialized in | 841 // |channel_| must always be non-null here: either it was initialized in |
| 841 // the constructor, or in the most recent call to ProcessDied(). | 842 // the constructor, or in the most recent call to ProcessDied(). |
| 842 channel_->Unpause(false /* flush */); | 843 channel_->Unpause(false /* flush */); |
| 843 | 844 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 base::MakeUnique<base::CommandLine>(renderer_path); | 905 base::MakeUnique<base::CommandLine>(renderer_path); |
| 905 if (!renderer_prefix.empty()) | 906 if (!renderer_prefix.empty()) |
| 906 cmd_line->PrependWrapper(renderer_prefix); | 907 cmd_line->PrependWrapper(renderer_prefix); |
| 907 AppendRendererCommandLine(cmd_line.get()); | 908 AppendRendererCommandLine(cmd_line.get()); |
| 908 | 909 |
| 909 // Spawn the child process asynchronously to avoid blocking the UI thread. | 910 // Spawn the child process asynchronously to avoid blocking the UI thread. |
| 910 // As long as there's no renderer prefix, we can use the zygote process | 911 // As long as there's no renderer prefix, we can use the zygote process |
| 911 // at this stage. | 912 // at this stage. |
| 912 child_process_launcher_.reset(new ChildProcessLauncher( | 913 child_process_launcher_.reset(new ChildProcessLauncher( |
| 913 base::MakeUnique<RendererSandboxedProcessLauncherDelegate>(), | 914 base::MakeUnique<RendererSandboxedProcessLauncherDelegate>(), |
| 914 std::move(cmd_line), GetID(), this, child_token_, | 915 std::move(cmd_line), GetID(), this, std::move(pending_connection_), |
| 915 base::Bind(&RenderProcessHostImpl::OnMojoError, id_))); | 916 base::Bind(&RenderProcessHostImpl::OnMojoError, id_))); |
| 916 channel_->Pause(); | 917 channel_->Pause(); |
| 917 | 918 |
| 918 fast_shutdown_started_ = false; | 919 fast_shutdown_started_ = false; |
| 919 } | 920 } |
| 920 | 921 |
| 921 if (!gpu_observer_registered_) { | 922 if (!gpu_observer_registered_) { |
| 922 gpu_observer_registered_ = true; | 923 gpu_observer_registered_ = true; |
| 923 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); | 924 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); |
| 924 } | 925 } |
| 925 | 926 |
| 926 is_initialized_ = true; | 927 is_initialized_ = true; |
| 927 init_time_ = base::TimeTicks::Now(); | 928 init_time_ = base::TimeTicks::Now(); |
| 928 return true; | 929 return true; |
| 929 } | 930 } |
| 930 | 931 |
| 931 void RenderProcessHostImpl::EnableSendQueue() { | 932 void RenderProcessHostImpl::EnableSendQueue() { |
| 932 if (!channel_) | 933 if (!channel_) |
| 933 InitializeChannelProxy(); | 934 InitializeChannelProxy(); |
| 934 } | 935 } |
| 935 | 936 |
| 936 void RenderProcessHostImpl::InitializeChannelProxy() { | 937 void RenderProcessHostImpl::InitializeChannelProxy() { |
| 937 // Generate a token used to identify the new child process. | |
| 938 child_token_ = mojo::edk::GenerateRandomToken(); | |
| 939 | |
| 940 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = | 938 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = |
| 941 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); | 939 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); |
| 942 | 940 |
| 943 // Acquire a Connector which will route connections to a new instance of the | 941 // Acquire a Connector which will route connections to a new instance of the |
| 944 // renderer service. | 942 // renderer service. |
| 945 service_manager::Connector* connector = | 943 service_manager::Connector* connector = |
| 946 BrowserContext::GetConnectorFor(browser_context_); | 944 BrowserContext::GetConnectorFor(browser_context_); |
| 947 if (!connector) { | 945 if (!connector) { |
| 948 // Note that some embedders (e.g. Android WebView) may not initialize a | 946 // Note that some embedders (e.g. Android WebView) may not initialize a |
| 949 // Connector per BrowserContext. In those cases we fall back to the | 947 // Connector per BrowserContext. In those cases we fall back to the |
| 950 // browser-wide Connector. | 948 // browser-wide Connector. |
| 951 if (!ServiceManagerConnection::GetForProcess()) { | 949 if (!ServiceManagerConnection::GetForProcess()) { |
| 952 // Additionally, some test code may not initialize the process-wide | 950 // Additionally, some test code may not initialize the process-wide |
| 953 // ServiceManagerConnection prior to this point. This class of test code | 951 // ServiceManagerConnection prior to this point. This class of test code |
| 954 // doesn't care about render processes, so we can initialize a dummy | 952 // doesn't care about render processes, so we can initialize a dummy |
| 955 // connection. | 953 // connection. |
| 956 service_manager::mojom::ServiceRequest request(&test_service_); | 954 service_manager::mojom::ServiceRequest request(&test_service_); |
| 957 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( | 955 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( |
| 958 std::move(request), io_task_runner)); | 956 std::move(request), io_task_runner)); |
| 959 } | 957 } |
| 960 connector = ServiceManagerConnection::GetForProcess()->GetConnector(); | 958 connector = ServiceManagerConnection::GetForProcess()->GetConnector(); |
| 961 } | 959 } |
| 962 | 960 |
| 963 // Establish a ServiceManager connection for the new render service instance. | 961 // Establish a ServiceManager connection for the new render service instance. |
| 964 child_connection_.reset(new ChildConnection( | 962 pending_connection_.reset(new mojo::edk::PendingProcessConnection); |
| 965 mojom::kRendererServiceName, | 963 child_connection_.reset( |
| 966 base::StringPrintf("%d_%d", id_, instance_id_++), child_token_, connector, | 964 new ChildConnection(mojom::kRendererServiceName, |
| 967 io_task_runner)); | 965 base::StringPrintf("%d_%d", id_, instance_id_++), |
| 966 *pending_connection_, connector, io_task_runner)); |
| 968 | 967 |
| 969 // Send an interface request to bootstrap the IPC::Channel. Note that this | 968 // Send an interface request to bootstrap the IPC::Channel. Note that this |
| 970 // request will happily sit on the pipe until the process is launched and | 969 // request will happily sit on the pipe until the process is launched and |
| 971 // connected to the ServiceManager. We take the other end immediately and | 970 // connected to the ServiceManager. We take the other end immediately and |
| 972 // plug it into a new ChannelProxy. | 971 // plug it into a new ChannelProxy. |
| 973 IPC::mojom::ChannelBootstrapPtr bootstrap; | 972 IPC::mojom::ChannelBootstrapPtr bootstrap; |
| 974 GetRemoteInterfaces()->GetInterface(&bootstrap); | 973 GetRemoteInterfaces()->GetInterface(&bootstrap); |
| 975 std::unique_ptr<IPC::ChannelFactory> channel_factory = | 974 std::unique_ptr<IPC::ChannelFactory> channel_factory = |
| 976 IPC::ChannelMojo::CreateServerFactory( | 975 IPC::ChannelMojo::CreateServerFactory( |
| 977 bootstrap.PassInterface().PassHandle(), io_task_runner); | 976 bootstrap.PassInterface().PassHandle(), io_task_runner); |
| (...skipping 2095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; | 3072 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; |
| 3074 | 3073 |
| 3075 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. | 3074 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. |
| 3076 // Capture the error message in a crash key value. | 3075 // Capture the error message in a crash key value. |
| 3077 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); | 3076 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); |
| 3078 bad_message::ReceivedBadMessage(render_process_id, | 3077 bad_message::ReceivedBadMessage(render_process_id, |
| 3079 bad_message::RPH_MOJO_PROCESS_ERROR); | 3078 bad_message::RPH_MOJO_PROCESS_ERROR); |
| 3080 } | 3079 } |
| 3081 | 3080 |
| 3082 } // namespace content | 3081 } // namespace content |
| OLD | NEW |