| 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_
|
|
|