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/renderer/render_thread_impl.h" | 5 #include "content/renderer/render_thread_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <map> | 9 #include <map> |
10 #include <vector> | 10 #include <vector> |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #include "content/child/worker_task_runner.h" | 44 #include "content/child/worker_task_runner.h" |
45 #include "content/common/child_process_messages.h" | 45 #include "content/common/child_process_messages.h" |
46 #include "content/common/content_constants_internal.h" | 46 #include "content/common/content_constants_internal.h" |
47 #include "content/common/database_messages.h" | 47 #include "content/common/database_messages.h" |
48 #include "content/common/dom_storage/dom_storage_messages.h" | 48 #include "content/common/dom_storage/dom_storage_messages.h" |
49 #include "content/common/gpu/client/context_provider_command_buffer.h" | 49 #include "content/common/gpu/client/context_provider_command_buffer.h" |
50 #include "content/common/gpu/client/gpu_channel_host.h" | 50 #include "content/common/gpu/client/gpu_channel_host.h" |
51 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" | 51 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" |
52 #include "content/common/gpu/gpu_messages.h" | 52 #include "content/common/gpu/gpu_messages.h" |
53 #include "content/common/gpu/gpu_process_launch_causes.h" | 53 #include "content/common/gpu/gpu_process_launch_causes.h" |
54 #include "content/common/mojo/mojo_service_names.h" | 54 #include "content/common/render_frame_setup.mojom.h" |
55 #include "content/common/resource_messages.h" | 55 #include "content/common/resource_messages.h" |
56 #include "content/common/view_messages.h" | 56 #include "content/common/view_messages.h" |
57 #include "content/common/worker_messages.h" | 57 #include "content/common/worker_messages.h" |
58 #include "content/public/common/content_constants.h" | 58 #include "content/public/common/content_constants.h" |
59 #include "content/public/common/content_paths.h" | 59 #include "content/public/common/content_paths.h" |
60 #include "content/public/common/content_switches.h" | 60 #include "content/public/common/content_switches.h" |
61 #include "content/public/common/renderer_preferences.h" | 61 #include "content/public/common/renderer_preferences.h" |
62 #include "content/public/common/url_constants.h" | 62 #include "content/public/common/url_constants.h" |
63 #include "content/public/renderer/content_renderer_client.h" | 63 #include "content/public/renderer/content_renderer_client.h" |
64 #include "content/public/renderer/render_process_observer.h" | 64 #include "content/public/renderer/render_process_observer.h" |
(...skipping 23 matching lines...) Expand all Loading... |
88 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" | 88 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" |
89 #include "content/renderer/media/webrtc_identity_service.h" | 89 #include "content/renderer/media/webrtc_identity_service.h" |
90 #include "content/renderer/net_info_helper.h" | 90 #include "content/renderer/net_info_helper.h" |
91 #include "content/renderer/p2p/socket_dispatcher.h" | 91 #include "content/renderer/p2p/socket_dispatcher.h" |
92 #include "content/renderer/render_process_impl.h" | 92 #include "content/renderer/render_process_impl.h" |
93 #include "content/renderer/render_view_impl.h" | 93 #include "content/renderer/render_view_impl.h" |
94 #include "content/renderer/renderer_webkitplatformsupport_impl.h" | 94 #include "content/renderer/renderer_webkitplatformsupport_impl.h" |
95 #include "content/renderer/service_worker/embedded_worker_context_message_filter
.h" | 95 #include "content/renderer/service_worker/embedded_worker_context_message_filter
.h" |
96 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" | 96 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" |
97 #include "content/renderer/shared_worker/embedded_shared_worker_stub.h" | 97 #include "content/renderer/shared_worker/embedded_shared_worker_stub.h" |
98 #include "content/renderer/web_ui_setup_impl.h" | |
99 #include "grit/content_resources.h" | 98 #include "grit/content_resources.h" |
100 #include "ipc/ipc_channel_handle.h" | 99 #include "ipc/ipc_channel_handle.h" |
101 #include "ipc/ipc_forwarding_message_filter.h" | 100 #include "ipc/ipc_forwarding_message_filter.h" |
102 #include "ipc/ipc_platform_file.h" | 101 #include "ipc/ipc_platform_file.h" |
103 #include "media/base/audio_hardware_config.h" | 102 #include "media/base/audio_hardware_config.h" |
104 #include "media/base/media.h" | 103 #include "media/base/media.h" |
105 #include "media/filters/gpu_video_accelerator_factories.h" | 104 #include "media/filters/gpu_video_accelerator_factories.h" |
106 #include "mojo/common/common_type_converters.h" | 105 #include "mojo/common/common_type_converters.h" |
107 #include "net/base/net_errors.h" | 106 #include "net/base/net_errors.h" |
108 #include "net/base/net_util.h" | 107 #include "net/base/net_util.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 blink::enableLogChannel(t.token().c_str()); | 258 blink::enableLogChannel(t.token().c_str()); |
260 } | 259 } |
261 | 260 |
262 void NotifyTimezoneChangeOnThisThread() { | 261 void NotifyTimezoneChangeOnThisThread() { |
263 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 262 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
264 if (!isolate) | 263 if (!isolate) |
265 return; | 264 return; |
266 v8::Date::DateTimeConfigurationChangeNotification(isolate); | 265 v8::Date::DateTimeConfigurationChangeNotification(isolate); |
267 } | 266 } |
268 | 267 |
| 268 class RenderFrameSetupImpl : public mojo::InterfaceImpl<RenderFrameSetup> { |
| 269 public: |
| 270 virtual void GetServiceProviderForFrame( |
| 271 int32_t frame_routing_id, |
| 272 mojo::InterfaceRequest<mojo::IInterfaceProvider> request) OVERRIDE { |
| 273 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| 274 // We can receive a GetServiceProviderForFrame message for a frame not yet |
| 275 // created due to a race between the message and a ViewMsg_New IPC that |
| 276 // triggers creation of the RenderFrame we want. |
| 277 if (!frame) { |
| 278 RenderThreadImpl::current()->RegisterPendingRenderFrameConnect( |
| 279 frame_routing_id, request.PassMessagePipe()); |
| 280 return; |
| 281 } |
| 282 |
| 283 frame->BindServiceRegistry(request.PassMessagePipe()); |
| 284 } |
| 285 |
| 286 virtual void OnConnectionError() OVERRIDE { delete this; } |
| 287 }; |
| 288 |
| 289 void CreateRenderFrameSetup(mojo::InterfaceRequest<RenderFrameSetup> request) { |
| 290 mojo::BindToRequest(new RenderFrameSetupImpl(), &request); |
| 291 } |
| 292 |
269 } // namespace | 293 } // namespace |
270 | 294 |
271 RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() { | 295 RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() { |
272 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal"); | 296 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal"); |
273 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted"); | 297 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted"); |
274 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed"); | 298 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed"); |
275 } | 299 } |
276 | 300 |
277 RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {} | 301 RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {} |
278 | 302 |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 if (base::StringToInt(string_value, &num_raster_threads) && | 525 if (base::StringToInt(string_value, &num_raster_threads) && |
502 num_raster_threads >= kMinRasterThreads && | 526 num_raster_threads >= kMinRasterThreads && |
503 num_raster_threads <= kMaxRasterThreads) { | 527 num_raster_threads <= kMaxRasterThreads) { |
504 cc::RasterWorkerPool::SetNumRasterThreads(num_raster_threads); | 528 cc::RasterWorkerPool::SetNumRasterThreads(num_raster_threads); |
505 } else { | 529 } else { |
506 LOG(WARNING) << "Failed to parse switch " << | 530 LOG(WARNING) << "Failed to parse switch " << |
507 switches::kNumRasterThreads << ": " << string_value; | 531 switches::kNumRasterThreads << ": " << string_value; |
508 } | 532 } |
509 } | 533 } |
510 | 534 |
| 535 service_registry()->AddService<RenderFrameSetup>( |
| 536 base::Bind(CreateRenderFrameSetup)); |
| 537 |
511 TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, ""); | 538 TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, ""); |
512 } | 539 } |
513 | 540 |
514 RenderThreadImpl::~RenderThreadImpl() { | 541 RenderThreadImpl::~RenderThreadImpl() { |
| 542 for (std::map<int, mojo::MessagePipeHandle>::iterator it = |
| 543 pending_render_frame_connects_.begin(); |
| 544 it != pending_render_frame_connects_.end(); |
| 545 ++it) { |
| 546 mojo::CloseRaw(it->second); |
| 547 } |
515 } | 548 } |
516 | 549 |
517 void RenderThreadImpl::Shutdown() { | 550 void RenderThreadImpl::Shutdown() { |
518 FOR_EACH_OBSERVER( | 551 FOR_EACH_OBSERVER( |
519 RenderProcessObserver, observers_, OnRenderProcessShutdown()); | 552 RenderProcessObserver, observers_, OnRenderProcessShutdown()); |
520 | 553 |
521 ChildThread::Shutdown(); | 554 ChildThread::Shutdown(); |
522 | 555 |
523 // Wait for all databases to be closed. | 556 // Wait for all databases to be closed. |
524 if (webkit_platform_support_) { | 557 if (webkit_platform_support_) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 return sync_message_filter(); | 706 return sync_message_filter(); |
674 } | 707 } |
675 | 708 |
676 scoped_refptr<base::MessageLoopProxy> | 709 scoped_refptr<base::MessageLoopProxy> |
677 RenderThreadImpl::GetIOMessageLoopProxy() { | 710 RenderThreadImpl::GetIOMessageLoopProxy() { |
678 return ChildProcess::current()->io_message_loop_proxy(); | 711 return ChildProcess::current()->io_message_loop_proxy(); |
679 } | 712 } |
680 | 713 |
681 void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) { | 714 void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) { |
682 ChildThread::GetRouter()->AddRoute(routing_id, listener); | 715 ChildThread::GetRouter()->AddRoute(routing_id, listener); |
| 716 std::map<int, mojo::MessagePipeHandle>::iterator it = |
| 717 pending_render_frame_connects_.find(routing_id); |
| 718 if (it == pending_render_frame_connects_.end()) |
| 719 return; |
| 720 |
| 721 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id); |
| 722 if (!frame) |
| 723 return; |
| 724 |
| 725 mojo::ScopedMessagePipeHandle handle(it->second); |
| 726 pending_render_frame_connects_.erase(it); |
| 727 frame->BindServiceRegistry(handle.Pass()); |
683 } | 728 } |
684 | 729 |
685 void RenderThreadImpl::RemoveRoute(int32 routing_id) { | 730 void RenderThreadImpl::RemoveRoute(int32 routing_id) { |
686 ChildThread::GetRouter()->RemoveRoute(routing_id); | 731 ChildThread::GetRouter()->RemoveRoute(routing_id); |
687 } | 732 } |
688 | 733 |
689 void RenderThreadImpl::AddEmbeddedWorkerRoute(int32 routing_id, | 734 void RenderThreadImpl::AddEmbeddedWorkerRoute(int32 routing_id, |
690 IPC::Listener* listener) { | 735 IPC::Listener* listener) { |
691 AddRoute(routing_id, listener); | 736 AddRoute(routing_id, listener); |
692 if (devtools_agent_message_filter_.get()) { | 737 if (devtools_agent_message_filter_.get()) { |
693 devtools_agent_message_filter_->AddEmbeddedWorkerRouteOnMainThread( | 738 devtools_agent_message_filter_->AddEmbeddedWorkerRouteOnMainThread( |
694 routing_id); | 739 routing_id); |
695 } | 740 } |
696 } | 741 } |
697 | 742 |
698 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32 routing_id) { | 743 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32 routing_id) { |
699 RemoveRoute(routing_id); | 744 RemoveRoute(routing_id); |
700 if (devtools_agent_message_filter_.get()) { | 745 if (devtools_agent_message_filter_.get()) { |
701 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread( | 746 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread( |
702 routing_id); | 747 routing_id); |
703 } | 748 } |
704 } | 749 } |
705 | 750 |
| 751 void RenderThreadImpl::RegisterPendingRenderFrameConnect( |
| 752 int routing_id, |
| 753 mojo::ScopedMessagePipeHandle handle) { |
| 754 std::pair<std::map<int, mojo::MessagePipeHandle>::iterator, bool> result = |
| 755 pending_render_frame_connects_.insert( |
| 756 std::make_pair(routing_id, handle.release())); |
| 757 CHECK(result.second) << "Inserting a duplicate item."; |
| 758 } |
| 759 |
706 int RenderThreadImpl::GenerateRoutingID() { | 760 int RenderThreadImpl::GenerateRoutingID() { |
707 int routing_id = MSG_ROUTING_NONE; | 761 int routing_id = MSG_ROUTING_NONE; |
708 Send(new ViewHostMsg_GenerateRoutingID(&routing_id)); | 762 Send(new ViewHostMsg_GenerateRoutingID(&routing_id)); |
709 return routing_id; | 763 return routing_id; |
710 } | 764 } |
711 | 765 |
712 void RenderThreadImpl::AddFilter(IPC::MessageFilter* filter) { | 766 void RenderThreadImpl::AddFilter(IPC::MessageFilter* filter) { |
713 channel()->AddFilter(filter); | 767 channel()->AddFilter(filter); |
714 } | 768 } |
715 | 769 |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 void RenderThreadImpl::PreCacheFont(const LOGFONT& log_font) { | 1146 void RenderThreadImpl::PreCacheFont(const LOGFONT& log_font) { |
1093 Send(new ChildProcessHostMsg_PreCacheFont(log_font)); | 1147 Send(new ChildProcessHostMsg_PreCacheFont(log_font)); |
1094 } | 1148 } |
1095 | 1149 |
1096 void RenderThreadImpl::ReleaseCachedFonts() { | 1150 void RenderThreadImpl::ReleaseCachedFonts() { |
1097 Send(new ChildProcessHostMsg_ReleaseCachedFonts()); | 1151 Send(new ChildProcessHostMsg_ReleaseCachedFonts()); |
1098 } | 1152 } |
1099 | 1153 |
1100 #endif // OS_WIN | 1154 #endif // OS_WIN |
1101 | 1155 |
| 1156 ServiceRegistry* RenderThreadImpl::GetServiceRegistry() { |
| 1157 return service_registry(); |
| 1158 } |
| 1159 |
1102 bool RenderThreadImpl::IsMainThread() { | 1160 bool RenderThreadImpl::IsMainThread() { |
1103 return !!current(); | 1161 return !!current(); |
1104 } | 1162 } |
1105 | 1163 |
1106 base::MessageLoop* RenderThreadImpl::GetMainLoop() { | 1164 base::MessageLoop* RenderThreadImpl::GetMainLoop() { |
1107 return message_loop(); | 1165 return message_loop(); |
1108 } | 1166 } |
1109 | 1167 |
1110 scoped_refptr<base::MessageLoopProxy> RenderThreadImpl::GetIOLoopProxy() { | 1168 scoped_refptr<base::MessageLoopProxy> RenderThreadImpl::GetIOLoopProxy() { |
1111 return io_message_loop_proxy_; | 1169 return io_message_loop_proxy_; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 success = sync_message_filter()->Send(message); | 1230 success = sync_message_filter()->Send(message); |
1173 | 1231 |
1174 if (!success) | 1232 if (!success) |
1175 return scoped_ptr<gfx::GpuMemoryBuffer>(); | 1233 return scoped_ptr<gfx::GpuMemoryBuffer>(); |
1176 | 1234 |
1177 return GpuMemoryBufferImpl::CreateFromHandle( | 1235 return GpuMemoryBufferImpl::CreateFromHandle( |
1178 handle, gfx::Size(width, height), internalformat) | 1236 handle, gfx::Size(width, height), internalformat) |
1179 .PassAs<gfx::GpuMemoryBuffer>(); | 1237 .PassAs<gfx::GpuMemoryBuffer>(); |
1180 } | 1238 } |
1181 | 1239 |
1182 void RenderThreadImpl::ConnectToService( | |
1183 const mojo::String& service_url, | |
1184 const mojo::String& service_name, | |
1185 mojo::ScopedMessagePipeHandle message_pipe, | |
1186 const mojo::String& requestor_url) { | |
1187 // TODO(darin): Invent some kind of registration system to use here. | |
1188 if (service_url.To<base::StringPiece>() == kRendererService_WebUISetup) { | |
1189 WebUISetupImpl::Bind(message_pipe.Pass()); | |
1190 } else { | |
1191 NOTREACHED() << "Unknown service name"; | |
1192 } | |
1193 } | |
1194 | |
1195 void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() { | 1240 void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() { |
1196 suspend_webkit_shared_timer_ = false; | 1241 suspend_webkit_shared_timer_ = false; |
1197 } | 1242 } |
1198 | 1243 |
1199 void RenderThreadImpl::DoNotNotifyWebKitOfModalLoop() { | 1244 void RenderThreadImpl::DoNotNotifyWebKitOfModalLoop() { |
1200 notify_webkit_of_modal_loop_ = false; | 1245 notify_webkit_of_modal_loop_ = false; |
1201 } | 1246 } |
1202 | 1247 |
1203 void RenderThreadImpl::OnSetZoomLevelForCurrentURL(const std::string& scheme, | 1248 void RenderThreadImpl::OnSetZoomLevelForCurrentURL(const std::string& scheme, |
1204 const std::string& host, | 1249 const std::string& host, |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 hidden_widget_count_--; | 1565 hidden_widget_count_--; |
1521 | 1566 |
1522 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { | 1567 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { |
1523 return; | 1568 return; |
1524 } | 1569 } |
1525 | 1570 |
1526 ScheduleIdleHandler(kLongIdleHandlerDelayMs); | 1571 ScheduleIdleHandler(kLongIdleHandlerDelayMs); |
1527 } | 1572 } |
1528 | 1573 |
1529 } // namespace content | 1574 } // namespace content |
OLD | NEW |