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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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" | 175 #include "ipc/ipc_switches.h" |
176 #include "media/base/media_switches.h" | 176 #include "media/base/media_switches.h" |
177 #include "mojo/edk/embedder/embedder.h" | 177 #include "mojo/edk/embedder/embedder.h" |
| 178 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" |
178 #include "net/url_request/url_request_context_getter.h" | 179 #include "net/url_request/url_request_context_getter.h" |
179 #include "ppapi/shared_impl/ppapi_switches.h" | 180 #include "ppapi/shared_impl/ppapi_switches.h" |
180 #include "services/shell/public/cpp/connection.h" | 181 #include "services/shell/public/cpp/connection.h" |
181 #include "services/shell/public/cpp/interface_provider.h" | 182 #include "services/shell/public/cpp/interface_provider.h" |
182 #include "services/shell/public/cpp/interface_registry.h" | 183 #include "services/shell/public/cpp/interface_registry.h" |
183 #include "services/shell/runner/common/switches.h" | 184 #include "services/shell/runner/common/switches.h" |
184 #include "storage/browser/fileapi/sandbox_file_system_backend.h" | 185 #include "storage/browser/fileapi/sandbox_file_system_backend.h" |
185 #include "third_party/skia/include/core/SkBitmap.h" | 186 #include "third_party/skia/include/core/SkBitmap.h" |
186 #include "ui/base/ui_base_switches.h" | 187 #include "ui/base/ui_base_switches.h" |
187 #include "ui/display/display_switches.h" | 188 #include "ui/display/display_switches.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 | 243 |
243 #if defined(OS_WIN) | 244 #if defined(OS_WIN) |
244 #define IntToStringType base::IntToString16 | 245 #define IntToStringType base::IntToString16 |
245 #else | 246 #else |
246 #define IntToStringType base::IntToString | 247 #define IntToStringType base::IntToString |
247 #endif | 248 #endif |
248 | 249 |
249 namespace content { | 250 namespace content { |
250 namespace { | 251 namespace { |
251 | 252 |
| 253 const char kRendererInterfaceKeyName[] = "mojom_renderer_interface"; |
252 const char kSiteProcessMapKeyName[] = "content_site_process_map"; | 254 const char kSiteProcessMapKeyName[] = "content_site_process_map"; |
253 | 255 |
254 #ifdef ENABLE_WEBRTC | 256 #ifdef ENABLE_WEBRTC |
255 const base::FilePath::CharType kAecDumpFileNameAddition[] = | 257 const base::FilePath::CharType kAecDumpFileNameAddition[] = |
256 FILE_PATH_LITERAL("aec_dump"); | 258 FILE_PATH_LITERAL("aec_dump"); |
257 #endif | 259 #endif |
258 | 260 |
259 void CacheShaderInfo(int32_t id, base::FilePath path) { | 261 void CacheShaderInfo(int32_t id, base::FilePath path) { |
260 ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path); | 262 ShaderCacheFactory::GetInstance()->SetCacheInfo(id, path); |
261 } | 263 } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 DCHECK(context); | 360 DCHECK(context); |
359 SiteProcessMap* map = static_cast<SiteProcessMap*>( | 361 SiteProcessMap* map = static_cast<SiteProcessMap*>( |
360 context->GetUserData(kSiteProcessMapKeyName)); | 362 context->GetUserData(kSiteProcessMapKeyName)); |
361 if (!map) { | 363 if (!map) { |
362 map = new SiteProcessMap(); | 364 map = new SiteProcessMap(); |
363 context->SetUserData(kSiteProcessMapKeyName, map); | 365 context->SetUserData(kSiteProcessMapKeyName, map); |
364 } | 366 } |
365 return map; | 367 return map; |
366 } | 368 } |
367 | 369 |
| 370 // Holds a Mojo associated interface proxy in an RPH's user data. |
| 371 template <typename Interface> |
| 372 class AssociatedInterfaceHolder : public base::SupportsUserData::Data { |
| 373 public: |
| 374 AssociatedInterfaceHolder() {} |
| 375 ~AssociatedInterfaceHolder() override {} |
| 376 |
| 377 mojo::AssociatedInterfacePtr<Interface>& proxy() { return proxy_; } |
| 378 |
| 379 private: |
| 380 mojo::AssociatedInterfacePtr<Interface> proxy_; |
| 381 |
| 382 DISALLOW_COPY_AND_ASSIGN(AssociatedInterfaceHolder); |
| 383 }; |
| 384 |
368 #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | 385 #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) |
369 // This static member variable holds the zygote communication information for | 386 // This static member variable holds the zygote communication information for |
370 // the renderer. | 387 // the renderer. |
371 ZygoteHandle g_render_zygote; | 388 ZygoteHandle g_render_zygote; |
372 #endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | 389 #endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) |
373 | 390 |
374 // NOTE: changes to this class need to be reviewed by the security team. | 391 // NOTE: changes to this class need to be reviewed by the security team. |
375 class RendererSandboxedProcessLauncherDelegate | 392 class RendererSandboxedProcessLauncherDelegate |
376 : public SandboxedProcessLauncherDelegate { | 393 : public SandboxedProcessLauncherDelegate { |
377 public: | 394 public: |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 | 848 |
832 bool RenderProcessHostImpl::Init() { | 849 bool RenderProcessHostImpl::Init() { |
833 // calling Init() more than once does nothing, this makes it more convenient | 850 // calling Init() more than once does nothing, this makes it more convenient |
834 // for the view host which may not be sure in some cases | 851 // for the view host which may not be sure in some cases |
835 if (channel_) | 852 if (channel_) |
836 return true; | 853 return true; |
837 | 854 |
838 // Ensure that the remote associated interfaces are re-initialized on next | 855 // Ensure that the remote associated interfaces are re-initialized on next |
839 // access since they're associated with a specific Channel instance. | 856 // access since they're associated with a specific Channel instance. |
840 remote_route_provider_.reset(); | 857 remote_route_provider_.reset(); |
841 renderer_interface_.reset(); | 858 RemoveUserData(kRendererInterfaceKeyName); |
842 | 859 |
843 base::CommandLine::StringType renderer_prefix; | 860 base::CommandLine::StringType renderer_prefix; |
844 // A command prefix is something prepended to the command line of the spawned | 861 // A command prefix is something prepended to the command line of the spawned |
845 // process. | 862 // process. |
846 const base::CommandLine& browser_command_line = | 863 const base::CommandLine& browser_command_line = |
847 *base::CommandLine::ForCurrentProcess(); | 864 *base::CommandLine::ForCurrentProcess(); |
848 renderer_prefix = | 865 renderer_prefix = |
849 browser_command_line.GetSwitchValueNative(switches::kRendererCmdPrefix); | 866 browser_command_line.GetSwitchValueNative(switches::kRendererCmdPrefix); |
850 | 867 |
851 #if defined(OS_LINUX) | 868 #if defined(OS_LINUX) |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1387 } | 1404 } |
1388 | 1405 |
1389 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() { | 1406 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() { |
1390 if (!remote_route_provider_) { | 1407 if (!remote_route_provider_) { |
1391 DCHECK(channel_); | 1408 DCHECK(channel_); |
1392 channel_->GetRemoteAssociatedInterface(&remote_route_provider_); | 1409 channel_->GetRemoteAssociatedInterface(&remote_route_provider_); |
1393 } | 1410 } |
1394 return remote_route_provider_.get(); | 1411 return remote_route_provider_.get(); |
1395 } | 1412 } |
1396 | 1413 |
1397 mojom::Renderer* RenderProcessHostImpl::GetRendererInterface() { | 1414 // static |
1398 if (!renderer_interface_) { | 1415 mojom::Renderer* RenderProcessHostImpl::GetRendererInterface( |
1399 DCHECK(channel_); | 1416 RenderProcessHost* host) { |
1400 channel_->GetRemoteAssociatedInterface(&renderer_interface_); | 1417 AssociatedInterfaceHolder<mojom::Renderer>* holder = |
| 1418 static_cast<AssociatedInterfaceHolder<mojom::Renderer>*>( |
| 1419 host->GetUserData(kRendererInterfaceKeyName)); |
| 1420 if (!holder) { |
| 1421 holder = new AssociatedInterfaceHolder<mojom::Renderer>; |
| 1422 |
| 1423 // Takes ownership of |holder|. |
| 1424 host->SetUserData(kRendererInterfaceKeyName, holder); |
| 1425 |
| 1426 // In tests, GetChannel() is null. We bind the proxy to a dead-end endpoint |
| 1427 // so that its outgoing requests are be silently dropped. |
| 1428 IPC::ChannelProxy* channel = host->GetChannel(); |
| 1429 if (channel) |
| 1430 channel->GetRemoteAssociatedInterface(&holder->proxy()); |
| 1431 else |
| 1432 mojo::GetDummyProxyForTesting(&holder->proxy()); |
1401 } | 1433 } |
1402 return renderer_interface_.get(); | 1434 |
| 1435 return holder->proxy().get(); |
1403 } | 1436 } |
1404 | 1437 |
1405 void RenderProcessHostImpl::AddRoute(int32_t routing_id, | 1438 void RenderProcessHostImpl::AddRoute(int32_t routing_id, |
1406 IPC::Listener* listener) { | 1439 IPC::Listener* listener) { |
1407 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " | 1440 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " |
1408 << routing_id; | 1441 << routing_id; |
1409 listeners_.AddWithID(listener, routing_id); | 1442 listeners_.AddWithID(listener, routing_id); |
1410 } | 1443 } |
1411 | 1444 |
1412 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) { | 1445 void RenderProcessHostImpl::RemoveRoute(int32_t routing_id) { |
(...skipping 1589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3002 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; | 3035 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; |
3003 | 3036 |
3004 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias | 3037 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias |
3005 // enough information here so that we can determine what the bad message was. | 3038 // enough information here so that we can determine what the bad message was. |
3006 base::debug::Alias(&error); | 3039 base::debug::Alias(&error); |
3007 bad_message::ReceivedBadMessage(process.get(), | 3040 bad_message::ReceivedBadMessage(process.get(), |
3008 bad_message::RPH_MOJO_PROCESS_ERROR); | 3041 bad_message::RPH_MOJO_PROCESS_ERROR); |
3009 } | 3042 } |
3010 | 3043 |
3011 } // namespace content | 3044 } // namespace content |
OLD | NEW |