| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/common/service_manager/service_manager_connection_impl.h" | 5 #include "content/common/service_manager/service_manager_connection_impl.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
| 13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
| 17 #include "base/threading/thread_checker.h" | 17 #include "base/threading/thread_checker.h" |
| 18 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
| 19 #include "content/common/child.mojom.h" |
| 19 #include "content/common/service_manager/embedded_service_runner.h" | 20 #include "content/common/service_manager/embedded_service_runner.h" |
| 20 #include "content/public/common/connection_filter.h" | 21 #include "content/public/common/connection_filter.h" |
| 21 #include "mojo/public/cpp/bindings/binding_set.h" | 22 #include "mojo/public/cpp/bindings/binding_set.h" |
| 22 #include "mojo/public/cpp/system/message_pipe.h" | 23 #include "mojo/public/cpp/system/message_pipe.h" |
| 23 #include "services/service_manager/public/cpp/interface_registry.h" | 24 #include "services/service_manager/public/cpp/interface_registry.h" |
| 24 #include "services/service_manager/public/cpp/service.h" | 25 #include "services/service_manager/public/cpp/service.h" |
| 25 #include "services/service_manager/public/cpp/service_context.h" | 26 #include "services/service_manager/public/cpp/service_context.h" |
| 26 #include "services/service_manager/public/interfaces/constants.mojom.h" | 27 #include "services/service_manager/public/interfaces/constants.mojom.h" |
| 27 #include "services/service_manager/public/interfaces/service_factory.mojom.h" | 28 #include "services/service_manager/public/interfaces/service_factory.mojom.h" |
| 28 #include "services/service_manager/runner/common/client_util.h" | 29 #include "services/service_manager/runner/common/client_util.h" |
| 29 | 30 |
| 30 namespace content { | 31 namespace content { |
| 31 namespace { | 32 namespace { |
| 32 | 33 |
| 33 base::LazyInstance<std::unique_ptr<ServiceManagerConnection>>::Leaky | 34 base::LazyInstance<std::unique_ptr<ServiceManagerConnection>>::Leaky |
| 34 g_connection_for_process = LAZY_INSTANCE_INITIALIZER; | 35 g_connection_for_process = LAZY_INSTANCE_INITIALIZER; |
| 35 | 36 |
| 36 ServiceManagerConnection::Factory* service_manager_connection_factory = nullptr; | 37 ServiceManagerConnection::Factory* service_manager_connection_factory = nullptr; |
| 37 | 38 |
| 38 } // namespace | 39 } // namespace |
| 39 | 40 |
| 40 // A ref-counted object which owns the IO thread state of a | 41 // A ref-counted object which owns the IO thread state of a |
| 41 // ServiceManagerConnectionImpl. This includes Service and ServiceFactory | 42 // ServiceManagerConnectionImpl. This includes Service and ServiceFactory |
| 42 // bindings. | 43 // bindings. |
| 43 class ServiceManagerConnectionImpl::IOThreadContext | 44 class ServiceManagerConnectionImpl::IOThreadContext |
| 44 : public base::RefCountedThreadSafe<IOThreadContext>, | 45 : public base::RefCountedThreadSafe<IOThreadContext>, |
| 45 public service_manager::Service, | 46 public service_manager::Service, |
| 46 public service_manager::InterfaceFactory< | 47 public service_manager::mojom::ServiceFactory, |
| 47 service_manager::mojom::ServiceFactory>, | 48 public mojom::Child { |
| 48 public service_manager::mojom::ServiceFactory { | |
| 49 public: | 49 public: |
| 50 using InitializeCallback = | 50 using InitializeCallback = |
| 51 base::Callback<void(const service_manager::Identity&)>; | 51 base::Callback<void(const service_manager::ServiceInfo&)>; |
| 52 | 52 |
| 53 IOThreadContext( | 53 IOThreadContext( |
| 54 service_manager::mojom::ServiceRequest service_request, | 54 service_manager::mojom::ServiceRequest service_request, |
| 55 scoped_refptr<base::SequencedTaskRunner> io_task_runner, | 55 scoped_refptr<base::SequencedTaskRunner> io_task_runner, |
| 56 std::unique_ptr<service_manager::Connector> io_thread_connector, | 56 std::unique_ptr<service_manager::Connector> io_thread_connector, |
| 57 service_manager::mojom::ConnectorRequest connector_request) | 57 service_manager::mojom::ConnectorRequest connector_request) |
| 58 : pending_service_request_(std::move(service_request)), | 58 : pending_service_request_(std::move(service_request)), |
| 59 io_task_runner_(io_task_runner), | 59 io_task_runner_(io_task_runner), |
| 60 io_thread_connector_(std::move(io_thread_connector)), | 60 io_thread_connector_(std::move(io_thread_connector)), |
| 61 pending_connector_request_(std::move(connector_request)), | 61 pending_connector_request_(std::move(connector_request)), |
| 62 child_binding_(this), |
| 62 weak_factory_(this) { | 63 weak_factory_(this) { |
| 63 // This will be reattached by any of the IO thread functions on first call. | 64 // This will be reattached by any of the IO thread functions on first call. |
| 64 io_thread_checker_.DetachFromThread(); | 65 io_thread_checker_.DetachFromThread(); |
| 65 } | 66 } |
| 66 | 67 |
| 67 // Safe to call from any thread. | 68 // Safe to call from any thread. |
| 68 void Start( | 69 void Start(const InitializeCallback& local_info_available_callback, |
| 69 const InitializeCallback& initialize_callback, | 70 const InitializeCallback& browser_info_available_callback, |
| 70 const ServiceManagerConnection::OnConnectHandler& on_connect_callback, | 71 const base::Closure& stop_callback) { |
| 71 const base::Closure& stop_callback) { | |
| 72 DCHECK(!started_); | 72 DCHECK(!started_); |
| 73 | 73 |
| 74 started_ = true; | 74 started_ = true; |
| 75 callback_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 75 callback_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 76 initialize_handler_ = initialize_callback; | 76 local_info_available_callback_ = local_info_available_callback; |
| 77 on_connect_callback_ = on_connect_callback; | 77 browser_info_available_callback_ = browser_info_available_callback; |
| 78 stop_callback_ = stop_callback; | 78 stop_callback_ = stop_callback; |
| 79 io_task_runner_->PostTask( | 79 io_task_runner_->PostTask( |
| 80 FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this)); | 80 FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this)); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // Safe to call from whichever thread called Start() (or may have called | 83 // Safe to call from whichever thread called Start() (or may have called |
| 84 // Start()). Must be called before IO thread shutdown. | 84 // Start()). Must be called before IO thread shutdown. |
| 85 void ShutDown() { | 85 void ShutDown() { |
| 86 if (!started_) | 86 if (!started_) |
| 87 return; | 87 return; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 DCHECK(io_thread_checker_.CalledOnValidThread()); | 256 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 257 auto result = request_handlers_.insert(std::make_pair(name, handler)); | 257 auto result = request_handlers_.insert(std::make_pair(name, handler)); |
| 258 DCHECK(result.second); | 258 DCHECK(result.second); |
| 259 } | 259 } |
| 260 | 260 |
| 261 ///////////////////////////////////////////////////////////////////////////// | 261 ///////////////////////////////////////////////////////////////////////////// |
| 262 // service_manager::Service implementation | 262 // service_manager::Service implementation |
| 263 | 263 |
| 264 void OnStart() override { | 264 void OnStart() override { |
| 265 DCHECK(io_thread_checker_.CalledOnValidThread()); | 265 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 266 DCHECK(!initialize_handler_.is_null()); | 266 DCHECK(!local_info_available_callback_.is_null()); |
| 267 local_info_ = context()->local_info(); | 267 local_info_ = context()->local_info(); |
| 268 | 268 |
| 269 InitializeCallback handler = base::ResetAndReturn(&initialize_handler_); | 269 InitializeCallback handler = |
| 270 base::ResetAndReturn(&local_info_available_callback_); |
| 270 callback_task_runner_->PostTask(FROM_HERE, | 271 callback_task_runner_->PostTask(FROM_HERE, |
| 271 base::Bind(handler, local_info_.identity)); | 272 base::Bind(handler, local_info_)); |
| 272 } | 273 } |
| 273 | 274 |
| 274 bool OnConnect(const service_manager::ServiceInfo& remote_info, | 275 void OnBindInterface(const service_manager::ServiceInfo& source_info, |
| 275 service_manager::InterfaceRegistry* registry) override { | 276 const std::string& interface_name, |
| 277 mojo::ScopedMessagePipeHandle interface_pipe) override { |
| 276 DCHECK(io_thread_checker_.CalledOnValidThread()); | 278 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 277 | 279 |
| 278 callback_task_runner_->PostTask( | 280 std::string remote_service = source_info.identity.name(); |
| 279 FROM_HERE, base::Bind(on_connect_callback_, local_info_, remote_info)); | 281 // Only expose the ServiceFactory interface to the Service Manager. |
| 280 | 282 if (remote_service == service_manager::mojom::kServiceName && |
| 281 std::string remote_service = remote_info.identity.name(); | 283 interface_name == service_manager::mojom::ServiceFactory::Name_) { |
| 282 if (remote_service == service_manager::mojom::kServiceName) { | 284 factory_bindings_.AddBinding( |
| 283 // Only expose the ServiceFactory interface to the Service Manager. | 285 this, mojo::MakeRequest<service_manager::mojom::ServiceFactory>( |
| 284 registry->AddInterface<service_manager::mojom::ServiceFactory>(this); | 286 std::move(interface_pipe))); |
| 285 return true; | 287 return; |
| 286 } | 288 } |
| 287 | 289 |
| 288 bool accept = false; | |
| 289 { | 290 { |
| 290 base::AutoLock lock(lock_); | 291 base::AutoLock lock(lock_); |
| 291 for (auto& entry : connection_filters_) { | 292 for (auto& entry : connection_filters_) { |
| 292 accept |= entry.second->OnConnect(remote_info.identity, registry, | 293 entry.second->OnBindInterface(source_info, interface_name, |
| 293 service_context_->connector()); | 294 &interface_pipe, |
| 295 service_context_->connector()); |
| 296 // A filter may have bound the interface, claiming the pipe. |
| 297 if (!interface_pipe.is_valid()) |
| 298 return; |
| 294 } | 299 } |
| 295 } | 300 } |
| 296 | 301 |
| 297 if (remote_service == "content_browser" && | 302 if (remote_service == "content_browser") { |
| 298 !has_browser_connection_) { | 303 if (interface_name == mojom::Child::Name_ && !has_browser_connection_) { |
| 299 has_browser_connection_ = true; | 304 has_browser_connection_ = true; |
| 300 registry->set_default_binder(default_browser_binder_); | 305 InitializeCallback handler = |
| 301 registry->AddConnectionLostClosure( | 306 base::ResetAndReturn(&browser_info_available_callback_); |
| 302 base::Bind(&IOThreadContext::OnBrowserConnectionLost, this)); | 307 callback_task_runner_->PostTask(FROM_HERE, |
| 303 return true; | 308 base::Bind(handler, source_info)); |
| 309 |
| 310 child_binding_.Bind(std::move(interface_pipe)); |
| 311 child_binding_.set_connection_error_handler( |
| 312 base::Bind(&IOThreadContext::OnBrowserConnectionLost, this)); |
| 313 } else { |
| 314 default_browser_binder_.Run(interface_name, std::move(interface_pipe)); |
| 315 } |
| 304 } | 316 } |
| 305 | |
| 306 // If no filters were interested, reject the connection. | |
| 307 return accept; | |
| 308 } | 317 } |
| 309 | 318 |
| 310 bool OnServiceManagerConnectionLost() override { | 319 bool OnServiceManagerConnectionLost() override { |
| 311 ClearConnectionFiltersOnIOThread(); | 320 ClearConnectionFiltersOnIOThread(); |
| 312 callback_task_runner_->PostTask(FROM_HERE, stop_callback_); | 321 callback_task_runner_->PostTask(FROM_HERE, stop_callback_); |
| 313 return true; | 322 return true; |
| 314 } | 323 } |
| 315 | 324 |
| 316 ///////////////////////////////////////////////////////////////////////////// | 325 ///////////////////////////////////////////////////////////////////////////// |
| 317 // service_manager::InterfaceFactory<service_manager::mojom::ServiceFactory> | |
| 318 // implementation | |
| 319 | |
| 320 void Create(const service_manager::Identity& remote_identity, | |
| 321 service_manager::mojom::ServiceFactoryRequest request) override { | |
| 322 DCHECK(io_thread_checker_.CalledOnValidThread()); | |
| 323 factory_bindings_.AddBinding(this, std::move(request)); | |
| 324 } | |
| 325 | |
| 326 ///////////////////////////////////////////////////////////////////////////// | |
| 327 // service_manager::mojom::ServiceFactory implementation | 326 // service_manager::mojom::ServiceFactory implementation |
| 328 | 327 |
| 329 void CreateService(service_manager::mojom::ServiceRequest request, | 328 void CreateService(service_manager::mojom::ServiceRequest request, |
| 330 const std::string& name) override { | 329 const std::string& name) override { |
| 331 DCHECK(io_thread_checker_.CalledOnValidThread()); | 330 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 332 auto it = request_handlers_.find(name); | 331 auto it = request_handlers_.find(name); |
| 333 DCHECK(it != request_handlers_.end()) | 332 DCHECK(it != request_handlers_.end()) |
| 334 << "Can't create service " << name << ". No handler found."; | 333 << "Can't create service " << name << ". No handler found."; |
| 335 it->second.Run(std::move(request)); | 334 it->second.Run(std::move(request)); |
| 336 } | 335 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 352 service_manager::mojom::ServiceRequest pending_service_request_; | 351 service_manager::mojom::ServiceRequest pending_service_request_; |
| 353 scoped_refptr<base::SequencedTaskRunner> io_task_runner_; | 352 scoped_refptr<base::SequencedTaskRunner> io_task_runner_; |
| 354 std::unique_ptr<service_manager::Connector> io_thread_connector_; | 353 std::unique_ptr<service_manager::Connector> io_thread_connector_; |
| 355 service_manager::mojom::ConnectorRequest pending_connector_request_; | 354 service_manager::mojom::ConnectorRequest pending_connector_request_; |
| 356 | 355 |
| 357 // TaskRunner on which to run our owner's callbacks, i.e. the ones passed to | 356 // TaskRunner on which to run our owner's callbacks, i.e. the ones passed to |
| 358 // Start(). | 357 // Start(). |
| 359 scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; | 358 scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; |
| 360 | 359 |
| 361 // Callback to run once Service::OnStart is invoked. | 360 // Callback to run once Service::OnStart is invoked. |
| 362 InitializeCallback initialize_handler_; | 361 InitializeCallback local_info_available_callback_; |
| 363 | 362 InitializeCallback browser_info_available_callback_; |
| 364 // Callback to run when a connection request is received. | |
| 365 ServiceManagerConnection::OnConnectHandler on_connect_callback_; | |
| 366 | 363 |
| 367 // Callback to run if the service is stopped by the service manager. | 364 // Callback to run if the service is stopped by the service manager. |
| 368 base::Closure stop_callback_; | 365 base::Closure stop_callback_; |
| 369 | 366 |
| 370 // Called once a connection has been received from the browser process & the | 367 // Called once a connection has been received from the browser process & the |
| 371 // default binder (below) has been set up. | 368 // default binder (below) has been set up. |
| 372 bool has_browser_connection_ = false; | 369 bool has_browser_connection_ = false; |
| 373 | 370 |
| 374 service_manager::ServiceInfo local_info_; | 371 service_manager::ServiceInfo local_info_; |
| 375 | 372 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 388 MessageLoopObserver* message_loop_observer_ = nullptr; | 385 MessageLoopObserver* message_loop_observer_ = nullptr; |
| 389 | 386 |
| 390 // Guards |connection_filters_|. | 387 // Guards |connection_filters_|. |
| 391 base::Lock lock_; | 388 base::Lock lock_; |
| 392 std::map<int, std::unique_ptr<ConnectionFilter>> connection_filters_; | 389 std::map<int, std::unique_ptr<ConnectionFilter>> connection_filters_; |
| 393 | 390 |
| 394 std::unordered_map<std::string, std::unique_ptr<EmbeddedServiceRunner>> | 391 std::unordered_map<std::string, std::unique_ptr<EmbeddedServiceRunner>> |
| 395 embedded_services_; | 392 embedded_services_; |
| 396 std::unordered_map<std::string, ServiceRequestHandler> request_handlers_; | 393 std::unordered_map<std::string, ServiceRequestHandler> request_handlers_; |
| 397 | 394 |
| 395 mojo::Binding<mojom::Child> child_binding_; |
| 396 |
| 398 base::WeakPtrFactory<IOThreadContext> weak_factory_; | 397 base::WeakPtrFactory<IOThreadContext> weak_factory_; |
| 399 | 398 |
| 400 DISALLOW_COPY_AND_ASSIGN(IOThreadContext); | 399 DISALLOW_COPY_AND_ASSIGN(IOThreadContext); |
| 401 }; | 400 }; |
| 402 | 401 |
| 403 //////////////////////////////////////////////////////////////////////////////// | 402 //////////////////////////////////////////////////////////////////////////////// |
| 404 // ServiceManagerConnection, public: | 403 // ServiceManagerConnection, public: |
| 405 | 404 |
| 406 // static | 405 // static |
| 407 void ServiceManagerConnection::SetForProcess( | 406 void ServiceManagerConnection::SetForProcess( |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 457 |
| 459 ServiceManagerConnectionImpl::~ServiceManagerConnectionImpl() { | 458 ServiceManagerConnectionImpl::~ServiceManagerConnectionImpl() { |
| 460 context_->ShutDown(); | 459 context_->ShutDown(); |
| 461 } | 460 } |
| 462 | 461 |
| 463 //////////////////////////////////////////////////////////////////////////////// | 462 //////////////////////////////////////////////////////////////////////////////// |
| 464 // ServiceManagerConnectionImpl, ServiceManagerConnection implementation: | 463 // ServiceManagerConnectionImpl, ServiceManagerConnection implementation: |
| 465 | 464 |
| 466 void ServiceManagerConnectionImpl::Start() { | 465 void ServiceManagerConnectionImpl::Start() { |
| 467 context_->Start( | 466 context_->Start( |
| 468 base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized, | 467 base::Bind(&ServiceManagerConnectionImpl::OnLocalServiceInfoAvailable, |
| 469 weak_factory_.GetWeakPtr()), | 468 weak_factory_.GetWeakPtr()), |
| 470 base::Bind(&ServiceManagerConnectionImpl::OnConnect, | 469 base::Bind(&ServiceManagerConnectionImpl::OnBrowserServiceInfoAvailable, |
| 471 weak_factory_.GetWeakPtr()), | 470 weak_factory_.GetWeakPtr()), |
| 472 base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost, | 471 base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost, |
| 473 weak_factory_.GetWeakPtr())); | 472 weak_factory_.GetWeakPtr())); |
| 474 } | 473 } |
| 475 | 474 |
| 476 service_manager::Connector* ServiceManagerConnectionImpl::GetConnector() { | 475 service_manager::Connector* ServiceManagerConnectionImpl::GetConnector() { |
| 477 return connector_.get(); | 476 return connector_.get(); |
| 478 } | 477 } |
| 479 | 478 |
| 480 const service_manager::Identity& ServiceManagerConnectionImpl::GetIdentity() | 479 const service_manager::ServiceInfo& ServiceManagerConnectionImpl::GetLocalInfo() |
| 481 const { | 480 const { |
| 482 return identity_; | 481 return local_info_; |
| 482 } |
| 483 |
| 484 const service_manager::ServiceInfo& |
| 485 ServiceManagerConnectionImpl::GetBrowserInfo() const { |
| 486 return browser_info_; |
| 483 } | 487 } |
| 484 | 488 |
| 485 void ServiceManagerConnectionImpl::SetConnectionLostClosure( | 489 void ServiceManagerConnectionImpl::SetConnectionLostClosure( |
| 486 const base::Closure& closure) { | 490 const base::Closure& closure) { |
| 487 connection_lost_handler_ = closure; | 491 connection_lost_handler_ = closure; |
| 488 } | 492 } |
| 489 | 493 |
| 490 void ServiceManagerConnectionImpl::SetupInterfaceRequestProxies( | 494 void ServiceManagerConnectionImpl::SetupInterfaceRequestProxies( |
| 491 service_manager::InterfaceRegistry* registry, | 495 service_manager::InterfaceRegistry* registry, |
| 492 service_manager::InterfaceProvider* provider) { | 496 service_manager::InterfaceProvider* provider) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 on_connect_handlers_[id] = handler; | 529 on_connect_handlers_[id] = handler; |
| 526 return id; | 530 return id; |
| 527 } | 531 } |
| 528 | 532 |
| 529 void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) { | 533 void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) { |
| 530 auto it = on_connect_handlers_.find(id); | 534 auto it = on_connect_handlers_.find(id); |
| 531 DCHECK(it != on_connect_handlers_.end()); | 535 DCHECK(it != on_connect_handlers_.end()); |
| 532 on_connect_handlers_.erase(it); | 536 on_connect_handlers_.erase(it); |
| 533 } | 537 } |
| 534 | 538 |
| 535 void ServiceManagerConnectionImpl::OnContextInitialized( | 539 void ServiceManagerConnectionImpl::OnLocalServiceInfoAvailable( |
| 536 const service_manager::Identity& identity) { | 540 const service_manager::ServiceInfo& local_info) { |
| 537 identity_ = identity; | 541 local_info_ = local_info; |
| 542 } |
| 543 |
| 544 void ServiceManagerConnectionImpl::OnBrowserServiceInfoAvailable( |
| 545 const service_manager::ServiceInfo& browser_info) { |
| 546 browser_info_ = browser_info; |
| 547 for (auto& handler : on_connect_handlers_) |
| 548 handler.second.Run(local_info_, browser_info_); |
| 538 } | 549 } |
| 539 | 550 |
| 540 void ServiceManagerConnectionImpl::OnConnectionLost() { | 551 void ServiceManagerConnectionImpl::OnConnectionLost() { |
| 541 if (!connection_lost_handler_.is_null()) | 552 if (!connection_lost_handler_.is_null()) |
| 542 connection_lost_handler_.Run(); | 553 connection_lost_handler_.Run(); |
| 543 } | 554 } |
| 544 | 555 |
| 545 void ServiceManagerConnectionImpl::OnConnect( | |
| 546 const service_manager::ServiceInfo& local_info, | |
| 547 const service_manager::ServiceInfo& remote_info) { | |
| 548 local_info_ = local_info; | |
| 549 for (auto& handler : on_connect_handlers_) | |
| 550 handler.second.Run(local_info, remote_info); | |
| 551 } | |
| 552 | |
| 553 void ServiceManagerConnectionImpl::GetInterface( | 556 void ServiceManagerConnectionImpl::GetInterface( |
| 554 service_manager::mojom::InterfaceProvider* provider, | 557 service_manager::mojom::InterfaceProvider* provider, |
| 555 const std::string& interface_name, | 558 const std::string& interface_name, |
| 556 mojo::ScopedMessagePipeHandle request_handle) { | 559 mojo::ScopedMessagePipeHandle request_handle) { |
| 557 provider->GetInterface(interface_name, std::move(request_handle)); | 560 provider->GetInterface(interface_name, std::move(request_handle)); |
| 558 } | 561 } |
| 559 | 562 |
| 560 } // namespace content | 563 } // namespace content |
| OLD | NEW |