| 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 // 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> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #if defined(OS_POSIX) | 14 #if defined(OS_POSIX) |
| 15 #include <utility> // for pair<> | 15 #include <utility> // for pair<> |
| 16 #endif | 16 #endif |
| 17 | 17 |
| 18 #include "base/base_switches.h" | 18 #include "base/base_switches.h" |
| 19 #include "base/bind.h" | 19 #include "base/bind.h" |
| 20 #include "base/bind_helpers.h" | 20 #include "base/bind_helpers.h" |
| 21 #include "base/callback.h" | 21 #include "base/callback.h" |
| 22 #include "base/command_line.h" | 22 #include "base/command_line.h" |
| 23 #include "base/debug/trace_event.h" | 23 #include "base/debug/trace_event.h" |
| 24 #include "base/files/file.h" | 24 #include "base/files/file.h" |
| 25 #include "base/lazy_instance.h" | 25 #include "base/lazy_instance.h" |
| 26 #include "base/logging.h" | 26 #include "base/logging.h" |
| 27 #include "base/metrics/field_trial.h" | 27 #include "base/metrics/field_trial.h" |
| 28 #include "base/metrics/histogram.h" | 28 #include "base/metrics/histogram.h" |
| 29 #include "base/numerics/safe_math.h" |
| 29 #include "base/path_service.h" | 30 #include "base/path_service.h" |
| 30 #include "base/rand_util.h" | 31 #include "base/rand_util.h" |
| 31 #include "base/stl_util.h" | 32 #include "base/stl_util.h" |
| 32 #include "base/strings/string_util.h" | 33 #include "base/strings/string_util.h" |
| 33 #include "base/supports_user_data.h" | 34 #include "base/supports_user_data.h" |
| 34 #include "base/sys_info.h" | 35 #include "base/sys_info.h" |
| 35 #include "base/threading/thread.h" | 36 #include "base/threading/thread.h" |
| 36 #include "base/threading/thread_restrictions.h" | 37 #include "base/threading/thread_restrictions.h" |
| 37 #include "base/tracked_objects.h" | 38 #include "base/tracked_objects.h" |
| 38 #include "cc/base/switches.h" | 39 #include "cc/base/switches.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 #include "content/browser/storage_partition_impl.h" | 105 #include "content/browser/storage_partition_impl.h" |
| 105 #include "content/browser/streams/stream_context.h" | 106 #include "content/browser/streams/stream_context.h" |
| 106 #include "content/browser/tracing/trace_message_filter.h" | 107 #include "content/browser/tracing/trace_message_filter.h" |
| 107 #include "content/browser/vibration/vibration_message_filter.h" | 108 #include "content/browser/vibration/vibration_message_filter.h" |
| 108 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 109 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
| 109 #include "content/browser/worker_host/worker_message_filter.h" | 110 #include "content/browser/worker_host/worker_message_filter.h" |
| 110 #include "content/browser/worker_host/worker_storage_partition.h" | 111 #include "content/browser/worker_host/worker_storage_partition.h" |
| 111 #include "content/common/child_process_host_impl.h" | 112 #include "content/common/child_process_host_impl.h" |
| 112 #include "content/common/child_process_messages.h" | 113 #include "content/common/child_process_messages.h" |
| 113 #include "content/common/content_switches_internal.h" | 114 #include "content/common/content_switches_internal.h" |
| 115 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" |
| 116 #include "content/common/gpu/client/gpu_memory_buffer_impl_shm.h" |
| 114 #include "content/common/gpu/gpu_messages.h" | 117 #include "content/common/gpu/gpu_messages.h" |
| 115 #include "content/common/mojo/mojo_messages.h" | 118 #include "content/common/mojo/mojo_messages.h" |
| 116 #include "content/common/resource_messages.h" | 119 #include "content/common/resource_messages.h" |
| 117 #include "content/common/view_messages.h" | 120 #include "content/common/view_messages.h" |
| 118 #include "content/public/browser/browser_context.h" | 121 #include "content/public/browser/browser_context.h" |
| 119 #include "content/public/browser/content_browser_client.h" | 122 #include "content/public/browser/content_browser_client.h" |
| 120 #include "content/public/browser/notification_service.h" | 123 #include "content/public/browser/notification_service.h" |
| 121 #include "content/public/browser/notification_types.h" | 124 #include "content/public/browser/notification_types.h" |
| 122 #include "content/public/browser/render_process_host_factory.h" | 125 #include "content/public/browser/render_process_host_factory.h" |
| 123 #include "content/public/browser/render_process_host_observer.h" | 126 #include "content/public/browser/render_process_host_observer.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 145 #include "ui/base/ui_base_switches.h" | 148 #include "ui/base/ui_base_switches.h" |
| 146 #include "ui/events/event_switches.h" | 149 #include "ui/events/event_switches.h" |
| 147 #include "ui/gfx/switches.h" | 150 #include "ui/gfx/switches.h" |
| 148 #include "ui/gl/gl_switches.h" | 151 #include "ui/gl/gl_switches.h" |
| 149 #include "ui/native_theme/native_theme_switches.h" | 152 #include "ui/native_theme/native_theme_switches.h" |
| 150 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" | 153 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" |
| 151 #include "webkit/common/resource_type.h" | 154 #include "webkit/common/resource_type.h" |
| 152 | 155 |
| 153 #if defined(OS_ANDROID) | 156 #if defined(OS_ANDROID) |
| 154 #include "content/browser/media/android/browser_demuxer_android.h" | 157 #include "content/browser/media/android/browser_demuxer_android.h" |
| 158 #include "content/browser/renderer_host/compositor_impl_android.h" |
| 159 #include "content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.h" |
| 160 #endif |
| 161 |
| 162 #if defined(OS_MACOSX) |
| 163 #include "content/common/gpu/client/gpu_memory_buffer_impl_io_surface.h" |
| 164 #include "ui/gl/io_surface_support_mac.h" |
| 155 #endif | 165 #endif |
| 156 | 166 |
| 157 #if defined(OS_WIN) | 167 #if defined(OS_WIN) |
| 158 #include "base/win/scoped_com_initializer.h" | 168 #include "base/win/scoped_com_initializer.h" |
| 159 #include "content/common/font_cache_dispatcher_win.h" | 169 #include "content/common/font_cache_dispatcher_win.h" |
| 160 #include "content/common/sandbox_win.h" | 170 #include "content/common/sandbox_win.h" |
| 161 #endif | 171 #endif |
| 162 | 172 |
| 163 #if defined(ENABLE_WEBRTC) | 173 #if defined(ENABLE_WEBRTC) |
| 164 #include "content/browser/media/webrtc_internals.h" | 174 #include "content/browser/media/webrtc_internals.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 return ipc_fd_; | 329 return ipc_fd_; |
| 320 } | 330 } |
| 321 #endif // OS_WIN | 331 #endif // OS_WIN |
| 322 | 332 |
| 323 private: | 333 private: |
| 324 #if defined(OS_POSIX) | 334 #if defined(OS_POSIX) |
| 325 int ipc_fd_; | 335 int ipc_fd_; |
| 326 #endif // OS_POSIX | 336 #endif // OS_POSIX |
| 327 }; | 337 }; |
| 328 | 338 |
| 339 #if defined(OS_MACOSX) |
| 340 void AddBooleanValue(CFMutableDictionaryRef dictionary, |
| 341 const CFStringRef key, |
| 342 bool value) { |
| 343 CFDictionaryAddValue( |
| 344 dictionary, key, value ? kCFBooleanTrue : kCFBooleanFalse); |
| 345 } |
| 346 |
| 347 void AddIntegerValue(CFMutableDictionaryRef dictionary, |
| 348 const CFStringRef key, |
| 349 int32 value) { |
| 350 base::ScopedCFTypeRef<CFNumberRef> number( |
| 351 CFNumberCreate(NULL, kCFNumberSInt32Type, &value)); |
| 352 CFDictionaryAddValue(dictionary, key, number.get()); |
| 353 } |
| 354 #endif |
| 355 |
| 329 } // namespace | 356 } // namespace |
| 330 | 357 |
| 331 RendererMainThreadFactoryFunction g_renderer_main_thread_factory = NULL; | 358 RendererMainThreadFactoryFunction g_renderer_main_thread_factory = NULL; |
| 332 | 359 |
| 333 base::MessageLoop* g_in_process_thread; | 360 base::MessageLoop* g_in_process_thread; |
| 334 | 361 |
| 335 base::MessageLoop* | 362 base::MessageLoop* |
| 336 RenderProcessHostImpl::GetInProcessRendererThreadForTesting() { | 363 RenderProcessHostImpl::GetInProcessRendererThreadForTesting() { |
| 337 return g_in_process_thread; | 364 return g_in_process_thread; |
| 338 } | 365 } |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 queued_messages_.pop(); | 520 queued_messages_.pop(); |
| 494 } | 521 } |
| 495 | 522 |
| 496 UnregisterHost(GetID()); | 523 UnregisterHost(GetID()); |
| 497 | 524 |
| 498 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 525 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 499 switches::kDisableGpuShaderDiskCache)) { | 526 switches::kDisableGpuShaderDiskCache)) { |
| 500 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 527 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 501 base::Bind(&RemoveShaderInfo, GetID())); | 528 base::Bind(&RemoveShaderInfo, GetID())); |
| 502 } | 529 } |
| 530 |
| 531 #if defined(OS_ANDROID) |
| 532 CompositorImpl::DestroyAllSurfaceTextures(GetID()); |
| 533 #endif |
| 503 } | 534 } |
| 504 | 535 |
| 505 void RenderProcessHostImpl::EnableSendQueue() { | 536 void RenderProcessHostImpl::EnableSendQueue() { |
| 506 is_initialized_ = false; | 537 is_initialized_ = false; |
| 507 } | 538 } |
| 508 | 539 |
| 509 bool RenderProcessHostImpl::Init() { | 540 bool RenderProcessHostImpl::Init() { |
| 510 // calling Init() more than once does nothing, this makes it more convenient | 541 // calling Init() more than once does nothing, this makes it more convenient |
| 511 // for the view host which may not be sure in some cases | 542 // for the view host which may not be sure in some cases |
| 512 if (channel_) | 543 if (channel_) |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 IPC_BEGIN_MESSAGE_MAP(RenderProcessHostImpl, msg) | 1338 IPC_BEGIN_MESSAGE_MAP(RenderProcessHostImpl, msg) |
| 1308 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest, | 1339 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ShutdownRequest, |
| 1309 OnShutdownRequest) | 1340 OnShutdownRequest) |
| 1310 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone, | 1341 IPC_MESSAGE_HANDLER(ChildProcessHostMsg_DumpHandlesDone, |
| 1311 OnDumpHandlesDone) | 1342 OnDumpHandlesDone) |
| 1312 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, | 1343 IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged, |
| 1313 SuddenTerminationChanged) | 1344 SuddenTerminationChanged) |
| 1314 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, | 1345 IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction, |
| 1315 OnUserMetricsRecordAction) | 1346 OnUserMetricsRecordAction) |
| 1316 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML) | 1347 IPC_MESSAGE_HANDLER(ViewHostMsg_SavedPageAsMHTML, OnSavedPageAsMHTML) |
| 1348 IPC_MESSAGE_HANDLER_DELAY_REPLY( |
| 1349 ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer, |
| 1350 OnAllocateGpuMemoryBuffer) |
| 1317 // Adding single handlers for your service here is fine, but once your | 1351 // Adding single handlers for your service here is fine, but once your |
| 1318 // service needs more than one handler, please extract them into a new | 1352 // service needs more than one handler, please extract them into a new |
| 1319 // message filter and add that filter to CreateMessageFilters(). | 1353 // message filter and add that filter to CreateMessageFilters(). |
| 1320 IPC_END_MESSAGE_MAP() | 1354 IPC_END_MESSAGE_MAP() |
| 1321 | 1355 |
| 1322 return true; | 1356 return true; |
| 1323 } | 1357 } |
| 1324 | 1358 |
| 1325 // Dispatch incoming messages to the appropriate IPC::Listener. | 1359 // Dispatch incoming messages to the appropriate IPC::Listener. |
| 1326 IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); | 1360 IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); |
| (...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2106 mojo::ScopedMessagePipeHandle handle) { | 2140 mojo::ScopedMessagePipeHandle handle) { |
| 2107 mojo_activation_required_ = true; | 2141 mojo_activation_required_ = true; |
| 2108 MaybeActivateMojo(); | 2142 MaybeActivateMojo(); |
| 2109 | 2143 |
| 2110 mojo_application_host_->service_provider()->ConnectToService( | 2144 mojo_application_host_->service_provider()->ConnectToService( |
| 2111 mojo::String::From(service_name), | 2145 mojo::String::From(service_name), |
| 2112 std::string(), | 2146 std::string(), |
| 2113 handle.Pass()); | 2147 handle.Pass()); |
| 2114 } | 2148 } |
| 2115 | 2149 |
| 2150 void RenderProcessHostImpl::OnAllocateGpuMemoryBuffer(uint32 width, |
| 2151 uint32 height, |
| 2152 uint32 internalformat, |
| 2153 uint32 usage, |
| 2154 IPC::Message* reply) { |
| 2155 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 2156 if (!GpuMemoryBufferImpl::IsFormatValid(internalformat) || |
| 2157 !GpuMemoryBufferImpl::IsUsageValid(usage)) { |
| 2158 GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle()); |
| 2159 return; |
| 2160 } |
| 2161 base::CheckedNumeric<int> size = width; |
| 2162 size *= height; |
| 2163 if (!size.IsValid()) { |
| 2164 GpuMemoryBufferAllocated(reply, gfx::GpuMemoryBufferHandle()); |
| 2165 return; |
| 2166 } |
| 2167 |
| 2168 #if defined(OS_MACOSX) |
| 2169 // TODO(reveman): This should be moved to |
| 2170 // GpuMemoryBufferImpl::AllocateForChildProcess and |
| 2171 // GpuMemoryBufferImplIOSurface. crbug.com/325045, crbug.com/323304 |
| 2172 if (GpuMemoryBufferImplIOSurface::IsConfigurationSupported(internalformat, |
| 2173 usage)) { |
| 2174 IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize(); |
| 2175 if (io_surface_support) { |
| 2176 base::ScopedCFTypeRef<CFMutableDictionaryRef> properties; |
| 2177 properties.reset( |
| 2178 CFDictionaryCreateMutable(kCFAllocatorDefault, |
| 2179 0, |
| 2180 &kCFTypeDictionaryKeyCallBacks, |
| 2181 &kCFTypeDictionaryValueCallBacks)); |
| 2182 AddIntegerValue( |
| 2183 properties, io_surface_support->GetKIOSurfaceWidth(), width); |
| 2184 AddIntegerValue( |
| 2185 properties, io_surface_support->GetKIOSurfaceHeight(), height); |
| 2186 AddIntegerValue(properties, |
| 2187 io_surface_support->GetKIOSurfaceBytesPerElement(), |
| 2188 GpuMemoryBufferImpl::BytesPerPixel(internalformat)); |
| 2189 AddIntegerValue( |
| 2190 properties, |
| 2191 io_surface_support->GetKIOSurfacePixelFormat(), |
| 2192 GpuMemoryBufferImplIOSurface::PixelFormat(internalformat)); |
| 2193 // TODO(reveman): Remove this when using a mach_port_t to transfer |
| 2194 // IOSurface to renderer process. crbug.com/323304 |
| 2195 AddBooleanValue( |
| 2196 properties, io_surface_support->GetKIOSurfaceIsGlobal(), true); |
| 2197 |
| 2198 base::ScopedCFTypeRef<CFTypeRef> io_surface( |
| 2199 io_surface_support->IOSurfaceCreate(properties)); |
| 2200 if (io_surface) { |
| 2201 gfx::GpuMemoryBufferHandle handle; |
| 2202 handle.type = gfx::IO_SURFACE_BUFFER; |
| 2203 handle.io_surface_id = io_surface_support->IOSurfaceGetID(io_surface); |
| 2204 |
| 2205 // TODO(reveman): This makes the assumption that the renderer will |
| 2206 // grab a reference to the surface before sending another message. |
| 2207 // crbug.com/325045 |
| 2208 last_io_surface_ = io_surface; |
| 2209 GpuMemoryBufferAllocated(reply, handle); |
| 2210 return; |
| 2211 } |
| 2212 } |
| 2213 } |
| 2214 #endif |
| 2215 |
| 2216 #if defined(OS_ANDROID) |
| 2217 // TODO(reveman): This should be moved to |
| 2218 // GpuMemoryBufferImpl::AllocateForChildProcess and |
| 2219 // GpuMemoryBufferImplSurfaceTexture when adding support for out-of-process |
| 2220 // GPU service. crbug.com/368716 |
| 2221 if (GpuMemoryBufferImplSurfaceTexture::IsConfigurationSupported( |
| 2222 internalformat, usage)) { |
| 2223 // Each surface texture is associated with a render process id. This allows |
| 2224 // the GPU service and Java Binder IPC to verify that a renderer is not |
| 2225 // trying to use a surface texture it doesn't own. |
| 2226 int surface_texture_id = CompositorImpl::CreateSurfaceTexture(GetID()); |
| 2227 if (surface_texture_id != -1) { |
| 2228 gfx::GpuMemoryBufferHandle handle; |
| 2229 handle.type = gfx::SURFACE_TEXTURE_BUFFER; |
| 2230 handle.surface_texture_id = |
| 2231 gfx::SurfaceTextureId(surface_texture_id, GetID()); |
| 2232 GpuMemoryBufferAllocated(reply, handle); |
| 2233 return; |
| 2234 } |
| 2235 } |
| 2236 #endif |
| 2237 |
| 2238 GpuMemoryBufferImpl::AllocateForChildProcess( |
| 2239 gfx::Size(width, height), |
| 2240 internalformat, |
| 2241 usage, |
| 2242 GetHandle(), |
| 2243 base::Bind(&RenderProcessHostImpl::GpuMemoryBufferAllocated, |
| 2244 weak_factory_.GetWeakPtr(), |
| 2245 reply)); |
| 2246 } |
| 2247 |
| 2248 void RenderProcessHostImpl::GpuMemoryBufferAllocated( |
| 2249 IPC::Message* reply, |
| 2250 const gfx::GpuMemoryBufferHandle& handle) { |
| 2251 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 2252 ChildProcessHostMsg_SyncAllocateGpuMemoryBuffer::WriteReplyParams(reply, |
| 2253 handle); |
| 2254 Send(reply); |
| 2255 } |
| 2256 |
| 2116 } // namespace content | 2257 } // namespace content |
| OLD | NEW |