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

Unified Diff: extensions/common/permissions/api_permission_set.h

Issue 51433002: Enable permission warnings from ManifestHandlers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Working on adding ManifestPermissionSet to PermissionSet. Created 7 years, 1 month 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: extensions/common/permissions/api_permission_set.h
diff --git a/extensions/common/permissions/api_permission_set.h b/extensions/common/permissions/api_permission_set.h
index 9b6f26da35432ff80be0ff89bce6786d386117a8..e9727717679c8b135b17ce70ba25ac56b7d77c67 100644
--- a/extensions/common/permissions/api_permission_set.h
+++ b/extensions/common/permissions/api_permission_set.h
@@ -168,6 +168,181 @@ class APIPermissionSet {
APIPermissionMap map_;
};
+
+// TODO(rpaquay): Is ManifestPermission abstraction really needed, or should we
+// delegate everything to ManifestHandlers?
+class ManifestPermission {
+ public:
+ virtual std::string id() const = 0;
+
+ virtual std::string name() const = 0;
+
+ // Stores this into a new created |value|.
+ virtual scoped_ptr<base::Value> ToValue() const = 0;
+
+ // Clones this.
+ virtual ManifestPermission* Clone() const = 0;
+
+ // Returns a new API permission which equals this - |rhs|.
+ virtual ManifestPermission* Diff(const ManifestPermission* rhs)
+ const = 0;
+
+ // Returns a new API permission which equals the union of this and |rhs|.
+ virtual ManifestPermission* Union(const ManifestPermission* rhs)
+ const = 0;
+
+ // Returns a new API permission which equals the intersect of this and |rhs|.
+ virtual ManifestPermission* Intersect(const ManifestPermission* rhs)
+ const = 0;
+
+ // Returns true if |rhs| is a subset of this.
+ virtual bool Contains(const ManifestPermission* rhs) const = 0;
+
+ // Returns true if |rhs| is equal to this.
+ virtual bool Equal(const ManifestPermission* rhs) const = 0;
+};
+
+typedef std::map<std::string,
+ linked_ptr<ManifestPermission> > ManifestPermissionMap;
+
+class ManifestPermissionSet {
Yoyo Zhou 2013/11/06 04:02:36 Would it make more sense to have the generic at th
rpaquay 2013/11/06 16:16:16 I *think* it might make sense. At the very least,
+ public:
+ class const_iterator :
+ public std::iterator<std::input_iterator_tag, const APIPermission*> {
+ public:
+ const_iterator(const ManifestPermissionMap::const_iterator& it);
+ const_iterator(const const_iterator& ids_it);
+
+ const_iterator& operator++() {
+ ++it_;
+ return *this;
+ }
+
+ const_iterator operator++(int) {
+ const_iterator tmp(it_++);
+ return tmp;
+ }
+
+ bool operator==(const const_iterator& rhs) const {
+ return it_ == rhs.it_;
+ }
+
+ bool operator!=(const const_iterator& rhs) const {
+ return it_ != rhs.it_;
+ }
+
+ const ManifestPermission* operator*() const {
+ return it_->second.get();
+ }
+
+ const ManifestPermission* operator->() const {
+ return it_->second.get();
+ }
+
+ private:
+ ManifestPermissionMap::const_iterator it_;
+ };
+
+ ManifestPermissionSet();
+
+ ManifestPermissionSet(const ManifestPermissionSet& set);
+
+ ~ManifestPermissionSet();
+
+ const_iterator begin() const {
+ return const_iterator(map().begin());
+ }
+
+ const_iterator end() const {
+ return map().end();
+ }
+
+ const_iterator find(std::string id) const {
+ return map().find(id);
+ }
+
+ const ManifestPermissionMap& map() const {
+ return map_;
+ }
+
+ ManifestPermissionMap& map() {
+ return map_;
+ }
+
+ void clear() {
+ map_.clear();
+ }
+
+ size_t count(std::string id) const {
+ return map().count(id);
+ }
+
+ bool empty() const {
+ return map().empty();
+ }
+
+ size_t erase(std::string id) {
+ return map().erase(id);
+ }
+
+ size_t size() const {
+ return map().size();
+ }
+
+ ManifestPermissionSet& operator=(const ManifestPermissionSet& rhs);
+
+ bool operator==(const ManifestPermissionSet& rhs) const;
+
+ bool operator!=(const ManifestPermissionSet& rhs) const {
+ return !operator==(rhs);
+ }
+
+ void insert(std::string id);
+
+ // Insert |permission| into the APIPermissionSet. The APIPermissionSet will
+ // take the ownership of |permission|,
+ void insert(ManifestPermission* permission);
+
+ bool Contains(const ManifestPermissionSet& rhs) const;
+
+ static void Difference(
+ const ManifestPermissionSet& set1,
+ const ManifestPermissionSet& set2,
+ ManifestPermissionSet* set3);
+
+ static void Intersection(
+ const ManifestPermissionSet& set1,
+ const ManifestPermissionSet& set2,
+ ManifestPermissionSet* set3);
+
+ static void Union(
+ const ManifestPermissionSet& set1,
+ const ManifestPermissionSet& set2,
+ ManifestPermissionSet* set3);
+
+ // Parses permissions from |permissions| and adds the parsed permissions to
+ // |manifest_permissions|. If |unhandled_permissions| is not NULL, the names
+ // of all permissions that couldn't be parsed will be added to this vector.
+ // If |error| is NULL, parsing will continue with the next permission if
+ // invalid data is detected. If |error| is not NULL, it will be set to an
+ // error message and false is returned when an invalid permission is found.
+ static bool ParseFromJSON(
+ const base::ListValue* permissions,
+ ManifestPermissionSet* manifest_permissions,
+ string16* error,
+ std::vector<std::string>* unhandled_permissions);
+
+ private:
+ static bool CreateManifestPermission(
+ const std::string& permission_name,
+ const base::Value* permission_value,
+ ManifestPermissionSet* manifest_permissions,
+ string16* error,
+ std::vector<std::string>* unhandled_permissions);
+
+ ManifestPermissionMap map_;
+};
+
} // namespace extensions
#endif // EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_

Powered by Google App Engine
This is Rietveld 408576698