Index: services/shell/service_manager.cc |
diff --git a/services/shell/service_manager.cc b/services/shell/service_manager.cc |
index 721640077631ab5e81053473ff5f8a1e4dbfcc74..256e132120b81c2c61edec5077f32d8151d09115 100644 |
--- a/services/shell/service_manager.cc |
+++ b/services/shell/service_manager.cc |
@@ -364,7 +364,7 @@ class ServiceManager::Instance |
LOG(ERROR) << "Instance: " << identity_.name() << " running as: " |
<< identity_.user_id() << " attempting to connect to: " |
<< target.name() << " as: " << target.user_id() << " without " |
- << " the mojo:shell{user_id} capability class."; |
+ << " the service:shell{user_id} capability class."; |
callback.Run(mojom::ConnectResult::ACCESS_DENIED, |
mojom::kInheritUserID); |
return false; |
@@ -487,8 +487,13 @@ ServiceManager::ServiceManager( |
weak_ptr_factory_(this) { |
mojom::ServicePtr service; |
mojom::ServiceRequest request = mojo::GetProxy(&service); |
+ |
+ CapabilitySpec capabilities = GetPermissiveCapabilities(); |
+ capabilities.provided["control"].insert( |
+ "shell::mojom::ServiceManagerControl"); |
+ |
service_manager_instance_ = CreateInstance( |
- Identity(), CreateServiceManagerIdentity(), GetPermissiveCapabilities()); |
+ Identity(), CreateServiceManagerIdentity(), capabilities); |
service_manager_instance_->StartWithService(std::move(service)); |
singletons_.insert(kServiceManagerName); |
service_context_.reset(new ServiceContext(this, std::move(request))); |
@@ -538,10 +543,11 @@ mojom::ServiceRequest ServiceManager::StartEmbedderService( |
bool ServiceManager::OnConnect(const Identity& remote_identity, |
InterfaceRegistry* registry) { |
- // The only interface we expose is mojom::ServiceManager, and access to this |
- // interface is brokered by a policy specific to each caller, managed by the |
- // caller's instance. Here we look to see who's calling, and forward to the |
- // caller's instance to continue. |
+ registry->AddInterface<mojom::ServiceManagerControl>(this); |
+ |
+ // Access to mojom::ServiceManager is brokered by a policy specific to each |
+ // caller, managed by the caller's instance. Here we look to see who's |
+ // calling, and forward to the caller's instance to continue. |
Instance* instance = nullptr; |
for (const auto& entry : identity_to_instance_) { |
if (entry.first == remote_identity) { |
@@ -554,18 +560,35 @@ bool ServiceManager::OnConnect(const Identity& remote_identity, |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// ServiceManager, InterfaceFactory<mojom::ServiceManagerControl> implementation |
+ |
+void ServiceManager::Create(const Identity& remote_identity, |
+ mojom::ServiceManagerControlRequest request) { |
+ control_bindings_.AddBinding(this, std::move(request)); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// ServiceManager, ServiceManagerControl implementation |
+ |
+void ServiceManager::OverridePackagePath( |
+ const std::string& service_name, |
+ const base::FilePath& path, |
+ const OverridePackagePathCallback& callback) { |
+ package_path_overrides_.insert(std::make_pair(service_name, path)); |
+ callback.Run(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// ServiceManager, private: |
void ServiceManager::InitCatalog(mojom::ServicePtr catalog) { |
// TODO(beng): It'd be great to build this from the manifest, however there's |
// a bit of a chicken-and-egg problem. |
CapabilitySpec spec; |
- Interfaces interfaces; |
- interfaces.insert("filesystem::mojom::Directory"); |
- spec.provided["app"] = interfaces; |
- Instance* instance = CreateInstance(CreateServiceManagerIdentity(), |
- CreateCatalogIdentity(), |
- spec); |
+ spec.provided["app"].insert("filesystem::mojom::Directory"); |
+ spec.provided["control"].insert("catalog::mojom::CatalogControl"); |
+ Instance* instance = CreateInstance( |
+ CreateServiceManagerIdentity(), CreateCatalogIdentity(), spec); |
singletons_.insert(kCatalogName); |
instance->StartWithService(std::move(catalog)); |
} |
@@ -787,6 +810,10 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params, |
Identity source = params->source(); |
+ auto override_iter = package_path_overrides_.find(target.name()); |
+ if (override_iter != package_path_overrides_.end()) |
+ result->package_path = override_iter->second; |
+ |
// Services that request "all_users" class from the Service Manager are |
// allowed to field connection requests from any user. They also run with a |
// synthetic user id generated here. The user id provided via Connect() is |