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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 #include "gpu/GLES2/gl2extchromium.h" | 165 #include "gpu/GLES2/gl2extchromium.h" |
166 #include "gpu/command_buffer/client/gpu_switches.h" | 166 #include "gpu/command_buffer/client/gpu_switches.h" |
167 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 167 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
168 #include "gpu/command_buffer/service/gpu_switches.h" | 168 #include "gpu/command_buffer/service/gpu_switches.h" |
169 #include "ipc/attachment_broker.h" | 169 #include "ipc/attachment_broker.h" |
170 #include "ipc/attachment_broker_privileged.h" | 170 #include "ipc/attachment_broker_privileged.h" |
171 #include "ipc/ipc.mojom.h" | 171 #include "ipc/ipc.mojom.h" |
172 #include "ipc/ipc_channel.h" | 172 #include "ipc/ipc_channel.h" |
173 #include "ipc/ipc_channel_mojo.h" | 173 #include "ipc/ipc_channel_mojo.h" |
174 #include "ipc/ipc_logging.h" | 174 #include "ipc/ipc_logging.h" |
175 #include "ipc/ipc_switches.h" | |
176 #include "media/base/media_switches.h" | 175 #include "media/base/media_switches.h" |
177 #include "mojo/edk/embedder/embedder.h" | 176 #include "mojo/edk/embedder/embedder.h" |
178 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" | 177 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" |
179 #include "net/url_request/url_request_context_getter.h" | 178 #include "net/url_request/url_request_context_getter.h" |
180 #include "ppapi/shared_impl/ppapi_switches.h" | 179 #include "ppapi/shared_impl/ppapi_switches.h" |
181 #include "services/shell/public/cpp/connection.h" | 180 #include "services/shell/public/cpp/connection.h" |
182 #include "services/shell/public/cpp/interface_provider.h" | 181 #include "services/shell/public/cpp/interface_provider.h" |
183 #include "services/shell/public/cpp/interface_registry.h" | 182 #include "services/shell/public/cpp/interface_registry.h" |
184 #include "services/shell/runner/common/switches.h" | 183 #include "services/shell/runner/common/switches.h" |
185 #include "storage/browser/fileapi/sandbox_file_system_backend.h" | 184 #include "storage/browser/fileapi/sandbox_file_system_backend.h" |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 // Find the renderer before creating the channel so if this fails early we | 869 // Find the renderer before creating the channel so if this fails early we |
871 // return without creating the channel. | 870 // return without creating the channel. |
872 base::FilePath renderer_path = ChildProcessHost::GetChildPath(flags); | 871 base::FilePath renderer_path = ChildProcessHost::GetChildPath(flags); |
873 if (renderer_path.empty()) | 872 if (renderer_path.empty()) |
874 return false; | 873 return false; |
875 | 874 |
876 channel_connected_ = false; | 875 channel_connected_ = false; |
877 sent_render_process_ready_ = false; | 876 sent_render_process_ready_ = false; |
878 | 877 |
879 // Setup the IPC channel. | 878 // Setup the IPC channel. |
880 const std::string channel_id = | 879 channel_ = CreateChannelProxy(); |
881 IPC::Channel::GenerateVerifiedChannelID(std::string()); | |
882 channel_ = CreateChannelProxy(channel_id); | |
883 | 880 |
884 // Note that Channel send is effectively paused and unpaused at various points | 881 // Note that Channel send is effectively paused and unpaused at various points |
885 // during startup, and existing code relies on a fragile relative message | 882 // during startup, and existing code relies on a fragile relative message |
886 // ordering resulting from some early messages being queued until process | 883 // ordering resulting from some early messages being queued until process |
887 // launch while others are sent immediately. | 884 // launch while others are sent immediately. |
888 // | 885 // |
889 // We acquire a few associated interface proxies here -- before the channel is | 886 // We acquire a few associated interface proxies here -- before the channel is |
890 // paused -- to ensure that subsequent initialization messages on those | 887 // paused -- to ensure that subsequent initialization messages on those |
891 // interfaces behave properly. Specifically, this avoids the risk of an | 888 // interfaces behave properly. Specifically, this avoids the risk of an |
892 // interface being requested while the Channel is paused, effectively | 889 // interface being requested while the Channel is paused, effectively |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 if (run_renderer_in_process()) { | 923 if (run_renderer_in_process()) { |
927 DCHECK(g_renderer_main_thread_factory); | 924 DCHECK(g_renderer_main_thread_factory); |
928 // Crank up a thread and run the initialization there. With the way that | 925 // Crank up a thread and run the initialization there. With the way that |
929 // messages flow between the browser and renderer, this thread is required | 926 // messages flow between the browser and renderer, this thread is required |
930 // to prevent a deadlock in single-process mode. Since the primordial | 927 // to prevent a deadlock in single-process mode. Since the primordial |
931 // thread in the renderer process runs the WebKit code and can sometimes | 928 // thread in the renderer process runs the WebKit code and can sometimes |
932 // make blocking calls to the UI thread (i.e. this thread), they need to run | 929 // make blocking calls to the UI thread (i.e. this thread), they need to run |
933 // on separate threads. | 930 // on separate threads. |
934 in_process_renderer_.reset( | 931 in_process_renderer_.reset( |
935 g_renderer_main_thread_factory(InProcessChildThreadParams( | 932 g_renderer_main_thread_factory(InProcessChildThreadParams( |
936 channel_id, | |
937 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), | 933 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), |
938 mojo_child_connection_->service_token()))); | 934 mojo_child_connection_->service_token()))); |
939 | 935 |
940 base::Thread::Options options; | 936 base::Thread::Options options; |
941 #if defined(OS_WIN) && !defined(OS_MACOSX) | 937 #if defined(OS_WIN) && !defined(OS_MACOSX) |
942 // In-process plugins require this to be a UI message loop. | 938 // In-process plugins require this to be a UI message loop. |
943 options.message_loop_type = base::MessageLoop::TYPE_UI; | 939 options.message_loop_type = base::MessageLoop::TYPE_UI; |
944 #else | 940 #else |
945 // We can't have multiple UI loops on Linux and Android, so we don't support | 941 // We can't have multiple UI loops on Linux and Android, so we don't support |
946 // in-process plugins. | 942 // in-process plugins. |
(...skipping 10 matching lines...) Expand all Loading... |
957 | 953 |
958 g_in_process_thread = in_process_renderer_->message_loop(); | 954 g_in_process_thread = in_process_renderer_->message_loop(); |
959 | 955 |
960 } else { | 956 } else { |
961 // Build command line for renderer. We call AppendRendererCommandLine() | 957 // Build command line for renderer. We call AppendRendererCommandLine() |
962 // first so the process type argument will appear first. | 958 // first so the process type argument will appear first. |
963 base::CommandLine* cmd_line = new base::CommandLine(renderer_path); | 959 base::CommandLine* cmd_line = new base::CommandLine(renderer_path); |
964 if (!renderer_prefix.empty()) | 960 if (!renderer_prefix.empty()) |
965 cmd_line->PrependWrapper(renderer_prefix); | 961 cmd_line->PrependWrapper(renderer_prefix); |
966 AppendRendererCommandLine(cmd_line); | 962 AppendRendererCommandLine(cmd_line); |
967 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); | |
968 | 963 |
969 // Spawn the child process asynchronously to avoid blocking the UI thread. | 964 // Spawn the child process asynchronously to avoid blocking the UI thread. |
970 // As long as there's no renderer prefix, we can use the zygote process | 965 // As long as there's no renderer prefix, we can use the zygote process |
971 // at this stage. | 966 // at this stage. |
972 child_process_launcher_.reset(new ChildProcessLauncher( | 967 child_process_launcher_.reset(new ChildProcessLauncher( |
973 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line, | 968 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line, |
974 GetID(), this, child_token_, | 969 GetID(), this, child_token_, |
975 base::Bind(&RenderProcessHostImpl::OnMojoError, | 970 base::Bind(&RenderProcessHostImpl::OnMojoError, |
976 weak_factory_.GetWeakPtr(), | 971 weak_factory_.GetWeakPtr(), |
977 base::ThreadTaskRunnerHandle::Get()))); | 972 base::ThreadTaskRunnerHandle::Get()))); |
(...skipping 15 matching lines...) Expand all Loading... |
993 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); | 988 ui::GpuSwitchingManager::GetInstance()->AddObserver(this); |
994 } | 989 } |
995 | 990 |
996 power_monitor_broadcaster_.Init(); | 991 power_monitor_broadcaster_.Init(); |
997 | 992 |
998 is_initialized_ = true; | 993 is_initialized_ = true; |
999 init_time_ = base::TimeTicks::Now(); | 994 init_time_ = base::TimeTicks::Now(); |
1000 return true; | 995 return true; |
1001 } | 996 } |
1002 | 997 |
1003 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy( | 998 std::unique_ptr<IPC::ChannelProxy> RenderProcessHostImpl::CreateChannelProxy() { |
1004 const std::string& channel_id) { | |
1005 scoped_refptr<base::SingleThreadTaskRunner> runner = | 999 scoped_refptr<base::SingleThreadTaskRunner> runner = |
1006 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); | 1000 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); |
1007 IPC::mojom::ChannelBootstrapPtr bootstrap; | 1001 IPC::mojom::ChannelBootstrapPtr bootstrap; |
1008 GetRemoteInterfaces()->GetInterface(&bootstrap); | 1002 GetRemoteInterfaces()->GetInterface(&bootstrap); |
1009 std::unique_ptr<IPC::ChannelFactory> channel_factory = | 1003 std::unique_ptr<IPC::ChannelFactory> channel_factory = |
1010 IPC::ChannelMojo::CreateServerFactory( | 1004 IPC::ChannelMojo::CreateServerFactory( |
1011 bootstrap.PassInterface().PassHandle(), runner); | 1005 bootstrap.PassInterface().PassHandle(), runner); |
1012 | 1006 |
1013 std::unique_ptr<IPC::ChannelProxy> channel; | 1007 std::unique_ptr<IPC::ChannelProxy> channel; |
1014 // Do NOT expand ifdef or run time condition checks here! Synchronous | 1008 // Do NOT expand ifdef or run time condition checks here! Synchronous |
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3046 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; | 3040 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; |
3047 | 3041 |
3048 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias | 3042 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias |
3049 // enough information here so that we can determine what the bad message was. | 3043 // enough information here so that we can determine what the bad message was. |
3050 base::debug::Alias(&error); | 3044 base::debug::Alias(&error); |
3051 bad_message::ReceivedBadMessage(process.get(), | 3045 bad_message::ReceivedBadMessage(process.get(), |
3052 bad_message::RPH_MOJO_PROCESS_ERROR); | 3046 bad_message::RPH_MOJO_PROCESS_ERROR); |
3053 } | 3047 } |
3054 | 3048 |
3055 } // namespace content | 3049 } // namespace content |
OLD | NEW |