Chromium Code Reviews| 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" |
| 11 #include "base/lazy_instance.h" | |
| 12 #include "base/memory/linked_ptr.h" | 11 #include "base/memory/linked_ptr.h" |
| 13 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 14 #include "base/scoped_observer.h" | 13 #include "base/scoped_observer.h" |
| 15 #include "base/threading/non_thread_safe.h" | 14 #include "base/threading/non_thread_safe.h" |
| 16 #include "components/keyed_service/core/keyed_service.h" | 15 #include "components/keyed_service/core/keyed_service.h" |
| 17 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 18 #include "content/public/browser/notification_observer.h" | 17 #include "content/public/browser/notification_observer.h" |
| 19 #include "content/public/browser/notification_registrar.h" | 18 #include "content/public/browser/notification_registrar.h" |
| 20 #include "content/public/browser/notification_service.h" | 19 #include "content/public/browser/notification_service.h" |
| 21 #include "extensions/browser/browser_context_keyed_api_factory.h" | 20 #include "extensions/browser/browser_context_keyed_api_factory.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 223 ApiResourceData() : next_id_(1) {} | 222 ApiResourceData() : next_id_(1) {} |
| 224 | 223 |
| 225 int Add(T* api_resource) { | 224 int Add(T* api_resource) { |
| 226 DCHECK(ThreadingTraits::IsCalledOnValidThread()); | 225 DCHECK(ThreadingTraits::IsCalledOnValidThread()); |
| 227 int id = GenerateId(); | 226 int id = GenerateId(); |
| 228 if (id > 0) { | 227 if (id > 0) { |
| 229 linked_ptr<T> resource_ptr(api_resource); | 228 linked_ptr<T> resource_ptr(api_resource); |
| 230 api_resource_map_[id] = resource_ptr; | 229 api_resource_map_[id] = resource_ptr; |
| 231 | 230 |
| 232 const std::string& extension_id = api_resource->owner_extension_id(); | 231 const std::string& extension_id = api_resource->owner_extension_id(); |
| 233 if (extension_resource_map_.find(extension_id) == | 232 ExtensionToResourceMap::iterator it = |
| 234 extension_resource_map_.end()) { | 233 extension_resource_map_.find(extension_id); |
| 235 extension_resource_map_[extension_id] = base::hash_set<int>(); | 234 if (it == extension_resource_map_.end()) { |
| 235 it = extension_resource_map_.insert( | |
| 236 std::make_pair(extension_id, base::hash_set<int>())).first; | |
| 236 } | 237 } |
| 237 extension_resource_map_[extension_id].insert(id); | 238 it->second.insert(id); |
| 238 | |
| 239 return id; | 239 return id; |
| 240 } | 240 } |
| 241 return 0; | 241 return 0; |
| 242 } | 242 } |
| 243 | 243 |
| 244 void Remove(const std::string& extension_id, int api_resource_id) { | 244 void Remove(const std::string& extension_id, int api_resource_id) { |
| 245 DCHECK(ThreadingTraits::IsCalledOnValidThread()); | 245 DCHECK(ThreadingTraits::IsCalledOnValidThread()); |
| 246 if (GetOwnedResource(extension_id, api_resource_id) != NULL) { | 246 if (GetOwnedResource(extension_id, api_resource_id)) { |
| 247 DCHECK(extension_resource_map_.find(extension_id) != | 247 ExtensionToResourceMap::iterator it = |
|
Lei Zhang
2014/09/19 05:53:05
std::map::operator[] has the side effect of creati
Ken Rockot(use gerrit already)
2014/09/19 16:37:06
Ah. Yeah. This is less a problem with operator[] a
| |
| 248 extension_resource_map_.end()); | 248 extension_resource_map_.find(extension_id); |
| 249 extension_resource_map_[extension_id].erase(api_resource_id); | 249 it->second.erase(api_resource_id); |
| 250 api_resource_map_.erase(api_resource_id); | 250 api_resource_map_.erase(api_resource_id); |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 | 253 |
| 254 T* Get(const std::string& extension_id, int api_resource_id) { | 254 T* Get(const std::string& extension_id, int api_resource_id) { |
| 255 DCHECK(ThreadingTraits::IsCalledOnValidThread()); | 255 DCHECK(ThreadingTraits::IsCalledOnValidThread()); |
| 256 return GetOwnedResource(extension_id, api_resource_id); | 256 return GetOwnedResource(extension_id, api_resource_id); |
| 257 } | 257 } |
| 258 | 258 |
| 259 // Change the resource mapped to this |extension_id| at this | 259 // Change the resource mapped to this |extension_id| at this |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { | 318 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { |
| 319 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; | 319 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; |
| 320 T* resource = ptr.get(); | 320 T* resource = ptr.get(); |
| 321 if (resource && extension_id == resource->owner_extension_id()) | 321 if (resource && extension_id == resource->owner_extension_id()) |
| 322 return resource; | 322 return resource; |
| 323 return NULL; | 323 return NULL; |
| 324 } | 324 } |
| 325 | 325 |
| 326 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { | 326 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { |
| 327 DCHECK(ThreadingTraits::IsCalledOnValidThread()); | 327 DCHECK(ThreadingTraits::IsCalledOnValidThread()); |
| 328 if (extension_resource_map_.find(extension_id) == | 328 ExtensionToResourceMap::iterator it = |
| 329 extension_resource_map_.end()) | 329 extension_resource_map_.find(extension_id); |
| 330 if (it == extension_resource_map_.end()) | |
| 330 return NULL; | 331 return NULL; |
| 331 | 332 return &(it->second); |
| 332 return &extension_resource_map_[extension_id]; | |
| 333 } | 333 } |
| 334 | 334 |
| 335 void CleanupResourcesFromUnloadedExtension( | 335 void CleanupResourcesFromUnloadedExtension( |
| 336 const std::string& extension_id) { | 336 const std::string& extension_id) { |
| 337 CleanupResourcesFromExtension(extension_id, true); | 337 CleanupResourcesFromExtension(extension_id, true); |
| 338 } | 338 } |
| 339 | 339 |
| 340 void CleanupResourcesFromSuspendedExtension( | 340 void CleanupResourcesFromSuspendedExtension( |
| 341 const std::string& extension_id) { | 341 const std::string& extension_id) { |
| 342 CleanupResourcesFromExtension(extension_id, false); | 342 CleanupResourcesFromExtension(extension_id, false); |
| 343 } | 343 } |
| 344 | 344 |
| 345 void CleanupResourcesFromExtension(const std::string& extension_id, | 345 void CleanupResourcesFromExtension(const std::string& extension_id, |
| 346 bool remove_all) { | 346 bool remove_all) { |
| 347 DCHECK(ThreadingTraits::IsCalledOnValidThread()); | 347 DCHECK(ThreadingTraits::IsCalledOnValidThread()); |
| 348 | 348 |
| 349 if (extension_resource_map_.find(extension_id) == | 349 ExtensionToResourceMap::iterator it = |
| 350 extension_resource_map_.end()) { | 350 extension_resource_map_.find(extension_id); |
| 351 if (it == extension_resource_map_.end()) | |
| 351 return; | 352 return; |
| 352 } | |
| 353 | 353 |
| 354 // Remove all resources, or the non persistent ones only if |remove_all| | 354 // Remove all resources, or the non persistent ones only if |remove_all| |
| 355 // is false. | 355 // is false. |
| 356 base::hash_set<int>& resource_ids = extension_resource_map_[extension_id]; | 356 base::hash_set<int>& resource_ids = it->second; |
| 357 for (base::hash_set<int>::iterator it = resource_ids.begin(); | 357 for (base::hash_set<int>::iterator it = resource_ids.begin(); |
| 358 it != resource_ids.end();) { | 358 it != resource_ids.end();) { |
| 359 bool erase = false; | 359 bool erase = false; |
| 360 if (remove_all) { | 360 if (remove_all) { |
| 361 erase = true; | 361 erase = true; |
| 362 } else { | 362 } else { |
| 363 linked_ptr<T> ptr = api_resource_map_[*it]; | 363 linked_ptr<T> ptr = api_resource_map_[*it]; |
| 364 T* resource = ptr.get(); | 364 T* resource = ptr.get(); |
| 365 erase = (resource && !resource->IsPersistent()); | 365 erase = (resource && !resource->IsPersistent()); |
| 366 } | 366 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 462 ->GetSequencedTaskRunnerWithShutdownBehavior( | 462 ->GetSequencedTaskRunnerWithShutdownBehavior( |
| 463 content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken( | 463 content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken( |
| 464 T::kSequenceToken), | 464 T::kSequenceToken), |
| 465 T::kShutdownBehavior); | 465 T::kShutdownBehavior); |
| 466 } | 466 } |
| 467 }; | 467 }; |
| 468 | 468 |
| 469 } // namespace extensions | 469 } // namespace extensions |
| 470 | 470 |
| 471 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 471 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
| OLD | NEW |