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

Unified Diff: chrome/common/extensions/extension_permission_set.cc

Issue 7432006: Add an experimental permissions API for extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix clang Created 9 years, 5 months 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 side-by-side diff with in-line comments
Download patch
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 0fbf2cd86cdbdc29916114086dd3fd4774b7ab23..462e0220c47dcb04baf391f32d5c3de88833e32b 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(
@@ -433,12 +436,62 @@ ExtensionPermissionSet::~ExtensionPermissionSet() {
}
// static
+ExtensionPermissionSet* ExtensionPermissionSet::CreateDifference(
+ const ExtensionPermissionSet* set1,
+ const ExtensionPermissionSet* set2) {
+ scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
+ 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) {
+ scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
+ 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) {
- ExtensionPermissionSet empty;
- const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? &empty : set1;
- const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? &empty : set2;
+ scoped_refptr<ExtensionPermissionSet> empty = new ExtensionPermissionSet();
+ const ExtensionPermissionSet* set1_safe = (set1 == NULL) ? empty : set1;
+ const ExtensionPermissionSet* set2_safe = (set2 == NULL) ? empty : set2;
ExtensionAPIPermissionSet apis;
std::set_union(set1_safe->apis().begin(), set1_safe->apis().end(),
@@ -447,10 +500,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);
@@ -458,6 +512,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;
« no previous file with comments | « chrome/common/extensions/extension_permission_set.h ('k') | chrome/common/extensions/extension_permission_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698