| Index: chrome/common/extensions/permissions/permission_set.cc
|
| diff --git a/chrome/common/extensions/permissions/permission_set.cc b/chrome/common/extensions/permissions/permission_set.cc
|
| index 5b51616c1e88b03e6795467af0a3966ae488d046..be0318cbc4439d6c04ef47620cfc195135150112 100644
|
| --- a/chrome/common/extensions/permissions/permission_set.cc
|
| +++ b/chrome/common/extensions/permissions/permission_set.cc
|
| @@ -128,10 +128,7 @@ PermissionSet* PermissionSet::CreateDifference(
|
| const PermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
|
|
|
| APIPermissionSet apis;
|
| - std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(),
|
| - set2_safe->apis().begin(), set2_safe->apis().end(),
|
| - std::insert_iterator<APIPermissionSet>(
|
| - apis, apis.begin()));
|
| + APIPermissionSet::Difference(set1_safe->apis(), set2_safe->apis(), &apis);
|
|
|
| URLPatternSet explicit_hosts;
|
| URLPatternSet::CreateDifference(set1_safe->explicit_hosts(),
|
| @@ -155,10 +152,8 @@ PermissionSet* PermissionSet::CreateIntersection(
|
| const PermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
|
|
|
| APIPermissionSet apis;
|
| - std::set_intersection(set1_safe->apis().begin(), set1_safe->apis().end(),
|
| - set2_safe->apis().begin(), set2_safe->apis().end(),
|
| - std::insert_iterator<APIPermissionSet>(
|
| - apis, apis.begin()));
|
| + APIPermissionSet::Intersection(set1_safe->apis(), set2_safe->apis(), &apis);
|
| +
|
| URLPatternSet explicit_hosts;
|
| URLPatternSet::CreateIntersection(set1_safe->explicit_hosts(),
|
| set2_safe->explicit_hosts(),
|
| @@ -181,10 +176,7 @@ PermissionSet* PermissionSet::CreateUnion(
|
| const PermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
|
|
|
| APIPermissionSet apis;
|
| - std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(),
|
| - set2_safe->apis().begin(), set2_safe->apis().end(),
|
| - std::insert_iterator<APIPermissionSet>(
|
| - apis, apis.begin()));
|
| + APIPermissionSet::Union(set1_safe->apis(), set2_safe->apis(), &apis);
|
|
|
| URLPatternSet explicit_hosts;
|
| URLPatternSet::CreateUnion(set1_safe->explicit_hosts(),
|
| @@ -211,9 +203,23 @@ bool PermissionSet::Contains(const PermissionSet& set) const {
|
| if (set.IsEmpty())
|
| return true;
|
|
|
| - if (!std::includes(apis_.begin(), apis_.end(),
|
| - set.apis().begin(), set.apis().end()))
|
| - return false;
|
| + APIPermissionSet::const_iterator first1 = apis_.begin();
|
| + APIPermissionSet::const_iterator first2 = set.apis().begin();
|
| + APIPermissionSet::const_iterator end1 = apis_.end();
|
| + APIPermissionSet::const_iterator end2 = set.apis().end();
|
| +
|
| + while (first1 != end1 && first2 != end2) {
|
| + if (first1->id() > first2->id()) {
|
| + return false;
|
| + } else if (first1->id() < first2->id()) {
|
| + ++first1;
|
| + } else {
|
| + if (!first1->Contains(*first2))
|
| + return false;
|
| + first1++;
|
| + first2++;
|
| + }
|
| + }
|
|
|
| if (!explicit_hosts().Contains(set.explicit_hosts()))
|
| return false;
|
| @@ -225,13 +231,10 @@ bool PermissionSet::Contains(const PermissionSet& set) const {
|
| }
|
|
|
| std::set<std::string> PermissionSet::GetAPIsAsStrings() const {
|
| - PermissionsInfo* info = PermissionsInfo::GetInstance();
|
| std::set<std::string> apis_str;
|
| for (APIPermissionSet::const_iterator i = apis_.begin();
|
| i != apis_.end(); ++i) {
|
| - APIPermission* permission = info->GetByID(*i);
|
| - if (permission)
|
| - apis_str.insert(permission->name());
|
| + apis_str.insert(i->name());
|
| }
|
| return apis_str;
|
| }
|
| @@ -335,8 +338,21 @@ bool PermissionSet::IsEmpty() const {
|
| }
|
|
|
| bool PermissionSet::HasAPIPermission(
|
| - APIPermission::ID permission) const {
|
| - return apis().find(permission) != apis().end();
|
| + APIPermission::ID id) const {
|
| + return apis().find(id) != apis().end();
|
| +}
|
| +
|
| +bool PermissionSet::CheckAPIPermission(APIPermission::ID permission) const {
|
| + return CheckAPIPermissionWithDetail(permission, NULL);
|
| +}
|
| +
|
| +bool PermissionSet::CheckAPIPermissionWithDetail(
|
| + APIPermission::ID permission,
|
| + const APIPermissionDetail::DetailParam* detail) const {
|
| + APIPermissionSet::const_iterator iter = apis().find(permission);
|
| + if (iter == apis().end())
|
| + return false;
|
| + return iter->Check(detail);
|
| }
|
|
|
| bool PermissionSet::HasAccessToFunction(
|
| @@ -389,11 +405,9 @@ bool PermissionSet::HasEffectiveAccessToAllHosts() const {
|
| return true;
|
| }
|
|
|
| - PermissionsInfo* info = PermissionsInfo::GetInstance();
|
| for (APIPermissionSet::const_iterator i = apis().begin();
|
| i != apis().end(); ++i) {
|
| - APIPermission* permission = info->GetByID(*i);
|
| - if (permission->implies_full_url_access())
|
| + if (i->permission()->implies_full_url_access())
|
| return true;
|
| }
|
| return false;
|
| @@ -405,11 +419,9 @@ bool PermissionSet::HasEffectiveAccessToURL(
|
| }
|
|
|
| bool PermissionSet::HasEffectiveFullAccess() const {
|
| - PermissionsInfo* info = PermissionsInfo::GetInstance();
|
| for (APIPermissionSet::const_iterator i = apis().begin();
|
| i != apis().end(); ++i) {
|
| - APIPermission* permission = info->GetByID(*i);
|
| - if (permission->implies_full_access())
|
| + if (i->permission()->implies_full_access())
|
| return true;
|
| }
|
| return false;
|
| @@ -539,7 +551,7 @@ std::set<PermissionMessage>
|
| i != apis_.end(); ++i) {
|
| DCHECK_GT(PermissionMessage::kNone,
|
| PermissionMessage::kUnknown);
|
| - APIPermission* perm = info->GetByID(*i);
|
| + APIPermission* perm = info->GetByID(i->id());
|
| if (perm && perm->message_id() > PermissionMessage::kNone)
|
| messages.insert(perm->GetMessage_());
|
| }
|
|
|