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

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

Issue 11649053: Banish boilerplate. Profile-keyed API factory for extension API classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: jyasskin's Created 8 years 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/profile_keyed_api_factory.h
diff --git a/chrome/browser/extensions/api/profile_keyed_api_factory.h b/chrome/browser/extensions/api/profile_keyed_api_factory.h
new file mode 100644
index 0000000000000000000000000000000000000000..e8cb29d379cc771cd738943496d0fdda25f06b9b
--- /dev/null
+++ b/chrome/browser/extensions/api/profile_keyed_api_factory.h
@@ -0,0 +1,109 @@
+// 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_PROFILE_KEYED_API_FACTORY_H_
+#define CHROME_BROWSER_EXTENSIONS_API_PROFILE_KEYED_API_FACTORY_H_
+
+#include "chrome/browser/extensions/extension_system_factory.h"
+#include "chrome/browser/profiles/profile_dependency_manager.h"
+#include "chrome/browser/profiles/profile_keyed_service.h"
+#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+
+namespace extensions {
+
+// Instantiations of ProfileKeyedAPIFactory should use this base class
+// and also define a static const char* service_name() function (used in the
+// ProfileKeyedBaseFactory constructor). These fields should be accessible
+// to the ProfileKeyedAPIFactory for the service.
+class ProfileKeyedAPI : public ProfileKeyedService {
+ protected:
+ // Defaults for flags that control ProfileKeyedAPIFactory behavior.
+ // See ProfileKeyedBaseFactory for usage.
+ static const bool kServiceRedirectedInIncognito = false;
+ static const bool kServiceIsNULLWhileTesting = false;
+};
+
+// A template for factories for ProfileKeyedServices that manage extension APIs.
+// T is a ProfileKeyedService that uses this factory template instead of
+// its own separate factory definition to manage its per-profile instances.
+template <typename T>
+class ProfileKeyedAPIFactory : public ProfileKeyedServiceFactory {
+ public:
+ static T* GetForProfile(Profile* profile) {
+ return static_cast<T*>(
+ GetInstance()->GetServiceForProfile(profile, true));
+ }
+
+ // Users of this factory template must manage their own instances
+ // (typically using LazyInstance or Singleton), because those cannot be
+ // included in more than one translation unit (and thus cannot be initialized
+ // in a header file).
+ //
+ // In the header file, declare the specialization, e.g.:
+ // template <>
+ // ProfileKeyedAPIFactory<ProcessesAPI>
+ // ProfileKeyedAPIFactory<ProcessesAPI>::GetInstance();
+ //
+ // In the cc file, provide the implementation:
+ // static base::LazyInstance<ProfileKeyedAPIFactory<ProcessesAPI> >
+ // g_factory = LAZY_INSTANCE_INITIALIZER;
+ //
+ // template <>
+ // ProfileKeyedAPIFactory<ProcessesAPI>*
+ // ProfileKeyedAPIFactory<ProcessesAPI>::GetInstance() {
+ // return &g_factory.Get();
+ // }
+
+ static ProfileKeyedAPIFactory* GetInstance();
+
+ // Declare dependencies on other factories.
+ // By default, ExtensionSystemFactory is the only dependency; however,
+ // specializations can override this. Declare your specialization in
+ // your header file after the ProfileKeyedAPI class definition.
+ // Then in the cc file (or inline in the header), define it, e.g.:
+ // template <>
+ // ProfileKeyedAPIFactory<PushMessagingAPI>::DeclareFactoryDependencies() {
+ // DependsOn(ExtensionSystemFactory::GetInstance());
+ // DependsOn(ProfileSyncServiceFactory::GetInstance());
+ // }
+ void DeclareFactoryDependencies() {
+ DependsOn(ExtensionSystemFactory::GetInstance());
+ }
+
+ ProfileKeyedAPIFactory()
+ : ProfileKeyedServiceFactory(T::service_name(),
+ ProfileDependencyManager::GetInstance()) {
+ DeclareFactoryDependencies();
+ }
+
+ virtual ~ProfileKeyedAPIFactory() {
+ }
+
+ private:
+ // ProfileKeyedServiceFactory implementation.
+ virtual ProfileKeyedService* BuildServiceInstanceFor(
+ Profile* profile) const OVERRIDE {
+ return new T(profile);
+ }
+
+ // ProfileKeyedBaseFactory implementation.
+ // These can be effectively overridden with template specializations.
+ virtual bool ServiceRedirectedInIncognito() const OVERRIDE {
+ return T::kServiceRedirectedInIncognito;
+ }
+
+ virtual bool ServiceIsCreatedWithProfile() const OVERRIDE {
+ return true;
+ }
+
+ virtual bool ServiceIsNULLWhileTesting() const OVERRIDE {
+ return T::kServiceIsNULLWhileTesting;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(ProfileKeyedAPIFactory);
+};
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_EXTENSIONS_API_PROFILE_KEYED_API_FACTORY_H_

Powered by Google App Engine
This is Rietveld 408576698