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

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 2766263009: Convert content ConnectionFilter to OnBindInterface (Closed)
Patch Set: . Created 3 years, 8 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 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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 #include "ipc/ipc_channel.h" 176 #include "ipc/ipc_channel.h"
177 #include "ipc/ipc_channel_mojo.h" 177 #include "ipc/ipc_channel_mojo.h"
178 #include "ipc/ipc_logging.h" 178 #include "ipc/ipc_logging.h"
179 #include "media/base/media_switches.h" 179 #include "media/base/media_switches.h"
180 #include "media/media_features.h" 180 #include "media/media_features.h"
181 #include "mojo/edk/embedder/embedder.h" 181 #include "mojo/edk/embedder/embedder.h"
182 #include "mojo/public/cpp/bindings/associated_interface_ptr.h" 182 #include "mojo/public/cpp/bindings/associated_interface_ptr.h"
183 #include "net/url_request/url_request_context_getter.h" 183 #include "net/url_request/url_request_context_getter.h"
184 #include "ppapi/features/features.h" 184 #include "ppapi/features/features.h"
185 #include "services/resource_coordinator/memory/coordinator/coordinator_impl.h" 185 #include "services/resource_coordinator/memory/coordinator/coordinator_impl.h"
186 #include "services/service_manager/public/cpp/binder_registry.h"
186 #include "services/service_manager/public/cpp/connection.h" 187 #include "services/service_manager/public/cpp/connection.h"
187 #include "services/service_manager/public/cpp/connector.h" 188 #include "services/service_manager/public/cpp/connector.h"
188 #include "services/service_manager/public/cpp/interface_provider.h" 189 #include "services/service_manager/public/cpp/interface_provider.h"
189 #include "services/service_manager/public/cpp/interface_registry.h"
190 #include "services/service_manager/runner/common/client_util.h" 190 #include "services/service_manager/runner/common/client_util.h"
191 #include "services/service_manager/runner/common/switches.h" 191 #include "services/service_manager/runner/common/switches.h"
192 #include "services/shape_detection/public/interfaces/barcodedetection.mojom.h" 192 #include "services/shape_detection/public/interfaces/barcodedetection.mojom.h"
193 #include "services/shape_detection/public/interfaces/constants.mojom.h" 193 #include "services/shape_detection/public/interfaces/constants.mojom.h"
194 #include "services/shape_detection/public/interfaces/facedetection_provider.mojo m.h" 194 #include "services/shape_detection/public/interfaces/facedetection_provider.mojo m.h"
195 #include "services/shape_detection/public/interfaces/textdetection.mojom.h" 195 #include "services/shape_detection/public/interfaces/textdetection.mojom.h"
196 #include "storage/browser/fileapi/sandbox_file_system_backend.h" 196 #include "storage/browser/fileapi/sandbox_file_system_backend.h"
197 #include "third_party/WebKit/public/public_features.h" 197 #include "third_party/WebKit/public/public_features.h"
198 #include "third_party/skia/include/core/SkBitmap.h" 198 #include "third_party/skia/include/core/SkBitmap.h"
199 #include "ui/base/ui_base_switches.h" 199 #include "ui/base/ui_base_switches.h"
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 base::Lock lock_; 512 base::Lock lock_;
513 ConnectionFilterImpl* filter_; 513 ConnectionFilterImpl* filter_;
514 }; 514 };
515 515
516 // Held by the RPH's BrowserContext's ServiceManagerConnection, ownership 516 // Held by the RPH's BrowserContext's ServiceManagerConnection, ownership
517 // transferred back to RPH upon RPH destruction. 517 // transferred back to RPH upon RPH destruction.
518 class RenderProcessHostImpl::ConnectionFilterImpl : public ConnectionFilter { 518 class RenderProcessHostImpl::ConnectionFilterImpl : public ConnectionFilter {
519 public: 519 public:
520 ConnectionFilterImpl( 520 ConnectionFilterImpl(
521 const service_manager::Identity& child_identity, 521 const service_manager::Identity& child_identity,
522 std::unique_ptr<service_manager::InterfaceRegistry> registry) 522 std::unique_ptr<service_manager::BinderRegistry> registry)
523 : child_identity_(child_identity), 523 : child_identity_(child_identity),
524 registry_(std::move(registry)), 524 registry_(std::move(registry)),
525 controller_(new ConnectionFilterController(this)), 525 controller_(new ConnectionFilterController(this)),
526 weak_factory_(this) { 526 weak_factory_(this) {
527 // Registration of this filter may race with browser shutdown, in which case 527 // Registration of this filter may race with browser shutdown, in which case
528 // it's possible for this filter to be destroyed on the main thread. This 528 // it's possible for this filter to be destroyed on the main thread. This
529 // is fine as long as the filter hasn't been used on the IO thread yet. We 529 // is fine as long as the filter hasn't been used on the IO thread yet. We
530 // detach the ThreadChecker initially and the first use of the filter will 530 // detach the ThreadChecker initially and the first use of the filter will
531 // bind it. 531 // bind it.
532 thread_checker_.DetachFromThread(); 532 thread_checker_.DetachFromThread();
533 } 533 }
534 534
535 ~ConnectionFilterImpl() override { 535 ~ConnectionFilterImpl() override {
536 DCHECK(thread_checker_.CalledOnValidThread()); 536 DCHECK(thread_checker_.CalledOnValidThread());
537 controller_->Detach(); 537 controller_->Detach();
538 } 538 }
539 539
540 scoped_refptr<ConnectionFilterController> controller() { return controller_; } 540 scoped_refptr<ConnectionFilterController> controller() { return controller_; }
541 541
542 void Disable() { 542 void Disable() {
543 base::AutoLock lock(enabled_lock_); 543 base::AutoLock lock(enabled_lock_);
544 enabled_ = false; 544 enabled_ = false;
545 } 545 }
546 546
547 private: 547 private:
548 // ConnectionFilter: 548 // ConnectionFilter:
549 bool OnConnect(const service_manager::Identity& remote_identity, 549 void OnBindInterface(const service_manager::ServiceInfo& source_info,
550 service_manager::InterfaceRegistry* registry, 550 const std::string& interface_name,
551 service_manager::Connector* connector) override { 551 mojo::ScopedMessagePipeHandle* interface_pipe,
552 service_manager::Connector* connector) override {
552 DCHECK(thread_checker_.CalledOnValidThread()); 553 DCHECK(thread_checker_.CalledOnValidThread());
553 DCHECK_CURRENTLY_ON(BrowserThread::IO); 554 DCHECK_CURRENTLY_ON(BrowserThread::IO);
554 // We only fulfill connections from the renderer we host. 555 // We only fulfill connections from the renderer we host.
555 if (child_identity_.name() != remote_identity.name() || 556 if (child_identity_.name() != source_info.identity.name() ||
556 child_identity_.instance() != remote_identity.instance()) { 557 child_identity_.instance() != source_info.identity.instance()) {
557 return false; 558 return;
558 } 559 }
559 560
560 base::AutoLock lock(enabled_lock_); 561 base::AutoLock lock(enabled_lock_);
561 if (!enabled_) 562 if (!enabled_)
562 return false; 563 return;
563 564
564 std::set<std::string> interface_names; 565 if (registry_->CanBindInterface(interface_name)) {
565 registry_->GetInterfaceNames(&interface_names); 566 registry_->BindInterface(source_info.identity, interface_name,
566 for (auto& interface_name : interface_names) { 567 std::move(*interface_pipe));
567 // Note that the added callbacks may outlive this object, which is
568 // destroyed in RPH::Cleanup().
569 registry->AddInterface(interface_name,
570 base::Bind(&ConnectionFilterImpl::GetInterface,
571 weak_factory_.GetWeakPtr(),
572 interface_name));
573 } 568 }
574 return true;
575 }
576
577 void GetInterface(const std::string& interface_name,
578 mojo::ScopedMessagePipeHandle handle) {
579 DCHECK(thread_checker_.CalledOnValidThread());
580 DCHECK_CURRENTLY_ON(BrowserThread::IO);
581 service_manager::mojom::InterfaceProvider* provider = registry_.get();
582
583 base::AutoLock lock(enabled_lock_);
584 if (enabled_)
585 provider->GetInterface(interface_name, std::move(handle));
586 } 569 }
587 570
588 base::ThreadChecker thread_checker_; 571 base::ThreadChecker thread_checker_;
589 service_manager::Identity child_identity_; 572 service_manager::Identity child_identity_;
590 std::unique_ptr<service_manager::InterfaceRegistry> registry_; 573 std::unique_ptr<service_manager::BinderRegistry> registry_;
591 scoped_refptr<ConnectionFilterController> controller_; 574 scoped_refptr<ConnectionFilterController> controller_;
592 575
593 // Guards |enabled_|. 576 // Guards |enabled_|.
594 base::Lock enabled_lock_; 577 base::Lock enabled_lock_;
595 bool enabled_ = true; 578 bool enabled_ = true;
596 579
597 base::WeakPtrFactory<ConnectionFilterImpl> weak_factory_; 580 base::WeakPtrFactory<ConnectionFilterImpl> weak_factory_;
598 581
599 DISALLOW_COPY_AND_ASSIGN(ConnectionFilterImpl); 582 DISALLOW_COPY_AND_ASSIGN(ConnectionFilterImpl);
600 }; 583 };
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 pending_connection_.reset(new mojo::edk::PendingProcessConnection); 953 pending_connection_.reset(new mojo::edk::PendingProcessConnection);
971 child_connection_.reset(new ChildConnection( 954 child_connection_.reset(new ChildConnection(
972 mojom::kRendererServiceName, 955 mojom::kRendererServiceName,
973 base::StringPrintf("%d_%d", id_, instance_id_++), 956 base::StringPrintf("%d_%d", id_, instance_id_++),
974 pending_connection_.get(), connector, io_task_runner)); 957 pending_connection_.get(), connector, io_task_runner));
975 958
976 // Send an interface request to bootstrap the IPC::Channel. Note that this 959 // Send an interface request to bootstrap the IPC::Channel. Note that this
977 // request will happily sit on the pipe until the process is launched and 960 // request will happily sit on the pipe until the process is launched and
978 // connected to the ServiceManager. We take the other end immediately and 961 // connected to the ServiceManager. We take the other end immediately and
979 // plug it into a new ChannelProxy. 962 // plug it into a new ChannelProxy.
980 IPC::mojom::ChannelBootstrapPtr bootstrap; 963 mojo::MessagePipe pipe;
981 GetRemoteInterfaces()->GetInterface(&bootstrap); 964 BindInterface(IPC::mojom::ChannelBootstrap::Name_, std::move(pipe.handle1));
982 std::unique_ptr<IPC::ChannelFactory> channel_factory = 965 std::unique_ptr<IPC::ChannelFactory> channel_factory =
983 IPC::ChannelMojo::CreateServerFactory( 966 IPC::ChannelMojo::CreateServerFactory(std::move(pipe.handle0),
984 bootstrap.PassInterface().PassHandle(), io_task_runner); 967 io_task_runner);
985 968
986 ResetChannelProxy(); 969 ResetChannelProxy();
987 970
988 // Do NOT expand ifdef or run time condition checks here! Synchronous 971 // Do NOT expand ifdef or run time condition checks here! Synchronous
989 // IPCs from browser process are banned. It is only narrowly allowed 972 // IPCs from browser process are banned. It is only narrowly allowed
990 // for Android WebView to maintain backward compatibility. 973 // for Android WebView to maintain backward compatibility.
991 // See crbug.com/526842 for details. 974 // See crbug.com/526842 for details.
992 #if defined(OS_ANDROID) 975 #if defined(OS_ANDROID)
993 if (GetContentClient()->UsingSynchronousCompositing()) { 976 if (GetContentClient()->UsingSynchronousCompositing()) {
994 channel_ = IPC::SyncChannel::Create( 977 channel_ = IPC::SyncChannel::Create(
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 AddFilter(new HistogramMessageFilter()); 1177 AddFilter(new HistogramMessageFilter());
1195 AddFilter(new MemoryMessageFilter(this)); 1178 AddFilter(new MemoryMessageFilter(this));
1196 #if defined(OS_ANDROID) 1179 #if defined(OS_ANDROID)
1197 synchronous_compositor_filter_ = 1180 synchronous_compositor_filter_ =
1198 new SynchronousCompositorBrowserFilter(GetID()); 1181 new SynchronousCompositorBrowserFilter(GetID());
1199 AddFilter(synchronous_compositor_filter_.get()); 1182 AddFilter(synchronous_compositor_filter_.get());
1200 #endif 1183 #endif
1201 } 1184 }
1202 1185
1203 void RenderProcessHostImpl::RegisterMojoInterfaces() { 1186 void RenderProcessHostImpl::RegisterMojoInterfaces() {
1204 auto registry = base::MakeUnique<service_manager::InterfaceRegistry>( 1187 auto registry = base::MakeUnique<service_manager::BinderRegistry>();
1205 service_manager::mojom::kServiceManager_ConnectorSpec);
1206 1188
1207 channel_->AddAssociatedInterfaceForIOThread( 1189 channel_->AddAssociatedInterfaceForIOThread(
1208 base::Bind(&IndexedDBDispatcherHost::AddBinding, indexed_db_factory_)); 1190 base::Bind(&IndexedDBDispatcherHost::AddBinding, indexed_db_factory_));
1209 1191
1210 #if defined(OS_ANDROID) 1192 #if defined(OS_ANDROID)
1211 AddUIThreadInterface( 1193 AddUIThreadInterface(
1212 registry.get(), GetGlobalJavaInterfaces() 1194 registry.get(), GetGlobalJavaInterfaces()
1213 ->CreateInterfaceFactory< 1195 ->CreateInterfaceFactory<
1214 shape_detection::mojom::FaceDetectionProvider>()); 1196 shape_detection::mojom::FaceDetectionProvider>());
1215 AddUIThreadInterface( 1197 AddUIThreadInterface(
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 1373
1392 int RenderProcessHostImpl::GetNextRoutingID() { 1374 int RenderProcessHostImpl::GetNextRoutingID() {
1393 return widget_helper_->GetNextRoutingID(); 1375 return widget_helper_->GetNextRoutingID();
1394 } 1376 }
1395 1377
1396 void RenderProcessHostImpl::ResumeDeferredNavigation( 1378 void RenderProcessHostImpl::ResumeDeferredNavigation(
1397 const GlobalRequestID& request_id) { 1379 const GlobalRequestID& request_id) {
1398 widget_helper_->ResumeDeferredNavigation(request_id); 1380 widget_helper_->ResumeDeferredNavigation(request_id);
1399 } 1381 }
1400 1382
1401 service_manager::InterfaceProvider* 1383 void RenderProcessHostImpl::BindInterface(
1402 RenderProcessHostImpl::GetRemoteInterfaces() { 1384 const std::string& interface_name,
1403 return child_connection_->GetRemoteInterfaces(); 1385 mojo::ScopedMessagePipeHandle interface_pipe) {
1386 child_connection_->BindInterface(interface_name, std::move(interface_pipe));
1404 } 1387 }
1405 1388
1406 std::unique_ptr<base::SharedPersistentMemoryAllocator> 1389 std::unique_ptr<base::SharedPersistentMemoryAllocator>
1407 RenderProcessHostImpl::TakeMetricsAllocator() { 1390 RenderProcessHostImpl::TakeMetricsAllocator() {
1408 return std::move(metrics_allocator_); 1391 return std::move(metrics_allocator_);
1409 } 1392 }
1410 1393
1411 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics() 1394 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics()
1412 const { 1395 const {
1413 return init_time_; 1396 return init_time_;
(...skipping 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after
3071 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 3054 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
3072 3055
3073 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. 3056 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing.
3074 // Capture the error message in a crash key value. 3057 // Capture the error message in a crash key value.
3075 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); 3058 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error);
3076 bad_message::ReceivedBadMessage(render_process_id, 3059 bad_message::ReceivedBadMessage(render_process_id,
3077 bad_message::RPH_MOJO_PROCESS_ERROR); 3060 bad_message::RPH_MOJO_PROCESS_ERROR);
3078 } 3061 }
3079 3062
3080 } // namespace content 3063 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698