OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "extensions/common/extension_api.h" | 5 #include "extensions/common/extension_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
255 const FeatureProvider* provider) { | 255 const FeatureProvider* provider) { |
256 dependency_providers_[name] = provider; | 256 dependency_providers_[name] = provider; |
257 } | 257 } |
258 | 258 |
259 bool ExtensionAPI::IsAnyFeatureAvailableToContext(const Feature& api, | 259 bool ExtensionAPI::IsAnyFeatureAvailableToContext(const Feature& api, |
260 const Extension* extension, | 260 const Extension* extension, |
261 Feature::Context context, | 261 Feature::Context context, |
262 const GURL& url) { | 262 const GURL& url) { |
263 FeatureProviderMap::iterator provider = dependency_providers_.find("api"); | 263 FeatureProviderMap::iterator provider = dependency_providers_.find("api"); |
264 CHECK(provider != dependency_providers_.end()); | 264 CHECK(provider != dependency_providers_.end()); |
265 | |
265 if (api.IsAvailableToContext(extension, context, url).is_available()) | 266 if (api.IsAvailableToContext(extension, context, url).is_available()) |
266 return true; | 267 return true; |
267 | 268 |
268 // Check to see if there are any parts of this API that are allowed in this | 269 // Check to see if there are any parts of this API that are allowed in this |
269 // context. | 270 // context. |
270 const std::vector<Feature*> features = provider->second->GetChildren(api); | 271 const std::vector<Feature*> features = provider->second->GetChildren(api); |
271 for (std::vector<Feature*>::const_iterator it = features.begin(); | 272 for (std::vector<Feature*>::const_iterator it = features.begin(); |
272 it != features.end(); | 273 it != features.end(); |
273 ++it) { | 274 ++it) { |
274 if ((*it)->IsAvailableToContext(extension, context, url).is_available()) | 275 if ((*it)->IsAvailableToContext(extension, context, url).is_available()) |
275 return true; | 276 return true; |
276 } | 277 } |
277 return false; | 278 return false; |
278 } | 279 } |
279 | 280 |
280 Feature::Availability ExtensionAPI::IsAvailable(const std::string& full_name, | 281 Feature::Availability ExtensionAPI::IsAvailable(const std::string& full_name, |
281 const Extension* extension, | 282 const Extension* extension, |
282 Feature::Context context, | 283 Feature::Context context, |
283 const GURL& url) { | 284 const GURL& url) { |
284 Feature* feature = GetFeatureDependency(full_name); | 285 Feature* feature = GetFeatureDependency(full_name); |
285 if (!feature) { | 286 if (!feature) { |
286 return Feature::CreateAvailability(Feature::NOT_PRESENT, | 287 return Feature::CreateAvailability(Feature::NOT_PRESENT, |
287 std::string("Unknown feature: ") + full_name); | 288 std::string("Unknown feature: ") + full_name); |
288 } | 289 } |
289 return feature->IsAvailableToContext(extension, context, url); | 290 return feature->IsAvailableToContext(extension, context, url); |
290 } | 291 } |
291 | 292 |
292 bool ExtensionAPI::IsPrivileged(const std::string& full_name) { | 293 bool ExtensionAPI::IsAvailableInUntrustedContext(const std::string& name, |
293 Feature* feature = GetFeatureDependency(full_name); | 294 const Extension* extension) { |
294 CHECK(feature) << full_name; | 295 return IsAvailable(name, extension, Feature::CONTENT_SCRIPT_CONTEXT, GURL()) |
Ken Rockot(use gerrit already)
2014/07/09 16:24:15
Heh, this is a little awkward to read, but I reali
not at google - send to devlin
2014/07/09 16:26:26
I agree! I can rename in a follow up.
| |
295 DCHECK(!feature->GetContexts()->empty()) << full_name; | 296 .is_available() || |
296 // An API is 'privileged' if it can only be run in a blessed context. | 297 IsAvailable( |
297 return feature->GetContexts()->size() == | 298 name, extension, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL()) |
298 feature->GetContexts()->count(Feature::BLESSED_EXTENSION_CONTEXT); | 299 .is_available() || |
300 IsAvailable(name, extension, Feature::BLESSED_WEB_PAGE_CONTEXT, GURL()) | |
301 .is_available() || | |
302 IsAvailable(name, extension, Feature::WEB_PAGE_CONTEXT, GURL()) | |
303 .is_available(); | |
299 } | 304 } |
300 | 305 |
301 const base::DictionaryValue* ExtensionAPI::GetSchema( | 306 const base::DictionaryValue* ExtensionAPI::GetSchema( |
302 const std::string& full_name) { | 307 const std::string& full_name) { |
303 std::string child_name; | 308 std::string child_name; |
304 std::string api_name = GetAPINameFromFullName(full_name, &child_name); | 309 std::string api_name = GetAPINameFromFullName(full_name, &child_name); |
305 | 310 |
306 const base::DictionaryValue* result = NULL; | 311 const base::DictionaryValue* result = NULL; |
307 SchemaMap::iterator maybe_schema = schemas_.find(api_name); | 312 SchemaMap::iterator maybe_schema = schemas_.find(api_name); |
308 if (maybe_schema != schemas_.end()) { | 313 if (maybe_schema != schemas_.end()) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
382 break; | 387 break; |
383 | 388 |
384 api_name_candidate = api_name_candidate.substr(0, last_dot_index); | 389 api_name_candidate = api_name_candidate.substr(0, last_dot_index); |
385 } | 390 } |
386 | 391 |
387 *child_name = ""; | 392 *child_name = ""; |
388 return std::string(); | 393 return std::string(); |
389 } | 394 } |
390 | 395 |
391 } // namespace extensions | 396 } // namespace extensions |
OLD | NEW |