Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ | 5 #ifndef EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ |
| 6 #define EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ | 6 #define EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ |
| 7 | 7 |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 APIPermissionSet* api_permissions, | 161 APIPermissionSet* api_permissions, |
| 162 string16* error, | 162 string16* error, |
| 163 std::vector<std::string>* unhandled_permissions); | 163 std::vector<std::string>* unhandled_permissions); |
| 164 | 164 |
| 165 void AddImpliedPermissions(); | 165 void AddImpliedPermissions(); |
| 166 | 166 |
| 167 private: | 167 private: |
| 168 APIPermissionMap map_; | 168 APIPermissionMap map_; |
| 169 }; | 169 }; |
| 170 | 170 |
| 171 | |
| 172 // TODO(rpaquay): Is ManifestPermission abstraction really needed, or should we | |
| 173 // delegate everything to ManifestHandlers? | |
| 174 class ManifestPermission { | |
| 175 public: | |
| 176 virtual std::string id() const = 0; | |
| 177 | |
| 178 virtual std::string name() const = 0; | |
| 179 | |
| 180 // Stores this into a new created |value|. | |
| 181 virtual scoped_ptr<base::Value> ToValue() const = 0; | |
| 182 | |
| 183 // Clones this. | |
| 184 virtual ManifestPermission* Clone() const = 0; | |
| 185 | |
| 186 // Returns a new API permission which equals this - |rhs|. | |
| 187 virtual ManifestPermission* Diff(const ManifestPermission* rhs) | |
| 188 const = 0; | |
| 189 | |
| 190 // Returns a new API permission which equals the union of this and |rhs|. | |
| 191 virtual ManifestPermission* Union(const ManifestPermission* rhs) | |
| 192 const = 0; | |
| 193 | |
| 194 // Returns a new API permission which equals the intersect of this and |rhs|. | |
| 195 virtual ManifestPermission* Intersect(const ManifestPermission* rhs) | |
| 196 const = 0; | |
| 197 | |
| 198 // Returns true if |rhs| is a subset of this. | |
| 199 virtual bool Contains(const ManifestPermission* rhs) const = 0; | |
| 200 | |
| 201 // Returns true if |rhs| is equal to this. | |
| 202 virtual bool Equal(const ManifestPermission* rhs) const = 0; | |
| 203 }; | |
| 204 | |
| 205 typedef std::map<std::string, | |
| 206 linked_ptr<ManifestPermission> > ManifestPermissionMap; | |
| 207 | |
| 208 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,
| |
| 209 public: | |
| 210 class const_iterator : | |
| 211 public std::iterator<std::input_iterator_tag, const APIPermission*> { | |
| 212 public: | |
| 213 const_iterator(const ManifestPermissionMap::const_iterator& it); | |
| 214 const_iterator(const const_iterator& ids_it); | |
| 215 | |
| 216 const_iterator& operator++() { | |
| 217 ++it_; | |
| 218 return *this; | |
| 219 } | |
| 220 | |
| 221 const_iterator operator++(int) { | |
| 222 const_iterator tmp(it_++); | |
| 223 return tmp; | |
| 224 } | |
| 225 | |
| 226 bool operator==(const const_iterator& rhs) const { | |
| 227 return it_ == rhs.it_; | |
| 228 } | |
| 229 | |
| 230 bool operator!=(const const_iterator& rhs) const { | |
| 231 return it_ != rhs.it_; | |
| 232 } | |
| 233 | |
| 234 const ManifestPermission* operator*() const { | |
| 235 return it_->second.get(); | |
| 236 } | |
| 237 | |
| 238 const ManifestPermission* operator->() const { | |
| 239 return it_->second.get(); | |
| 240 } | |
| 241 | |
| 242 private: | |
| 243 ManifestPermissionMap::const_iterator it_; | |
| 244 }; | |
| 245 | |
| 246 ManifestPermissionSet(); | |
| 247 | |
| 248 ManifestPermissionSet(const ManifestPermissionSet& set); | |
| 249 | |
| 250 ~ManifestPermissionSet(); | |
| 251 | |
| 252 const_iterator begin() const { | |
| 253 return const_iterator(map().begin()); | |
| 254 } | |
| 255 | |
| 256 const_iterator end() const { | |
| 257 return map().end(); | |
| 258 } | |
| 259 | |
| 260 const_iterator find(std::string id) const { | |
| 261 return map().find(id); | |
| 262 } | |
| 263 | |
| 264 const ManifestPermissionMap& map() const { | |
| 265 return map_; | |
| 266 } | |
| 267 | |
| 268 ManifestPermissionMap& map() { | |
| 269 return map_; | |
| 270 } | |
| 271 | |
| 272 void clear() { | |
| 273 map_.clear(); | |
| 274 } | |
| 275 | |
| 276 size_t count(std::string id) const { | |
| 277 return map().count(id); | |
| 278 } | |
| 279 | |
| 280 bool empty() const { | |
| 281 return map().empty(); | |
| 282 } | |
| 283 | |
| 284 size_t erase(std::string id) { | |
| 285 return map().erase(id); | |
| 286 } | |
| 287 | |
| 288 size_t size() const { | |
| 289 return map().size(); | |
| 290 } | |
| 291 | |
| 292 ManifestPermissionSet& operator=(const ManifestPermissionSet& rhs); | |
| 293 | |
| 294 bool operator==(const ManifestPermissionSet& rhs) const; | |
| 295 | |
| 296 bool operator!=(const ManifestPermissionSet& rhs) const { | |
| 297 return !operator==(rhs); | |
| 298 } | |
| 299 | |
| 300 void insert(std::string id); | |
| 301 | |
| 302 // Insert |permission| into the APIPermissionSet. The APIPermissionSet will | |
| 303 // take the ownership of |permission|, | |
| 304 void insert(ManifestPermission* permission); | |
| 305 | |
| 306 bool Contains(const ManifestPermissionSet& rhs) const; | |
| 307 | |
| 308 static void Difference( | |
| 309 const ManifestPermissionSet& set1, | |
| 310 const ManifestPermissionSet& set2, | |
| 311 ManifestPermissionSet* set3); | |
| 312 | |
| 313 static void Intersection( | |
| 314 const ManifestPermissionSet& set1, | |
| 315 const ManifestPermissionSet& set2, | |
| 316 ManifestPermissionSet* set3); | |
| 317 | |
| 318 static void Union( | |
| 319 const ManifestPermissionSet& set1, | |
| 320 const ManifestPermissionSet& set2, | |
| 321 ManifestPermissionSet* set3); | |
| 322 | |
| 323 // Parses permissions from |permissions| and adds the parsed permissions to | |
| 324 // |manifest_permissions|. If |unhandled_permissions| is not NULL, the names | |
| 325 // of all permissions that couldn't be parsed will be added to this vector. | |
| 326 // If |error| is NULL, parsing will continue with the next permission if | |
| 327 // invalid data is detected. If |error| is not NULL, it will be set to an | |
| 328 // error message and false is returned when an invalid permission is found. | |
| 329 static bool ParseFromJSON( | |
| 330 const base::ListValue* permissions, | |
| 331 ManifestPermissionSet* manifest_permissions, | |
| 332 string16* error, | |
| 333 std::vector<std::string>* unhandled_permissions); | |
| 334 | |
| 335 private: | |
| 336 static bool CreateManifestPermission( | |
| 337 const std::string& permission_name, | |
| 338 const base::Value* permission_value, | |
| 339 ManifestPermissionSet* manifest_permissions, | |
| 340 string16* error, | |
| 341 std::vector<std::string>* unhandled_permissions); | |
| 342 | |
| 343 ManifestPermissionMap map_; | |
| 344 }; | |
| 345 | |
| 171 } // namespace extensions | 346 } // namespace extensions |
| 172 | 347 |
| 173 #endif // EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ | 348 #endif // EXTENSIONS_COMMON_PERMISSIONS_API_PERMISSION_SET_H_ |
| OLD | NEW |