| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_BROWSER_API_API_RESOURCE_MANAGER_H_ | 5 #ifndef EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
| 6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> { | 169 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> { |
| 170 public: | 170 public: |
| 171 typedef std::map<int, linked_ptr<T> > ApiResourceMap; | 171 typedef std::map<int, linked_ptr<T> > ApiResourceMap; |
| 172 // Lookup map from extension id's to allocated resource id's. | 172 // Lookup map from extension id's to allocated resource id's. |
| 173 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap; | 173 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap; |
| 174 | 174 |
| 175 explicit ApiResourceData(const content::BrowserThread::ID thread_id) | 175 explicit ApiResourceData(const content::BrowserThread::ID thread_id) |
| 176 : next_id_(1), thread_id_(thread_id) {} | 176 : next_id_(1), thread_id_(thread_id) {} |
| 177 | 177 |
| 178 int Add(T* api_resource) { | 178 int Add(T* api_resource) { |
| 179 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 179 DCHECK_CURRENTLY_ON(thread_id_); |
| 180 int id = GenerateId(); | 180 int id = GenerateId(); |
| 181 if (id > 0) { | 181 if (id > 0) { |
| 182 linked_ptr<T> resource_ptr(api_resource); | 182 linked_ptr<T> resource_ptr(api_resource); |
| 183 api_resource_map_[id] = resource_ptr; | 183 api_resource_map_[id] = resource_ptr; |
| 184 | 184 |
| 185 const std::string& extension_id = api_resource->owner_extension_id(); | 185 const std::string& extension_id = api_resource->owner_extension_id(); |
| 186 if (extension_resource_map_.find(extension_id) == | 186 if (extension_resource_map_.find(extension_id) == |
| 187 extension_resource_map_.end()) { | 187 extension_resource_map_.end()) { |
| 188 extension_resource_map_[extension_id] = base::hash_set<int>(); | 188 extension_resource_map_[extension_id] = base::hash_set<int>(); |
| 189 } | 189 } |
| 190 extension_resource_map_[extension_id].insert(id); | 190 extension_resource_map_[extension_id].insert(id); |
| 191 | 191 |
| 192 return id; | 192 return id; |
| 193 } | 193 } |
| 194 return 0; | 194 return 0; |
| 195 } | 195 } |
| 196 | 196 |
| 197 void Remove(const std::string& extension_id, int api_resource_id) { | 197 void Remove(const std::string& extension_id, int api_resource_id) { |
| 198 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 198 DCHECK_CURRENTLY_ON(thread_id_); |
| 199 if (GetOwnedResource(extension_id, api_resource_id) != NULL) { | 199 if (GetOwnedResource(extension_id, api_resource_id) != NULL) { |
| 200 DCHECK(extension_resource_map_.find(extension_id) != | 200 DCHECK(extension_resource_map_.find(extension_id) != |
| 201 extension_resource_map_.end()); | 201 extension_resource_map_.end()); |
| 202 extension_resource_map_[extension_id].erase(api_resource_id); | 202 extension_resource_map_[extension_id].erase(api_resource_id); |
| 203 api_resource_map_.erase(api_resource_id); | 203 api_resource_map_.erase(api_resource_id); |
| 204 } | 204 } |
| 205 } | 205 } |
| 206 | 206 |
| 207 T* Get(const std::string& extension_id, int api_resource_id) { | 207 T* Get(const std::string& extension_id, int api_resource_id) { |
| 208 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 208 DCHECK_CURRENTLY_ON(thread_id_); |
| 209 return GetOwnedResource(extension_id, api_resource_id); | 209 return GetOwnedResource(extension_id, api_resource_id); |
| 210 } | 210 } |
| 211 | 211 |
| 212 base::hash_set<int>* GetResourceIds(const std::string& extension_id) { | 212 base::hash_set<int>* GetResourceIds(const std::string& extension_id) { |
| 213 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 213 DCHECK_CURRENTLY_ON(thread_id_); |
| 214 return GetOwnedResourceIds(extension_id); | 214 return GetOwnedResourceIds(extension_id); |
| 215 } | 215 } |
| 216 | 216 |
| 217 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) { | 217 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) { |
| 218 content::BrowserThread::PostTask( | 218 content::BrowserThread::PostTask( |
| 219 thread_id_, | 219 thread_id_, |
| 220 FROM_HERE, | 220 FROM_HERE, |
| 221 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension, | 221 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension, |
| 222 this, | 222 this, |
| 223 extension_id)); | 223 extension_id)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 244 | 244 |
| 245 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { | 245 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { |
| 246 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; | 246 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; |
| 247 T* resource = ptr.get(); | 247 T* resource = ptr.get(); |
| 248 if (resource && extension_id == resource->owner_extension_id()) | 248 if (resource && extension_id == resource->owner_extension_id()) |
| 249 return resource; | 249 return resource; |
| 250 return NULL; | 250 return NULL; |
| 251 } | 251 } |
| 252 | 252 |
| 253 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { | 253 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { |
| 254 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 254 DCHECK_CURRENTLY_ON(thread_id_); |
| 255 if (extension_resource_map_.find(extension_id) == | 255 if (extension_resource_map_.find(extension_id) == |
| 256 extension_resource_map_.end()) | 256 extension_resource_map_.end()) |
| 257 return NULL; | 257 return NULL; |
| 258 | 258 |
| 259 return &extension_resource_map_[extension_id]; | 259 return &extension_resource_map_[extension_id]; |
| 260 } | 260 } |
| 261 | 261 |
| 262 void CleanupResourcesFromUnloadedExtension( | 262 void CleanupResourcesFromUnloadedExtension( |
| 263 const std::string& extension_id) { | 263 const std::string& extension_id) { |
| 264 CleanupResourcesFromExtension(extension_id, true); | 264 CleanupResourcesFromExtension(extension_id, true); |
| 265 } | 265 } |
| 266 | 266 |
| 267 void CleanupResourcesFromSuspendedExtension( | 267 void CleanupResourcesFromSuspendedExtension( |
| 268 const std::string& extension_id) { | 268 const std::string& extension_id) { |
| 269 CleanupResourcesFromExtension(extension_id, false); | 269 CleanupResourcesFromExtension(extension_id, false); |
| 270 } | 270 } |
| 271 | 271 |
| 272 void CleanupResourcesFromExtension(const std::string& extension_id, | 272 void CleanupResourcesFromExtension(const std::string& extension_id, |
| 273 bool remove_all) { | 273 bool remove_all) { |
| 274 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 274 DCHECK_CURRENTLY_ON(thread_id_); |
| 275 | 275 |
| 276 if (extension_resource_map_.find(extension_id) == | 276 if (extension_resource_map_.find(extension_id) == |
| 277 extension_resource_map_.end()) { | 277 extension_resource_map_.end()) { |
| 278 return; | 278 return; |
| 279 } | 279 } |
| 280 | 280 |
| 281 // Remove all resources, or the non persistent ones only if |remove_all| | 281 // Remove all resources, or the non persistent ones only if |remove_all| |
| 282 // is false. | 282 // is false. |
| 283 base::hash_set<int>& resource_ids = extension_resource_map_[extension_id]; | 283 base::hash_set<int>& resource_ids = extension_resource_map_[extension_id]; |
| 284 for (base::hash_set<int>::iterator it = resource_ids.begin(); | 284 for (base::hash_set<int>::iterator it = resource_ids.begin(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 300 } | 300 } |
| 301 } // end for | 301 } // end for |
| 302 | 302 |
| 303 // Remove extension entry if we removed all its resources. | 303 // Remove extension entry if we removed all its resources. |
| 304 if (resource_ids.size() == 0) { | 304 if (resource_ids.size() == 0) { |
| 305 extension_resource_map_.erase(extension_id); | 305 extension_resource_map_.erase(extension_id); |
| 306 } | 306 } |
| 307 } | 307 } |
| 308 | 308 |
| 309 void Cleanup() { | 309 void Cleanup() { |
| 310 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 310 DCHECK_CURRENTLY_ON(thread_id_); |
| 311 | 311 |
| 312 api_resource_map_.clear(); | 312 api_resource_map_.clear(); |
| 313 extension_resource_map_.clear(); | 313 extension_resource_map_.clear(); |
| 314 } | 314 } |
| 315 | 315 |
| 316 int GenerateId() { return next_id_++; } | 316 int GenerateId() { return next_id_++; } |
| 317 | 317 |
| 318 int next_id_; | 318 int next_id_; |
| 319 const content::BrowserThread::ID thread_id_; | 319 const content::BrowserThread::ID thread_id_; |
| 320 ApiResourceMap api_resource_map_; | 320 ApiResourceMap api_resource_map_; |
| 321 ExtensionToResourceMap extension_resource_map_; | 321 ExtensionToResourceMap extension_resource_map_; |
| 322 }; | 322 }; |
| 323 | 323 |
| 324 content::BrowserThread::ID thread_id_; | 324 content::BrowserThread::ID thread_id_; |
| 325 content::NotificationRegistrar registrar_; | 325 content::NotificationRegistrar registrar_; |
| 326 scoped_refptr<ApiResourceData> data_; | 326 scoped_refptr<ApiResourceData> data_; |
| 327 }; | 327 }; |
| 328 | 328 |
| 329 } // namespace extensions | 329 } // namespace extensions |
| 330 | 330 |
| 331 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 331 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
| OLD | NEW |