Index: chrome/common/extensions/extension_permission_set.cc |
diff --git a/chrome/common/extensions/extension_permission_set.cc b/chrome/common/extensions/extension_permission_set.cc |
index 8d27abdff6ed2bbcc1ca6f62572202d073feabb2..9e4534d75a69ec3e6d110fa22630dcd28ad5aa81 100644 |
--- a/chrome/common/extensions/extension_permission_set.cc |
+++ b/chrome/common/extensions/extension_permission_set.cc |
@@ -247,6 +247,9 @@ ExtensionPermissionsInfo::ExtensionPermissionsInfo() |
RegisterHostedAppPermission( |
ExtensionAPIPermission::kUnlimitedStorage, "unlimitedStorage", 0, |
ExtensionPermissionMessage::kNone); |
+ RegisterHostedAppPermission( |
+ ExtensionAPIPermission::kPermissions, "permissions", 0, |
+ ExtensionPermissionMessage::kNone); |
// Hosted app and private permissions. |
RegisterPermission( |
@@ -426,6 +429,56 @@ ExtensionPermissionSet::~ExtensionPermissionSet() { |
} |
// static |
+ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference( |
+ const ExtensionPermissionSet* set1, |
+ const ExtensionPermissionSet* set2) { |
+ ExtensionPermissionSet empty; |
+ const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1; |
+ const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2; |
+ |
+ ExtensionAPIPermissionSet apis; |
+ std::set_difference(set1_safe->apis().begin(), set1_safe->apis().end(), |
+ set2_safe->apis().begin(), set2_safe->apis().end(), |
+ std::insert_iterator<ExtensionAPIPermissionSet>( |
+ apis, apis.begin())); |
+ |
+ URLPatternSet explicit_hosts; |
+ URLPatternSet::CreateDifference(set1_safe->explicit_hosts(), |
+ set2_safe->explicit_hosts(), |
+ &explicit_hosts); |
+ |
+ URLPatternSet scriptable_hosts; |
+ URLPatternSet::CreateDifference(set1_safe->scriptable_hosts(), |
+ set2_safe->scriptable_hosts(), |
+ &scriptable_hosts); |
+ return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); |
+} |
+ |
+// static |
+ExtensionPermissionSet* ExtensionPermissionSet::CreateIntersection( |
+ const ExtensionPermissionSet* set1, |
+ const ExtensionPermissionSet* set2) { |
+ ExtensionPermissionSet empty; |
+ const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1; |
+ const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2; |
+ |
+ ExtensionAPIPermissionSet apis; |
+ std::set_intersection(set1_safe->apis().begin(), set1_safe->apis().end(), |
+ set2_safe->apis().begin(), set2_safe->apis().end(), |
+ std::insert_iterator<ExtensionAPIPermissionSet>( |
+ apis, apis.begin())); |
+ URLPatternSet explicit_hosts; |
+ URLPatternSet::CreateIntersection(set1_safe->explicit_hosts(), |
+ set2_safe->explicit_hosts(), |
+ &explicit_hosts); |
+ |
+ URLPatternSet scriptable_hosts; |
+ URLPatternSet::CreateIntersection(set1_safe->scriptable_hosts(), |
+ set2_safe->scriptable_hosts(), |
+ &scriptable_hosts); |
+ return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); |
+} |
+// static |
ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion( |
const ExtensionPermissionSet* set1, |
const ExtensionPermissionSet* set2) { |
@@ -440,10 +493,11 @@ ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion( |
apis, apis.begin())); |
URLPatternSet explicit_hosts; |
- URLPatternSet scriptable_hosts; |
URLPatternSet::CreateUnion(set1_safe->explicit_hosts(), |
set2_safe->explicit_hosts(), |
&explicit_hosts); |
+ |
+ URLPatternSet scriptable_hosts; |
URLPatternSet::CreateUnion(set1_safe->scriptable_hosts(), |
set2_safe->scriptable_hosts(), |
&scriptable_hosts); |
@@ -451,6 +505,31 @@ ExtensionPermissionSet* ExtensionPermissionSet::CreateUnion( |
return new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); |
} |
+bool ExtensionPermissionSet::operator==( |
+ const ExtensionPermissionSet& rhs) const { |
+ return apis_ == rhs.apis_ && |
+ scriptable_hosts_ == rhs.scriptable_hosts_ && |
+ explicit_hosts_ == rhs.explicit_hosts_; |
+} |
+ |
+bool ExtensionPermissionSet::Contains(const ExtensionPermissionSet& set) const { |
+ // Every set includes the empty set. |
+ if (set.IsEmpty()) |
+ return true; |
+ |
+ if (!std::includes(apis_.begin(), apis_.end(), |
+ set.apis().begin(), set.apis().end())) |
+ return false; |
+ |
+ if (!explicit_hosts().Contains(set.explicit_hosts())) |
+ return false; |
+ |
+ if (!scriptable_hosts().Contains(set.scriptable_hosts())) |
+ return false; |
+ |
+ return true; |
+} |
+ |
std::set<std::string> ExtensionPermissionSet::GetAPIsAsStrings() const { |
ExtensionPermissionsInfo* info = ExtensionPermissionsInfo::GetInstance(); |
std::set<std::string> apis_str; |