Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: content/renderer/render_thread_impl.cc

Issue 285333003: Support exposing Mojo services between render frames, render threads, and their respective hosts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 20 matching lines...) Expand all
85 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 85 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
86 #include "content/renderer/media/webrtc_identity_service.h" 86 #include "content/renderer/media/webrtc_identity_service.h"
87 #include "content/renderer/net_info_helper.h" 87 #include "content/renderer/net_info_helper.h"
88 #include "content/renderer/p2p/socket_dispatcher.h" 88 #include "content/renderer/p2p/socket_dispatcher.h"
89 #include "content/renderer/render_process_impl.h" 89 #include "content/renderer/render_process_impl.h"
90 #include "content/renderer/render_view_impl.h" 90 #include "content/renderer/render_view_impl.h"
91 #include "content/renderer/renderer_webkitplatformsupport_impl.h" 91 #include "content/renderer/renderer_webkitplatformsupport_impl.h"
92 #include "content/renderer/service_worker/embedded_worker_context_message_filter .h" 92 #include "content/renderer/service_worker/embedded_worker_context_message_filter .h"
93 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" 93 #include "content/renderer/service_worker/embedded_worker_dispatcher.h"
94 #include "content/renderer/shared_worker/embedded_shared_worker_stub.h" 94 #include "content/renderer/shared_worker/embedded_shared_worker_stub.h"
95 #include "content/renderer/web_ui_setup_impl.h"
96 #include "grit/content_resources.h" 95 #include "grit/content_resources.h"
97 #include "ipc/ipc_channel_handle.h" 96 #include "ipc/ipc_channel_handle.h"
98 #include "ipc/ipc_forwarding_message_filter.h" 97 #include "ipc/ipc_forwarding_message_filter.h"
99 #include "ipc/ipc_platform_file.h" 98 #include "ipc/ipc_platform_file.h"
100 #include "media/base/audio_hardware_config.h" 99 #include "media/base/audio_hardware_config.h"
101 #include "media/base/media.h" 100 #include "media/base/media.h"
102 #include "media/filters/gpu_video_accelerator_factories.h" 101 #include "media/filters/gpu_video_accelerator_factories.h"
103 #include "mojo/common/common_type_converters.h" 102 #include "mojo/common/common_type_converters.h"
104 #include "net/base/net_errors.h" 103 #include "net/base/net_errors.h"
105 #include "net/base/net_util.h" 104 #include "net/base/net_util.h"
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 blink::enableLogChannel(t.token().c_str()); 257 blink::enableLogChannel(t.token().c_str());
259 } 258 }
260 259
261 void NotifyTimezoneChangeOnThisThread() { 260 void NotifyTimezoneChangeOnThisThread() {
262 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 261 v8::Isolate* isolate = v8::Isolate::GetCurrent();
263 if (!isolate) 262 if (!isolate)
264 return; 263 return;
265 v8::Date::DateTimeConfigurationChangeNotification(isolate); 264 v8::Date::DateTimeConfigurationChangeNotification(isolate);
266 } 265 }
267 266
267 class RenderFrameSetupImpl : public mojo::InterfaceImpl<RenderFrameSetup> {
268 public:
269 virtual void GetServiceProvider(
270 int32_t frame_routing_id,
271 mojo::InterfaceRequest<mojo::IInterfaceProvider> request) OVERRIDE {
272 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(frame_routing_id);
273 if (!frame) {
darin (slow to review) 2014/06/21 04:33:35 Under what conditions is there no frame yet for th
Sam McNally 2014/06/24 04:00:29 There's a race between the IPC that causes the Ren
274 RenderThreadImpl::current()->RegisterPendingRenderFrameConnect(
275 frame_routing_id, request.PassMessagePipe());
276 return;
277 }
278
279 frame->BindServiceRegistry(request.PassMessagePipe());
280 }
281
282 virtual void OnConnectionError() OVERRIDE { delete this; }
283 };
284
285 void CreateRenderFrameSetup(mojo::InterfaceRequest<RenderFrameSetup> request) {
286 mojo::BindToRequest(new RenderFrameSetupImpl(), &request);
287 }
288
268 } // namespace 289 } // namespace
269 290
270 RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() { 291 RenderThreadImpl::HistogramCustomizer::HistogramCustomizer() {
271 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal"); 292 custom_histograms_.insert("V8.MemoryExternalFragmentationTotal");
272 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted"); 293 custom_histograms_.insert("V8.MemoryHeapSampleTotalCommitted");
273 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed"); 294 custom_histograms_.insert("V8.MemoryHeapSampleTotalUsed");
274 } 295 }
275 296
276 RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {} 297 RenderThreadImpl::HistogramCustomizer::~HistogramCustomizer() {}
277 298
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 if (base::StringToInt(string_value, &num_raster_threads) && 521 if (base::StringToInt(string_value, &num_raster_threads) &&
501 num_raster_threads >= kMinRasterThreads && 522 num_raster_threads >= kMinRasterThreads &&
502 num_raster_threads <= kMaxRasterThreads) { 523 num_raster_threads <= kMaxRasterThreads) {
503 cc::RasterWorkerPool::SetNumRasterThreads(num_raster_threads); 524 cc::RasterWorkerPool::SetNumRasterThreads(num_raster_threads);
504 } else { 525 } else {
505 LOG(WARNING) << "Failed to parse switch " << 526 LOG(WARNING) << "Failed to parse switch " <<
506 switches::kNumRasterThreads << ": " << string_value; 527 switches::kNumRasterThreads << ": " << string_value;
507 } 528 }
508 } 529 }
509 530
531 service_registry()->AddService<RenderFrameSetup>(
532 base::Bind(CreateRenderFrameSetup));
533
510 TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, ""); 534 TRACE_EVENT_END_ETW("RenderThreadImpl::Init", 0, "");
511 } 535 }
512 536
513 RenderThreadImpl::~RenderThreadImpl() { 537 RenderThreadImpl::~RenderThreadImpl() {
538 for (std::map<int, mojo::MessagePipeHandle>::iterator it =
539 pending_render_frame_connects_.begin();
540 it != pending_render_frame_connects_.end();
541 ++it) {
542 mojo::ScopedMessagePipeHandle handle(it->second);
darin (slow to review) 2014/06/21 04:33:35 nit: again, CloseRaw() might be clearer.
Sam McNally 2014/06/24 04:00:29 Done.
543 }
514 } 544 }
515 545
516 void RenderThreadImpl::Shutdown() { 546 void RenderThreadImpl::Shutdown() {
517 FOR_EACH_OBSERVER( 547 FOR_EACH_OBSERVER(
518 RenderProcessObserver, observers_, OnRenderProcessShutdown()); 548 RenderProcessObserver, observers_, OnRenderProcessShutdown());
519 549
520 ChildThread::Shutdown(); 550 ChildThread::Shutdown();
521 551
522 // Wait for all databases to be closed. 552 // Wait for all databases to be closed.
523 if (webkit_platform_support_) { 553 if (webkit_platform_support_) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 return sync_message_filter(); 702 return sync_message_filter();
673 } 703 }
674 704
675 scoped_refptr<base::MessageLoopProxy> 705 scoped_refptr<base::MessageLoopProxy>
676 RenderThreadImpl::GetIOMessageLoopProxy() { 706 RenderThreadImpl::GetIOMessageLoopProxy() {
677 return ChildProcess::current()->io_message_loop_proxy(); 707 return ChildProcess::current()->io_message_loop_proxy();
678 } 708 }
679 709
680 void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) { 710 void RenderThreadImpl::AddRoute(int32 routing_id, IPC::Listener* listener) {
681 ChildThread::GetRouter()->AddRoute(routing_id, listener); 711 ChildThread::GetRouter()->AddRoute(routing_id, listener);
712 std::map<int, mojo::MessagePipeHandle>::iterator it =
713 pending_render_frame_connects_.find(routing_id);
714 if (it == pending_render_frame_connects_.end())
715 return;
716
717 RenderFrameImpl* frame = RenderFrameImpl::FromRoutingID(routing_id);
718 if (!frame)
719 return;
720
721 mojo::ScopedMessagePipeHandle handle(it->second);
722 pending_render_frame_connects_.erase(it);
723 frame->BindServiceRegistry(handle.Pass());
682 } 724 }
683 725
684 void RenderThreadImpl::RemoveRoute(int32 routing_id) { 726 void RenderThreadImpl::RemoveRoute(int32 routing_id) {
685 ChildThread::GetRouter()->RemoveRoute(routing_id); 727 ChildThread::GetRouter()->RemoveRoute(routing_id);
686 } 728 }
687 729
688 void RenderThreadImpl::AddEmbeddedWorkerRoute(int32 routing_id, 730 void RenderThreadImpl::AddEmbeddedWorkerRoute(int32 routing_id,
689 IPC::Listener* listener) { 731 IPC::Listener* listener) {
690 AddRoute(routing_id, listener); 732 AddRoute(routing_id, listener);
691 if (devtools_agent_message_filter_.get()) { 733 if (devtools_agent_message_filter_.get()) {
692 devtools_agent_message_filter_->AddEmbeddedWorkerRouteOnMainThread( 734 devtools_agent_message_filter_->AddEmbeddedWorkerRouteOnMainThread(
693 routing_id); 735 routing_id);
694 } 736 }
695 } 737 }
696 738
697 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32 routing_id) { 739 void RenderThreadImpl::RemoveEmbeddedWorkerRoute(int32 routing_id) {
698 RemoveRoute(routing_id); 740 RemoveRoute(routing_id);
699 if (devtools_agent_message_filter_.get()) { 741 if (devtools_agent_message_filter_.get()) {
700 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread( 742 devtools_agent_message_filter_->RemoveEmbeddedWorkerRouteOnMainThread(
701 routing_id); 743 routing_id);
702 } 744 }
703 } 745 }
704 746
747 void RenderThreadImpl::RegisterPendingRenderFrameConnect(
748 int routing_id,
749 mojo::ScopedMessagePipeHandle handle) {
750 std::pair<std::map<int, mojo::MessagePipeHandle>::iterator, bool> result =
751 pending_render_frame_connects_.insert(
752 std::make_pair(routing_id, handle.release()));
753 CHECK(result.second) << "Inserting a duplicate item.";
754 }
755
705 int RenderThreadImpl::GenerateRoutingID() { 756 int RenderThreadImpl::GenerateRoutingID() {
706 int routing_id = MSG_ROUTING_NONE; 757 int routing_id = MSG_ROUTING_NONE;
707 Send(new ViewHostMsg_GenerateRoutingID(&routing_id)); 758 Send(new ViewHostMsg_GenerateRoutingID(&routing_id));
708 return routing_id; 759 return routing_id;
709 } 760 }
710 761
711 void RenderThreadImpl::AddFilter(IPC::MessageFilter* filter) { 762 void RenderThreadImpl::AddFilter(IPC::MessageFilter* filter) {
712 channel()->AddFilter(filter); 763 channel()->AddFilter(filter);
713 } 764 }
714 765
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 void RenderThreadImpl::PreCacheFont(const LOGFONT& log_font) { 1138 void RenderThreadImpl::PreCacheFont(const LOGFONT& log_font) {
1088 Send(new ChildProcessHostMsg_PreCacheFont(log_font)); 1139 Send(new ChildProcessHostMsg_PreCacheFont(log_font));
1089 } 1140 }
1090 1141
1091 void RenderThreadImpl::ReleaseCachedFonts() { 1142 void RenderThreadImpl::ReleaseCachedFonts() {
1092 Send(new ChildProcessHostMsg_ReleaseCachedFonts()); 1143 Send(new ChildProcessHostMsg_ReleaseCachedFonts());
1093 } 1144 }
1094 1145
1095 #endif // OS_WIN 1146 #endif // OS_WIN
1096 1147
1148 ServiceRegistry* RenderThreadImpl::GetServiceRegistry() {
1149 return service_registry();
1150 }
1151
1097 bool RenderThreadImpl::IsMainThread() { 1152 bool RenderThreadImpl::IsMainThread() {
1098 return !!current(); 1153 return !!current();
1099 } 1154 }
1100 1155
1101 base::MessageLoop* RenderThreadImpl::GetMainLoop() { 1156 base::MessageLoop* RenderThreadImpl::GetMainLoop() {
1102 return message_loop(); 1157 return message_loop();
1103 } 1158 }
1104 1159
1105 scoped_refptr<base::MessageLoopProxy> RenderThreadImpl::GetIOLoopProxy() { 1160 scoped_refptr<base::MessageLoopProxy> RenderThreadImpl::GetIOLoopProxy() {
1106 return io_message_loop_proxy_; 1161 return io_message_loop_proxy_;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 success = sync_message_filter()->Send(message); 1222 success = sync_message_filter()->Send(message);
1168 1223
1169 if (!success) 1224 if (!success)
1170 return scoped_ptr<gfx::GpuMemoryBuffer>(); 1225 return scoped_ptr<gfx::GpuMemoryBuffer>();
1171 1226
1172 return GpuMemoryBufferImpl::CreateFromHandle( 1227 return GpuMemoryBufferImpl::CreateFromHandle(
1173 handle, gfx::Size(width, height), internalformat) 1228 handle, gfx::Size(width, height), internalformat)
1174 .PassAs<gfx::GpuMemoryBuffer>(); 1229 .PassAs<gfx::GpuMemoryBuffer>();
1175 } 1230 }
1176 1231
1177 void RenderThreadImpl::ConnectToService(
1178 const mojo::String& service_url,
1179 const mojo::String& service_name,
1180 mojo::ScopedMessagePipeHandle message_pipe,
1181 const mojo::String& requestor_url) {
1182 // TODO(darin): Invent some kind of registration system to use here.
1183 if (service_url.To<base::StringPiece>() == kRendererService_WebUISetup) {
1184 WebUISetupImpl::Bind(message_pipe.Pass());
1185 } else {
1186 NOTREACHED() << "Unknown service name";
1187 }
1188 }
1189
1190 void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() { 1232 void RenderThreadImpl::DoNotSuspendWebKitSharedTimer() {
1191 suspend_webkit_shared_timer_ = false; 1233 suspend_webkit_shared_timer_ = false;
1192 } 1234 }
1193 1235
1194 void RenderThreadImpl::DoNotNotifyWebKitOfModalLoop() { 1236 void RenderThreadImpl::DoNotNotifyWebKitOfModalLoop() {
1195 notify_webkit_of_modal_loop_ = false; 1237 notify_webkit_of_modal_loop_ = false;
1196 } 1238 }
1197 1239
1198 void RenderThreadImpl::OnSetZoomLevelForCurrentURL(const std::string& scheme, 1240 void RenderThreadImpl::OnSetZoomLevelForCurrentURL(const std::string& scheme,
1199 const std::string& host, 1241 const std::string& host,
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1515 hidden_widget_count_--; 1557 hidden_widget_count_--;
1516 1558
1517 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { 1559 if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
1518 return; 1560 return;
1519 } 1561 }
1520 1562
1521 ScheduleIdleHandler(kLongIdleHandlerDelayMs); 1563 ScheduleIdleHandler(kLongIdleHandlerDelayMs);
1522 } 1564 }
1523 1565
1524 } // namespace content 1566 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698