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

Unified Diff: chrome/browser/extensions/api/api_resource_manager.h

Issue 182213005: Move api_resource{,manager} out of src/chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 9 months 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: chrome/browser/extensions/api/api_resource_manager.h
diff --git a/chrome/browser/extensions/api/api_resource_manager.h b/chrome/browser/extensions/api/api_resource_manager.h
deleted file mode 100644
index 3a115ca5dc80790fd223432af150c34056c3eb7d..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/api/api_resource_manager.h
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_EXTENSIONS_API_API_RESOURCE_MANAGER_H_
-#define CHROME_BROWSER_EXTENSIONS_API_API_RESOURCE_MANAGER_H_
-
-#include <map>
-
-#include "base/containers/hash_tables.h"
-#include "base/lazy_instance.h"
-#include "base/memory/linked_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/threading/non_thread_safe.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/extensions/extension_host.h"
-#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/notification_service.h"
-#include "extensions/browser/browser_context_keyed_api_factory.h"
-#include "extensions/common/extension.h"
-
-namespace extensions {
-namespace api {
-class SerialEventDispatcher;
-class TCPServerSocketEventDispatcher;
-class TCPSocketEventDispatcher;
-class UDPSocketEventDispatcher;
-}
-}
-
-namespace extensions {
-
-// An ApiResourceManager manages the lifetime of a set of resources that
-// ApiFunctions use. Examples are sockets or USB connections.
-//
-// Users of this class should define kThreadId to be the thread that
-// ApiResourceManager to works on. The default is defined in ApiResource.
-// The user must also define a static const char* service_name() that returns
-// the name of the service, and in order for ApiResourceManager to use
-// service_name() friend this class.
-//
-// In the cc file the user must define a GetFactoryInstance() and manage their
-// own instances (typically using LazyInstance or Singleton).
-//
-// E.g.:
-//
-// class Resource {
-// public:
-// static const BrowserThread::ID kThreadId = BrowserThread::FILE;
-// private:
-// friend class ApiResourceManager<Resource>;
-// static const char* service_name() {
-// return "ResourceManager";
-// }
-// };
-//
-// In the cc file:
-//
-// static base::LazyInstance<BrowserContextKeyedAPIFactory<
-// ApiResourceManager<Resource> > >
-// g_factory = LAZY_INSTANCE_INITIALIZER;
-//
-//
-// template <>
-// BrowserContextKeyedAPIFactory<ApiResourceManager<Resource> >*
-// ApiResourceManager<Resource>::GetFactoryInstance() {
-// return g_factory.Pointer();
-// }
-template <class T>
-class ApiResourceManager : public BrowserContextKeyedAPI,
- public base::NonThreadSafe,
- public content::NotificationObserver {
- public:
- explicit ApiResourceManager(content::BrowserContext* context)
- : thread_id_(T::kThreadId), data_(new ApiResourceData(thread_id_)) {
- registrar_.Add(
- this,
- chrome::NOTIFICATION_EXTENSION_UNLOADED,
- content::NotificationService::AllSources());
- registrar_.Add(
- this,
- chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
- content::NotificationService::AllSources());
- }
-
- // For Testing.
- static ApiResourceManager<T>* CreateApiResourceManagerForTest(
- content::BrowserContext* context,
- content::BrowserThread::ID thread_id) {
- ApiResourceManager* manager = new ApiResourceManager<T>(context);
- manager->thread_id_ = thread_id;
- manager->data_ = new ApiResourceData(thread_id);
- return manager;
- }
-
- virtual ~ApiResourceManager() {
- DCHECK(CalledOnValidThread());
- DCHECK(content::BrowserThread::IsMessageLoopValid(thread_id_)) <<
- "A unit test is using an ApiResourceManager but didn't provide "
- "the thread message loop needed for that kind of resource. "
- "Please ensure that the appropriate message loop is operational.";
-
- data_->InititateCleanup();
- }
-
- // BrowserContextKeyedAPI implementation.
- static BrowserContextKeyedAPIFactory<ApiResourceManager<T> >*
- GetFactoryInstance();
-
- // Convenience method to get the ApiResourceManager for a profile.
- static ApiResourceManager<T>* Get(content::BrowserContext* context) {
- return BrowserContextKeyedAPIFactory<ApiResourceManager<T> >::Get(context);
- }
-
- // Takes ownership.
- int Add(T* api_resource) {
- return data_->Add(api_resource);
- }
-
- void Remove(const std::string& extension_id, int api_resource_id) {
- data_->Remove(extension_id, api_resource_id);
- }
-
- T* Get(const std::string& extension_id, int api_resource_id) {
- return data_->Get(extension_id, api_resource_id);
- }
-
- base::hash_set<int>* GetResourceIds(const std::string& extension_id) {
- return data_->GetResourceIds(extension_id);
- }
-
- protected:
- // content::NotificationObserver:
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE {
- switch (type) {
- case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
- std::string id =
- content::Details<extensions::UnloadedExtensionInfo>(details)->
- extension->id();
- data_->InitiateExtensionUnloadedCleanup(id);
- break;
- }
- case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: {
- ExtensionHost* host = content::Details<ExtensionHost>(details).ptr();
- data_->InitiateExtensionSuspendedCleanup(host->extension_id());
- break;
- }
- }
- }
-
- private:
- friend class api::SerialEventDispatcher;
- friend class api::TCPServerSocketEventDispatcher;
- friend class api::TCPSocketEventDispatcher;
- friend class api::UDPSocketEventDispatcher;
- friend class BrowserContextKeyedAPIFactory<ApiResourceManager<T> >;
- // BrowserContextKeyedAPI implementation.
- static const char* service_name() {
- return T::service_name();
- }
- static const bool kServiceHasOwnInstanceInIncognito = true;
- static const bool kServiceIsNULLWhileTesting = true;
-
- // ApiResourceData class handles resource bookkeeping on a thread
- // where resource lifetime is handled.
- class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> {
- public:
- typedef std::map<int, linked_ptr<T> > ApiResourceMap;
- // Lookup map from extension id's to allocated resource id's.
- typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap;
-
- explicit ApiResourceData(const content::BrowserThread::ID thread_id)
- : next_id_(1),
- thread_id_(thread_id) {
- }
-
- int Add(T* api_resource) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
- int id = GenerateId();
- if (id > 0) {
- linked_ptr<T> resource_ptr(api_resource);
- api_resource_map_[id] = resource_ptr;
-
- const std::string& extension_id = api_resource->owner_extension_id();
- if (extension_resource_map_.find(extension_id) ==
- extension_resource_map_.end()) {
- extension_resource_map_[extension_id] = base::hash_set<int>();
- }
- extension_resource_map_[extension_id].insert(id);
-
- return id;
- }
- return 0;
- }
-
- void Remove(const std::string& extension_id, int api_resource_id) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
- if (GetOwnedResource(extension_id, api_resource_id) != NULL) {
- DCHECK(extension_resource_map_.find(extension_id) !=
- extension_resource_map_.end());
- extension_resource_map_[extension_id].erase(api_resource_id);
- api_resource_map_.erase(api_resource_id);
- }
- }
-
- T* Get(const std::string& extension_id, int api_resource_id) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
- return GetOwnedResource(extension_id, api_resource_id);
- }
-
- base::hash_set<int>* GetResourceIds(const std::string& extension_id) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
- return GetOwnedResourceIds(extension_id);
- }
-
- void InitiateExtensionUnloadedCleanup(const std::string& extension_id) {
- content::BrowserThread::PostTask(thread_id_, FROM_HERE,
- base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension,
- this, extension_id));
- }
-
- void InitiateExtensionSuspendedCleanup(const std::string& extension_id) {
- content::BrowserThread::PostTask(thread_id_, FROM_HERE,
- base::Bind(&ApiResourceData::CleanupResourcesFromSuspendedExtension,
- this, extension_id));
- }
-
- void InititateCleanup() {
- content::BrowserThread::PostTask(thread_id_, FROM_HERE,
- base::Bind(&ApiResourceData::Cleanup, this));
- }
-
- private:
- friend class base::RefCountedThreadSafe<ApiResourceData>;
-
- virtual ~ApiResourceData() {}
-
- T* GetOwnedResource(const std::string& extension_id,
- int api_resource_id) {
- linked_ptr<T> ptr = api_resource_map_[api_resource_id];
- T* resource = ptr.get();
- if (resource && extension_id == resource->owner_extension_id())
- return resource;
- return NULL;
- }
-
- base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
- if (extension_resource_map_.find(extension_id) ==
- extension_resource_map_.end())
- return NULL;
-
- return &extension_resource_map_[extension_id];
- }
-
- void CleanupResourcesFromUnloadedExtension(
- const std::string& extension_id) {
- CleanupResourcesFromExtension(extension_id, true);
- }
-
- void CleanupResourcesFromSuspendedExtension(
- const std::string& extension_id) {
- CleanupResourcesFromExtension(extension_id, false);
- }
-
- void CleanupResourcesFromExtension(const std::string& extension_id,
- bool remove_all) {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
-
- if (extension_resource_map_.find(extension_id) ==
- extension_resource_map_.end()) {
- return;
- }
-
- // Remove all resources, or the non persistent ones only if |remove_all|
- // is false.
- base::hash_set<int>& resource_ids =
- extension_resource_map_[extension_id];
- for (base::hash_set<int>::iterator it = resource_ids.begin();
- it != resource_ids.end(); ) {
- bool erase = false;
- if (remove_all) {
- erase = true;
- } else {
- linked_ptr<T> ptr = api_resource_map_[*it];
- T* resource = ptr.get();
- erase = (resource && !resource->IsPersistent());
- }
-
- if (erase) {
- api_resource_map_.erase(*it);
- resource_ids.erase(it++);
- } else {
- ++it;
- }
- } // end for
-
- // Remove extension entry if we removed all its resources.
- if (resource_ids.size() == 0) {
- extension_resource_map_.erase(extension_id);
- }
- }
-
- void Cleanup() {
- DCHECK(content::BrowserThread::CurrentlyOn(thread_id_));
-
- api_resource_map_.clear();
- extension_resource_map_.clear();
- }
-
- int GenerateId() {
- return next_id_++;
- }
-
- int next_id_;
- const content::BrowserThread::ID thread_id_;
- ApiResourceMap api_resource_map_;
- ExtensionToResourceMap extension_resource_map_;
- };
-
- content::BrowserThread::ID thread_id_;
- content::NotificationRegistrar registrar_;
- scoped_refptr<ApiResourceData> data_;
-};
-
-} // namespace extensions
-
-#endif // CHROME_BROWSER_EXTENSIONS_API_API_RESOURCE_MANAGER_H_
« no previous file with comments | « chrome/browser/extensions/api/api_resource.cc ('k') | chrome/browser/extensions/api/api_resource_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698