| OLD | NEW |
| 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 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 | 511 |
| 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 shell::Identity& child_identity, | 521 const service_manager::Identity& child_identity, |
| 522 std::unique_ptr<shell::InterfaceRegistry> registry) | 522 std::unique_ptr<service_manager::InterfaceRegistry> 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 shell::Identity& remote_identity, | 549 bool OnConnect(const service_manager::Identity& remote_identity, |
| 550 shell::InterfaceRegistry* registry, | 550 service_manager::InterfaceRegistry* registry, |
| 551 shell::Connector* connector) override { | 551 service_manager::Connector* connector) override { |
| 552 DCHECK(thread_checker_.CalledOnValidThread()); | 552 DCHECK(thread_checker_.CalledOnValidThread()); |
| 553 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 553 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 554 // We only fulfill connections from the renderer we host. | 554 // We only fulfill connections from the renderer we host. |
| 555 if (child_identity_.name() != remote_identity.name() || | 555 if (child_identity_.name() != remote_identity.name() || |
| 556 child_identity_.instance() != remote_identity.instance()) { | 556 child_identity_.instance() != remote_identity.instance()) { |
| 557 return false; | 557 return false; |
| 558 } | 558 } |
| 559 | 559 |
| 560 base::AutoLock lock(enabled_lock_); | 560 base::AutoLock lock(enabled_lock_); |
| 561 if (!enabled_) | 561 if (!enabled_) |
| 562 return false; | 562 return false; |
| 563 | 563 |
| 564 std::set<std::string> interface_names; | 564 std::set<std::string> interface_names; |
| 565 registry_->GetInterfaceNames(&interface_names); | 565 registry_->GetInterfaceNames(&interface_names); |
| 566 for (auto& interface_name : interface_names) { | 566 for (auto& interface_name : interface_names) { |
| 567 // Note that the added callbacks may outlive this object, which is | 567 // Note that the added callbacks may outlive this object, which is |
| 568 // destroyed in RPH::Cleanup(). | 568 // destroyed in RPH::Cleanup(). |
| 569 registry->AddInterface(interface_name, | 569 registry->AddInterface(interface_name, |
| 570 base::Bind(&ConnectionFilterImpl::GetInterface, | 570 base::Bind(&ConnectionFilterImpl::GetInterface, |
| 571 weak_factory_.GetWeakPtr(), | 571 weak_factory_.GetWeakPtr(), |
| 572 interface_name)); | 572 interface_name)); |
| 573 } | 573 } |
| 574 return true; | 574 return true; |
| 575 } | 575 } |
| 576 | 576 |
| 577 void GetInterface(const std::string& interface_name, | 577 void GetInterface(const std::string& interface_name, |
| 578 mojo::ScopedMessagePipeHandle handle) { | 578 mojo::ScopedMessagePipeHandle handle) { |
| 579 DCHECK(thread_checker_.CalledOnValidThread()); | 579 DCHECK(thread_checker_.CalledOnValidThread()); |
| 580 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 580 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 581 shell::mojom::InterfaceProvider* provider = registry_.get(); | 581 service_manager::mojom::InterfaceProvider* provider = registry_.get(); |
| 582 | 582 |
| 583 base::AutoLock lock(enabled_lock_); | 583 base::AutoLock lock(enabled_lock_); |
| 584 if (enabled_) | 584 if (enabled_) |
| 585 provider->GetInterface(interface_name, std::move(handle)); | 585 provider->GetInterface(interface_name, std::move(handle)); |
| 586 } | 586 } |
| 587 | 587 |
| 588 base::ThreadChecker thread_checker_; | 588 base::ThreadChecker thread_checker_; |
| 589 shell::Identity child_identity_; | 589 service_manager::Identity child_identity_; |
| 590 std::unique_ptr<shell::InterfaceRegistry> registry_; | 590 std::unique_ptr<service_manager::InterfaceRegistry> registry_; |
| 591 scoped_refptr<ConnectionFilterController> controller_; | 591 scoped_refptr<ConnectionFilterController> controller_; |
| 592 | 592 |
| 593 // Guards |enabled_|. | 593 // Guards |enabled_|. |
| 594 base::Lock enabled_lock_; | 594 base::Lock enabled_lock_; |
| 595 bool enabled_ = true; | 595 bool enabled_ = true; |
| 596 | 596 |
| 597 base::WeakPtrFactory<ConnectionFilterImpl> weak_factory_; | 597 base::WeakPtrFactory<ConnectionFilterImpl> weak_factory_; |
| 598 | 598 |
| 599 DISALLOW_COPY_AND_ASSIGN(ConnectionFilterImpl); | 599 DISALLOW_COPY_AND_ASSIGN(ConnectionFilterImpl); |
| 600 }; | 600 }; |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 | 946 |
| 947 void RenderProcessHostImpl::InitializeChannelProxy() { | 947 void RenderProcessHostImpl::InitializeChannelProxy() { |
| 948 // Generate a token used to identify the new child process. | 948 // Generate a token used to identify the new child process. |
| 949 child_token_ = mojo::edk::GenerateRandomToken(); | 949 child_token_ = mojo::edk::GenerateRandomToken(); |
| 950 | 950 |
| 951 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = | 951 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = |
| 952 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); | 952 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO); |
| 953 | 953 |
| 954 // Acquire a Connector which will route connections to a new instance of the | 954 // Acquire a Connector which will route connections to a new instance of the |
| 955 // renderer service. | 955 // renderer service. |
| 956 shell::Connector* connector = | 956 service_manager::Connector* connector = |
| 957 BrowserContext::GetConnectorFor(browser_context_); | 957 BrowserContext::GetConnectorFor(browser_context_); |
| 958 if (!connector) { | 958 if (!connector) { |
| 959 // Note that some embedders (e.g. Android WebView) may not initialize a | 959 // Note that some embedders (e.g. Android WebView) may not initialize a |
| 960 // Connector per BrowserContext. In those cases we fall back to the | 960 // Connector per BrowserContext. In those cases we fall back to the |
| 961 // browser-wide Connector. | 961 // browser-wide Connector. |
| 962 if (!ServiceManagerConnection::GetForProcess()) { | 962 if (!ServiceManagerConnection::GetForProcess()) { |
| 963 // Additionally, some test code may not initialize the process-wide | 963 // Additionally, some test code may not initialize the process-wide |
| 964 // ServiceManagerConnection prior to this point. This class of test code | 964 // ServiceManagerConnection prior to this point. This class of test code |
| 965 // doesn't care about render processes, so we can initialize a dummy | 965 // doesn't care about render processes, so we can initialize a dummy |
| 966 // connection. | 966 // connection. |
| 967 shell::mojom::ServiceRequest request = mojo::GetProxy(&test_service_); | 967 service_manager::mojom::ServiceRequest request = |
| 968 mojo::GetProxy(&test_service_); |
| 968 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( | 969 ServiceManagerConnection::SetForProcess(ServiceManagerConnection::Create( |
| 969 std::move(request), io_task_runner)); | 970 std::move(request), io_task_runner)); |
| 970 } | 971 } |
| 971 connector = ServiceManagerConnection::GetForProcess()->GetConnector(); | 972 connector = ServiceManagerConnection::GetForProcess()->GetConnector(); |
| 972 } | 973 } |
| 973 | 974 |
| 974 // Establish a ServiceManager connection for the new render service instance. | 975 // Establish a ServiceManager connection for the new render service instance. |
| 975 child_connection_.reset(new ChildConnection( | 976 child_connection_.reset(new ChildConnection( |
| 976 kRendererServiceName, | 977 kRendererServiceName, |
| 977 base::StringPrintf("%d_%d", id_, instance_id_++), child_token_, connector, | 978 base::StringPrintf("%d_%d", id_, instance_id_++), child_token_, connector, |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1218 AddFilter(new HistogramMessageFilter()); | 1219 AddFilter(new HistogramMessageFilter()); |
| 1219 AddFilter(new MemoryMessageFilter(this)); | 1220 AddFilter(new MemoryMessageFilter(this)); |
| 1220 AddFilter(new PushMessagingMessageFilter( | 1221 AddFilter(new PushMessagingMessageFilter( |
| 1221 GetID(), storage_partition_impl_->GetServiceWorkerContext())); | 1222 GetID(), storage_partition_impl_->GetServiceWorkerContext())); |
| 1222 #if defined(OS_ANDROID) | 1223 #if defined(OS_ANDROID) |
| 1223 AddFilter(new ScreenOrientationMessageFilterAndroid()); | 1224 AddFilter(new ScreenOrientationMessageFilterAndroid()); |
| 1224 #endif | 1225 #endif |
| 1225 } | 1226 } |
| 1226 | 1227 |
| 1227 void RenderProcessHostImpl::RegisterMojoInterfaces() { | 1228 void RenderProcessHostImpl::RegisterMojoInterfaces() { |
| 1228 std::unique_ptr<shell::InterfaceRegistry> registry( | 1229 std::unique_ptr<service_manager::InterfaceRegistry> registry( |
| 1229 new shell::InterfaceRegistry); | 1230 new service_manager::InterfaceRegistry); |
| 1230 | 1231 |
| 1231 channel_->AddAssociatedInterface( | 1232 channel_->AddAssociatedInterface( |
| 1232 base::Bind(&RenderProcessHostImpl::OnRouteProviderRequest, | 1233 base::Bind(&RenderProcessHostImpl::OnRouteProviderRequest, |
| 1233 base::Unretained(this))); | 1234 base::Unretained(this))); |
| 1234 | 1235 |
| 1235 #if defined(OS_ANDROID) | 1236 #if defined(OS_ANDROID) |
| 1236 AddUIThreadInterface(registry.get(), | 1237 AddUIThreadInterface(registry.get(), |
| 1237 GetGlobalJavaInterfaces() | 1238 GetGlobalJavaInterfaces() |
| 1238 ->CreateInterfaceFactory<device::BatteryMonitor>()); | 1239 ->CreateInterfaceFactory<device::BatteryMonitor>()); |
| 1239 #else | 1240 #else |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1352 | 1353 |
| 1353 int RenderProcessHostImpl::GetNextRoutingID() { | 1354 int RenderProcessHostImpl::GetNextRoutingID() { |
| 1354 return widget_helper_->GetNextRoutingID(); | 1355 return widget_helper_->GetNextRoutingID(); |
| 1355 } | 1356 } |
| 1356 | 1357 |
| 1357 void RenderProcessHostImpl::ResumeDeferredNavigation( | 1358 void RenderProcessHostImpl::ResumeDeferredNavigation( |
| 1358 const GlobalRequestID& request_id) { | 1359 const GlobalRequestID& request_id) { |
| 1359 widget_helper_->ResumeDeferredNavigation(request_id); | 1360 widget_helper_->ResumeDeferredNavigation(request_id); |
| 1360 } | 1361 } |
| 1361 | 1362 |
| 1362 shell::InterfaceProvider* RenderProcessHostImpl::GetRemoteInterfaces() { | 1363 service_manager::InterfaceProvider* |
| 1364 RenderProcessHostImpl::GetRemoteInterfaces() { |
| 1363 return child_connection_->GetRemoteInterfaces(); | 1365 return child_connection_->GetRemoteInterfaces(); |
| 1364 } | 1366 } |
| 1365 | 1367 |
| 1366 std::unique_ptr<base::SharedPersistentMemoryAllocator> | 1368 std::unique_ptr<base::SharedPersistentMemoryAllocator> |
| 1367 RenderProcessHostImpl::TakeMetricsAllocator() { | 1369 RenderProcessHostImpl::TakeMetricsAllocator() { |
| 1368 return std::move(metrics_allocator_); | 1370 return std::move(metrics_allocator_); |
| 1369 } | 1371 } |
| 1370 | 1372 |
| 1371 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics() | 1373 const base::TimeTicks& RenderProcessHostImpl::GetInitTimeForNavigationMetrics() |
| 1372 const { | 1374 const { |
| (...skipping 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3034 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; | 3036 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; |
| 3035 | 3037 |
| 3036 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias | 3038 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias |
| 3037 // enough information here so that we can determine what the bad message was. | 3039 // enough information here so that we can determine what the bad message was. |
| 3038 base::debug::Alias(&error); | 3040 base::debug::Alias(&error); |
| 3039 bad_message::ReceivedBadMessage(render_process_id, | 3041 bad_message::ReceivedBadMessage(render_process_id, |
| 3040 bad_message::RPH_MOJO_PROCESS_ERROR); | 3042 bad_message::RPH_MOJO_PROCESS_ERROR); |
| 3041 } | 3043 } |
| 3042 | 3044 |
| 3043 } // namespace content | 3045 } // namespace content |
| OLD | NEW |