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

Unified Diff: content/common/service_manager/service_manager_connection_impl.cc

Issue 2456493003: Add frame-specific InterfaceProviderSpec. (Closed)
Patch Set: . Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/common/service_manager/service_manager_connection_impl.cc
diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc
index 0ba66da6f680fe94ec9ea2fe8625635a6cce106c..1f1ccb9ec5281738e3135e4893cba745376d90d2 100644
--- a/content/common/service_manager/service_manager_connection_impl.cc
+++ b/content/common/service_manager/service_manager_connection_impl.cc
@@ -65,14 +65,17 @@ class ServiceManagerConnectionImpl::IOThreadContext
}
// Safe to call from any thread.
- void Start(const InitializeCallback& initialize_callback,
- const ServiceFactoryCallback& create_service_callback,
- const base::Closure& stop_callback) {
+ void Start(
+ const InitializeCallback& initialize_callback,
+ const ServiceManagerConnection::OnConnectHandler& on_connect_callback,
+ const ServiceFactoryCallback& create_service_callback,
+ const base::Closure& stop_callback) {
DCHECK(!started_);
started_ = true;
callback_task_runner_ = base::ThreadTaskRunnerHandle::Get();
initialize_handler_ = initialize_callback;
+ on_connect_callback_ = on_connect_callback;
create_service_callback_ = create_service_callback;
stop_callback_ = stop_callback;
io_task_runner_->PostTask(
@@ -221,15 +224,20 @@ class ServiceManagerConnectionImpl::IOThreadContext
void OnStart(const service_manager::ServiceInfo& info) override {
DCHECK(io_thread_checker_.CalledOnValidThread());
DCHECK(!initialize_handler_.is_null());
- id_ = info.identity;
+ local_info_ = info;
InitializeCallback handler = base::ResetAndReturn(&initialize_handler_);
- callback_task_runner_->PostTask(FROM_HERE, base::Bind(handler, id_));
+ callback_task_runner_->PostTask(FROM_HERE,
+ base::Bind(handler, local_info_.identity));
}
bool OnConnect(const service_manager::ServiceInfo& remote_info,
service_manager::InterfaceRegistry* registry) override {
DCHECK(io_thread_checker_.CalledOnValidThread());
+
+ callback_task_runner_->PostTask(
+ FROM_HERE, base::Bind(on_connect_callback_, local_info_, remote_info));
+
std::string remote_service = remote_info.identity.name();
if (remote_service == "service:service_manager") {
// Only expose the ServiceFactory interface to the Service Manager.
@@ -312,6 +320,9 @@ class ServiceManagerConnectionImpl::IOThreadContext
// Callback to run once Service::OnStart is invoked.
InitializeCallback initialize_handler_;
+ // Callback to run when a connection request is received.
+ ServiceManagerConnection::OnConnectHandler on_connect_callback_;
+
// Callback to run when a new Service request is received.
ServiceFactoryCallback create_service_callback_;
@@ -322,7 +333,7 @@ class ServiceManagerConnectionImpl::IOThreadContext
// default binder (below) has been set up.
bool has_browser_connection_ = false;
- service_manager::Identity id_;
+ service_manager::ServiceInfo local_info_;
// Default binder callback used for the browser connection's
// InterfaceRegistry.
@@ -414,6 +425,8 @@ void ServiceManagerConnectionImpl::Start() {
context_->Start(
base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized,
weak_factory_.GetWeakPtr()),
+ base::Bind(&ServiceManagerConnectionImpl::OnConnect,
+ weak_factory_.GetWeakPtr()),
base::Bind(&ServiceManagerConnectionImpl::CreateService,
weak_factory_.GetWeakPtr()),
base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost,
@@ -480,6 +493,19 @@ void ServiceManagerConnectionImpl::AddServiceRequestHandler(
DCHECK(result.second);
}
+int ServiceManagerConnectionImpl::AddOnConnectHandler(
+ const OnConnectHandler& handler) {
+ int id = ++next_on_connect_handler_id_;
+ on_connect_handlers_[id] = handler;
+ return id;
+}
+
+void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) {
+ auto it = on_connect_handlers_.find(id);
+ DCHECK(it != on_connect_handlers_.end());
+ on_connect_handlers_.erase(it);
+}
+
void ServiceManagerConnectionImpl::CreateService(
service_manager::mojom::ServiceRequest request,
const std::string& name) {
@@ -500,6 +526,15 @@ void ServiceManagerConnectionImpl::OnConnectionLost() {
connection_lost_handler_.Run();
}
+void ServiceManagerConnectionImpl::OnConnect(
+ const service_manager::ServiceInfo& local_info,
+ const service_manager::ServiceInfo& remote_info) {
+ local_info_ = local_info;
+ last_remote_info_ = remote_info;
Ken Rockot(use gerrit already) 2016/10/27 05:12:52 last_remote_info_ is not used. remove?
+ for (auto& handler : on_connect_handlers_)
+ handler.second.Run(local_info, remote_info);
+}
+
void ServiceManagerConnectionImpl::GetInterface(
service_manager::mojom::InterfaceProvider* provider,
const std::string& interface_name,

Powered by Google App Engine
This is Rietveld 408576698