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 3 // found in the LICENSE file. 4 5 #include "extensions/common/permissions/permissions_info.h" 6 7 #include "base/lazy_instance.h" 8 #include "base/logging.h" 9 #include "base/stl_util.h" 10 #include "base/strings/string_util.h" 11 12 namespace extensions { 13 14 static base::LazyInstance<PermissionsInfo> g_permissions_info = 15 LAZY_INSTANCE_INITIALIZER; 16 17 // static 18 PermissionsInfo* PermissionsInfo::GetInstance() { 19 return g_permissions_info.Pointer(); 20 } 21 22 void PermissionsInfo::AddProvider(const PermissionsProvider& provider) { 23 std::vector<APIPermissionInfo*> permissions = provider.GetAllPermissions(); 24 std::vector<PermissionsProvider::AliasInfo> aliases = 25 provider.GetAllAliases(); 26 27 for (size_t i = 0; i < permissions.size(); ++i) 28 RegisterPermission(permissions[i]); 29 for (size_t i = 0; i < aliases.size(); ++i) 30 RegisterAlias(aliases[i].name, aliases[i].alias); 31 } 32 33 const APIPermissionInfo* PermissionsInfo::GetByID( 34 APIPermission::ID id) const { 35 IDMap::const_iterator i = id_map_.find(id); 36 return (i == id_map_.end()) ? NULL : i->second; 37 } 38 39 const APIPermissionInfo* PermissionsInfo::GetByName( 40 const std::string& name) const { 41 NameMap::const_iterator i = name_map_.find(name); 42 return (i == name_map_.end()) ? NULL : i->second; 43 } 44 45 APIPermissionSet PermissionsInfo::GetAll() const { 46 APIPermissionSet permissions; 47 for (IDMap::const_iterator i = id_map_.begin(); i != id_map_.end(); ++i) 48 permissions.insert(i->second->id()); 49 return permissions; 50 } 51 52 APIPermissionSet PermissionsInfo::GetAllByName( 53 const std::set<std::string>& permission_names) const { 54 APIPermissionSet permissions; 55 for (std::set<std::string>::const_iterator i = permission_names.begin(); 56 i != permission_names.end(); ++i) { 57 const APIPermissionInfo* permission_info = GetByName(*i); 58 if (permission_info) 59 permissions.insert(permission_info->id()); 60 } 61 return permissions; 62 } 63 64 bool PermissionsInfo::HasChildPermissions(const std::string& name) const { 65 NameMap::const_iterator i = name_map_.lower_bound(name + '.'); 66 if (i == name_map_.end()) return false; 67 return StartsWithASCII(i->first, name + '.', true); 68 } 69 70 PermissionsInfo::PermissionsInfo() 71 : hosted_app_permission_count_(0), 72 permission_count_(0) { 73 } 74 75 PermissionsInfo::~PermissionsInfo() { 76 STLDeleteContainerPairSecondPointers(id_map_.begin(), id_map_.end()); 77 } 78 79 void PermissionsInfo::RegisterAlias( 80 const char* name, 81 const char* alias) { 82 DCHECK(ContainsKey(name_map_, name)); 83 DCHECK(!ContainsKey(name_map_, alias)); 84 name_map_[alias] = name_map_[name]; 85 } 86 87 void PermissionsInfo::RegisterPermission(APIPermissionInfo* permission) { 88 DCHECK(!ContainsKey(id_map_, permission->id())); 89 DCHECK(!ContainsKey(name_map_, permission->name())); 90 91 id_map_[permission->id()] = permission; 92 name_map_[permission->name()] = permission; 93 94 permission_count_++; 95 } 96 97 } // namespace extensions 98