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

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
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | content/renderer/web_ui_mojo.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 23 matching lines...) Expand all
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | content/renderer/web_ui_mojo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698