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

Side by Side Diff: services/service_manager/public/cpp/lib/interface_registry.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 "services/service_manager/public/cpp/interface_registry.h" 5 #include "services/service_manager/public/cpp/interface_registry.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "mojo/public/cpp/bindings/message.h" 9 #include "mojo/public/cpp/bindings/message.h"
10 #include "services/service_manager/public/cpp/connection.h" 10 #include "services/service_manager/public/cpp/connection.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 for (const auto& interface_name : it->second) 53 for (const auto& interface_name : it->second)
54 allowed_interfaces.insert(interface_name); 54 allowed_interfaces.insert(interface_name);
55 } 55 }
56 } 56 }
57 return allowed_interfaces; 57 return allowed_interfaces;
58 } 58 }
59 59
60 60
61 } // namespace 61 } // namespace
62 62
63 InterfaceRegistry::InterfaceRegistry( 63 InterfaceRegistry::InterfaceRegistry(const std::string& name)
64 const Identity& identity,
65 const InterfaceProviderSpec& interface_provider_spec)
66 : binding_(this), 64 : binding_(this),
67 identity_(identity), 65 name_(name),
68 interface_provider_spec_(interface_provider_spec),
69 weak_factory_(this) {} 66 weak_factory_(this) {}
70
71 InterfaceRegistry::~InterfaceRegistry() {} 67 InterfaceRegistry::~InterfaceRegistry() {}
72 68
73 void InterfaceRegistry::Bind( 69 void InterfaceRegistry::Bind(
74 mojom::InterfaceProviderRequest local_interfaces_request, 70 mojom::InterfaceProviderRequest local_interfaces_request,
71 const Identity& local_identity,
72 const InterfaceProviderSpec& local_interface_provider_spec,
75 const Identity& remote_identity, 73 const Identity& remote_identity,
76 const InterfaceProviderSpec& remote_interface_provider_spec) { 74 const InterfaceProviderSpec& remote_interface_provider_spec) {
77 DCHECK(!binding_.is_bound()); 75 DCHECK(!binding_.is_bound());
76 identity_ = local_identity;
77 interface_provider_spec_ = local_interface_provider_spec;
78 remote_identity_ = remote_identity; 78 remote_identity_ = remote_identity;
79 allowed_interfaces_ = GetAllowedInterfaces(remote_interface_provider_spec, 79 allowed_interfaces_ = GetAllowedInterfaces(remote_interface_provider_spec,
80 identity_, 80 identity_,
81 interface_provider_spec_); 81 interface_provider_spec_);
82 allow_all_interfaces_ = 82 allow_all_interfaces_ =
83 allowed_interfaces_.size() == 1 && allowed_interfaces_.count("*") == 1; 83 allowed_interfaces_.size() == 1 && allowed_interfaces_.count("*") == 1;
84 if (!allow_all_interfaces_) { 84 if (!allow_all_interfaces_) {
85 for (auto it = name_to_binder_.begin(); it != name_to_binder_.end(); ++it) { 85 for (auto it = name_to_binder_.begin(); it != name_to_binder_.end();) {
86 if (allowed_interfaces_.count(it->first) == 0) 86 if (allowed_interfaces_.count(it->first) == 0)
87 name_to_binder_.erase(it); 87 it = name_to_binder_.erase(it);
88 else
89 ++it;
88 } 90 }
89 } 91 }
90 binding_.Bind(std::move(local_interfaces_request)); 92 binding_.Bind(std::move(local_interfaces_request));
91 } 93 }
92 94
93 base::WeakPtr<InterfaceRegistry> InterfaceRegistry::GetWeakPtr() { 95 base::WeakPtr<InterfaceRegistry> InterfaceRegistry::GetWeakPtr() {
94 return weak_factory_.GetWeakPtr(); 96 return weak_factory_.GetWeakPtr();
95 } 97 }
96 98
97 bool InterfaceRegistry::AddInterface( 99 bool InterfaceRegistry::AddInterface(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 return; 147 return;
146 } 148 }
147 149
148 auto iter = name_to_binder_.find(interface_name); 150 auto iter = name_to_binder_.find(interface_name);
149 if (iter != name_to_binder_.end()) { 151 if (iter != name_to_binder_.end()) {
150 iter->second->BindInterface(remote_identity_, 152 iter->second->BindInterface(remote_identity_,
151 interface_name, 153 interface_name,
152 std::move(handle)); 154 std::move(handle));
153 } else if (!CanBindRequestForInterface(interface_name)) { 155 } else if (!CanBindRequestForInterface(interface_name)) {
154 std::stringstream ss; 156 std::stringstream ss;
155 ss << "Capability spec prevented service " << remote_identity_.name() 157 ss << "InterfaceProviderSpec \"" << name_ << "\" prevented service: "
156 << " from binding interface: " << interface_name 158 << remote_identity_.name() << " from binding interface: "
157 << " exposed by: " << identity_.name(); 159 << interface_name << " exposed by: " << identity_.name();
158 LOG(ERROR) << ss.str(); 160 LOG(ERROR) << ss.str();
159 mojo::ReportBadMessage(ss.str()); 161 mojo::ReportBadMessage(ss.str());
160 } else if (!default_binder_.is_null()) { 162 } else if (!default_binder_.is_null()) {
161 default_binder_.Run(interface_name, std::move(handle)); 163 default_binder_.Run(interface_name, std::move(handle));
162 } else { 164 } else {
163 LOG(ERROR) << "Failed to locate a binder for interface: " << interface_name 165 LOG(ERROR) << "Failed to locate a binder for interface: " << interface_name
164 << " requested by: " << remote_identity_.name() 166 << " requested by: " << remote_identity_.name()
165 << " exposed by: " << identity_.name(); 167 << " exposed by: " << identity_.name();
166 } 168 }
167 } 169 }
(...skipping 13 matching lines...) Expand all
181 const std::string& interface_name) const { 183 const std::string& interface_name) const {
182 // Any interface may be registered before the registry is bound to a pipe. At 184 // Any interface may be registered before the registry is bound to a pipe. At
183 // bind time, the interfaces exposed will be intersected with the requirements 185 // bind time, the interfaces exposed will be intersected with the requirements
184 // of the source. 186 // of the source.
185 if (!binding_.is_bound()) 187 if (!binding_.is_bound())
186 return true; 188 return true;
187 return allow_all_interfaces_ || allowed_interfaces_.count(interface_name); 189 return allow_all_interfaces_ || allowed_interfaces_.count(interface_name);
188 } 190 }
189 191
190 } // namespace service_manager 192 } // namespace service_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698