Chromium Code Reviews| 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_ |