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

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: . 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 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;

Powered by Google App Engine
This is Rietveld 408576698