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

Side by Side Diff: content/common/service_manager/service_manager_connection_impl.cc

Issue 2456493003: Add frame-specific InterfaceProviderSpec. (Closed)
Patch Set: . Created 4 years, 1 month 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 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
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 weak_factory_(this) { 62 weak_factory_(this) {
63 // This will be reattached by any of the IO thread functions on first call. 63 // This will be reattached by any of the IO thread functions on first call.
64 io_thread_checker_.DetachFromThread(); 64 io_thread_checker_.DetachFromThread();
65 } 65 }
66 66
67 // Safe to call from any thread. 67 // Safe to call from any thread.
68 void Start(const InitializeCallback& initialize_callback, 68 void Start(
69 const ServiceFactoryCallback& create_service_callback, 69 const InitializeCallback& initialize_callback,
70 const base::Closure& stop_callback) { 70 const ServiceManagerConnection::OnConnectHandler& on_connect_callback,
71 const ServiceFactoryCallback& create_service_callback,
72 const base::Closure& stop_callback) {
71 DCHECK(!started_); 73 DCHECK(!started_);
72 74
73 started_ = true; 75 started_ = true;
74 callback_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 76 callback_task_runner_ = base::ThreadTaskRunnerHandle::Get();
75 initialize_handler_ = initialize_callback; 77 initialize_handler_ = initialize_callback;
78 on_connect_callback_ = on_connect_callback;
76 create_service_callback_ = create_service_callback; 79 create_service_callback_ = create_service_callback;
77 stop_callback_ = stop_callback; 80 stop_callback_ = stop_callback;
78 io_task_runner_->PostTask( 81 io_task_runner_->PostTask(
79 FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this)); 82 FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this));
80 } 83 }
81 84
82 // Safe to call from whichever thread called Start() (or may have called 85 // Safe to call from whichever thread called Start() (or may have called
83 // Start()). Must be called before IO thread shutdown. 86 // Start()). Must be called before IO thread shutdown.
84 void ShutDown() { 87 void ShutDown() {
85 if (!started_) 88 if (!started_)
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 DCHECK(io_thread_checker_.CalledOnValidThread()); 217 DCHECK(io_thread_checker_.CalledOnValidThread());
215 has_browser_connection_ = false; 218 has_browser_connection_ = false;
216 } 219 }
217 220
218 ///////////////////////////////////////////////////////////////////////////// 221 /////////////////////////////////////////////////////////////////////////////
219 // service_manager::Service implementation 222 // service_manager::Service implementation
220 223
221 void OnStart(const service_manager::ServiceInfo& info) override { 224 void OnStart(const service_manager::ServiceInfo& info) override {
222 DCHECK(io_thread_checker_.CalledOnValidThread()); 225 DCHECK(io_thread_checker_.CalledOnValidThread());
223 DCHECK(!initialize_handler_.is_null()); 226 DCHECK(!initialize_handler_.is_null());
224 id_ = info.identity; 227 local_info_ = info;
225 228
226 InitializeCallback handler = base::ResetAndReturn(&initialize_handler_); 229 InitializeCallback handler = base::ResetAndReturn(&initialize_handler_);
227 callback_task_runner_->PostTask(FROM_HERE, base::Bind(handler, id_)); 230 callback_task_runner_->PostTask(FROM_HERE,
231 base::Bind(handler, local_info_.identity));
228 } 232 }
229 233
230 bool OnConnect(const service_manager::ServiceInfo& remote_info, 234 bool OnConnect(const service_manager::ServiceInfo& remote_info,
231 service_manager::InterfaceRegistry* registry) override { 235 service_manager::InterfaceRegistry* registry) override {
232 DCHECK(io_thread_checker_.CalledOnValidThread()); 236 DCHECK(io_thread_checker_.CalledOnValidThread());
237
238 callback_task_runner_->PostTask(
239 FROM_HERE, base::Bind(on_connect_callback_, local_info_, remote_info));
240
233 std::string remote_service = remote_info.identity.name(); 241 std::string remote_service = remote_info.identity.name();
234 if (remote_service == "service:service_manager") { 242 if (remote_service == "service:service_manager") {
235 // Only expose the ServiceFactory interface to the Service Manager. 243 // Only expose the ServiceFactory interface to the Service Manager.
236 registry->AddInterface<service_manager::mojom::ServiceFactory>(this); 244 registry->AddInterface<service_manager::mojom::ServiceFactory>(this);
237 return true; 245 return true;
238 } 246 }
239 247
240 bool accept = false; 248 bool accept = false;
241 { 249 {
242 base::AutoLock lock(lock_); 250 base::AutoLock lock(lock_);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 std::unique_ptr<service_manager::Connector> io_thread_connector_; 313 std::unique_ptr<service_manager::Connector> io_thread_connector_;
306 service_manager::mojom::ConnectorRequest pending_connector_request_; 314 service_manager::mojom::ConnectorRequest pending_connector_request_;
307 315
308 // TaskRunner on which to run our owner's callbacks, i.e. the ones passed to 316 // TaskRunner on which to run our owner's callbacks, i.e. the ones passed to
309 // Start(). 317 // Start().
310 scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; 318 scoped_refptr<base::SequencedTaskRunner> callback_task_runner_;
311 319
312 // Callback to run once Service::OnStart is invoked. 320 // Callback to run once Service::OnStart is invoked.
313 InitializeCallback initialize_handler_; 321 InitializeCallback initialize_handler_;
314 322
323 // Callback to run when a connection request is received.
324 ServiceManagerConnection::OnConnectHandler on_connect_callback_;
325
315 // Callback to run when a new Service request is received. 326 // Callback to run when a new Service request is received.
316 ServiceFactoryCallback create_service_callback_; 327 ServiceFactoryCallback create_service_callback_;
317 328
318 // Callback to run if the service is stopped by the service manager. 329 // Callback to run if the service is stopped by the service manager.
319 base::Closure stop_callback_; 330 base::Closure stop_callback_;
320 331
321 // Called once a connection has been received from the browser process & the 332 // Called once a connection has been received from the browser process & the
322 // default binder (below) has been set up. 333 // default binder (below) has been set up.
323 bool has_browser_connection_ = false; 334 bool has_browser_connection_ = false;
324 335
325 service_manager::Identity id_; 336 service_manager::ServiceInfo local_info_;
326 337
327 // Default binder callback used for the browser connection's 338 // Default binder callback used for the browser connection's
328 // InterfaceRegistry. 339 // InterfaceRegistry.
329 // 340 //
330 // TODO(rockot): Remove this once all interfaces exposed to the browser are 341 // TODO(rockot): Remove this once all interfaces exposed to the browser are
331 // exposed via a ConnectionFilter. 342 // exposed via a ConnectionFilter.
332 service_manager::InterfaceRegistry::Binder default_browser_binder_; 343 service_manager::InterfaceRegistry::Binder default_browser_binder_;
333 344
334 std::unique_ptr<service_manager::ServiceContext> service_context_; 345 std::unique_ptr<service_manager::ServiceContext> service_context_;
335 mojo::BindingSet<service_manager::mojom::ServiceFactory> factory_bindings_; 346 mojo::BindingSet<service_manager::mojom::ServiceFactory> factory_bindings_;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 context_->ShutDown(); 418 context_->ShutDown();
408 } 419 }
409 420
410 //////////////////////////////////////////////////////////////////////////////// 421 ////////////////////////////////////////////////////////////////////////////////
411 // ServiceManagerConnectionImpl, ServiceManagerConnection implementation: 422 // ServiceManagerConnectionImpl, ServiceManagerConnection implementation:
412 423
413 void ServiceManagerConnectionImpl::Start() { 424 void ServiceManagerConnectionImpl::Start() {
414 context_->Start( 425 context_->Start(
415 base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized, 426 base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized,
416 weak_factory_.GetWeakPtr()), 427 weak_factory_.GetWeakPtr()),
428 base::Bind(&ServiceManagerConnectionImpl::OnConnect,
429 weak_factory_.GetWeakPtr()),
417 base::Bind(&ServiceManagerConnectionImpl::CreateService, 430 base::Bind(&ServiceManagerConnectionImpl::CreateService,
418 weak_factory_.GetWeakPtr()), 431 weak_factory_.GetWeakPtr()),
419 base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost, 432 base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost,
420 weak_factory_.GetWeakPtr())); 433 weak_factory_.GetWeakPtr()));
421 } 434 }
422 435
423 void ServiceManagerConnectionImpl::SetInitializeHandler( 436 void ServiceManagerConnectionImpl::SetInitializeHandler(
424 const base::Closure& handler) { 437 const base::Closure& handler) {
425 DCHECK(initialize_handler_.is_null()); 438 DCHECK(initialize_handler_.is_null());
426 initialize_handler_ = handler; 439 initialize_handler_ = handler;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 DCHECK(result.second); 486 DCHECK(result.second);
474 } 487 }
475 488
476 void ServiceManagerConnectionImpl::AddServiceRequestHandler( 489 void ServiceManagerConnectionImpl::AddServiceRequestHandler(
477 const std::string& name, 490 const std::string& name,
478 const ServiceRequestHandler& handler) { 491 const ServiceRequestHandler& handler) {
479 auto result = request_handlers_.insert(std::make_pair(name, handler)); 492 auto result = request_handlers_.insert(std::make_pair(name, handler));
480 DCHECK(result.second); 493 DCHECK(result.second);
481 } 494 }
482 495
496 int ServiceManagerConnectionImpl::AddOnConnectHandler(
497 const OnConnectHandler& handler) {
498 int id = ++next_on_connect_handler_id_;
499 on_connect_handlers_[id] = handler;
500 return id;
501 }
502
503 void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) {
504 auto it = on_connect_handlers_.find(id);
505 DCHECK(it != on_connect_handlers_.end());
506 on_connect_handlers_.erase(it);
507 }
508
483 void ServiceManagerConnectionImpl::CreateService( 509 void ServiceManagerConnectionImpl::CreateService(
484 service_manager::mojom::ServiceRequest request, 510 service_manager::mojom::ServiceRequest request,
485 const std::string& name) { 511 const std::string& name) {
486 auto it = request_handlers_.find(name); 512 auto it = request_handlers_.find(name);
487 if (it != request_handlers_.end()) 513 if (it != request_handlers_.end())
488 it->second.Run(std::move(request)); 514 it->second.Run(std::move(request));
489 } 515 }
490 516
491 void ServiceManagerConnectionImpl::OnContextInitialized( 517 void ServiceManagerConnectionImpl::OnContextInitialized(
492 const service_manager::Identity& identity) { 518 const service_manager::Identity& identity) {
493 identity_ = identity; 519 identity_ = identity;
494 if (!initialize_handler_.is_null()) 520 if (!initialize_handler_.is_null())
495 base::ResetAndReturn(&initialize_handler_).Run(); 521 base::ResetAndReturn(&initialize_handler_).Run();
496 } 522 }
497 523
498 void ServiceManagerConnectionImpl::OnConnectionLost() { 524 void ServiceManagerConnectionImpl::OnConnectionLost() {
499 if (!connection_lost_handler_.is_null()) 525 if (!connection_lost_handler_.is_null())
500 connection_lost_handler_.Run(); 526 connection_lost_handler_.Run();
501 } 527 }
502 528
529 void ServiceManagerConnectionImpl::OnConnect(
530 const service_manager::ServiceInfo& local_info,
531 const service_manager::ServiceInfo& remote_info) {
532 local_info_ = local_info;
533 for (auto& handler : on_connect_handlers_)
534 handler.second.Run(local_info, remote_info);
535 }
536
503 void ServiceManagerConnectionImpl::GetInterface( 537 void ServiceManagerConnectionImpl::GetInterface(
504 service_manager::mojom::InterfaceProvider* provider, 538 service_manager::mojom::InterfaceProvider* provider,
505 const std::string& interface_name, 539 const std::string& interface_name,
506 mojo::ScopedMessagePipeHandle request_handle) { 540 mojo::ScopedMessagePipeHandle request_handle) {
507 provider->GetInterface(interface_name, std::move(request_handle)); 541 provider->GetInterface(interface_name, std::move(request_handle));
508 } 542 }
509 543
510 } // namespace content 544 } // namespace content
511 545
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698