diff options
Diffstat (limited to 'components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h')
-rw-r--r-- | components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h b/components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h new file mode 100644 index 0000000..195c657 --- /dev/null +++ b/components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h @@ -0,0 +1,88 @@ +// 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 COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_ +#define COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_ + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h" +#include "components/browser_context_keyed_service/refcounted_browser_context_keyed_service.h" + +class Profile; +class RefcountedProfileKeyedService; + +// A specialized ProfileKeyedServiceFactory that manages a +// RefcountedThreadSafe<>. +// +// While the factory returns RefcountedThreadSafe<>s, the factory itself is a +// base::NotThreadSafe. Only call methods on this object on the UI thread. +// +// Implementers of RefcountedProfileKeyedService should note that we guarantee +// that ShutdownOnUIThread() is called on the UI thread, but actual object +// destruction can happen anywhere. +class RefcountedProfileKeyedServiceFactory : public ProfileKeyedBaseFactory { + public: + // A function that supplies the instance of a ProfileKeyedService for a given + // Profile. This is used primarily for testing, where we want to feed a + // specific mock into the PKSF system. + typedef scoped_refptr<RefcountedProfileKeyedService> + (*FactoryFunction)(content::BrowserContext* profile); + + // Associates |factory| with |profile| so that |factory| is used to create + // the ProfileKeyedService when requested. |factory| can be NULL to signal + // that ProfileKeyedService should be NULL. Multiple calls to + // SetTestingFactory() are allowed; previous services will be shut down. + void SetTestingFactory(content::BrowserContext* profile, + FactoryFunction factory); + + // Associates |factory| with |profile| and immediately returns the created + // ProfileKeyedService. Since the factory will be used immediately, it may + // not be NULL. + scoped_refptr<RefcountedProfileKeyedService> SetTestingFactoryAndUse( + content::BrowserContext* profile, + FactoryFunction factory); + + protected: + RefcountedProfileKeyedServiceFactory(const char* name, + ProfileDependencyManager* manager); + virtual ~RefcountedProfileKeyedServiceFactory(); + + scoped_refptr<RefcountedProfileKeyedService> GetServiceForProfile( + content::BrowserContext* profile, + bool create); + + // Maps |profile| to |service| with debug checks to prevent duplication. + void Associate(content::BrowserContext* profile, + const scoped_refptr<RefcountedProfileKeyedService>& service); + + // All subclasses of RefcountedProfileKeyedServiceFactory must return a + // RefcountedProfileKeyedService instead of just a ProfileKeyedBase. + virtual scoped_refptr<RefcountedProfileKeyedService> BuildServiceInstanceFor( + content::BrowserContext* profile) const = 0; + + virtual void ProfileShutdown(content::BrowserContext* profile) OVERRIDE; + virtual void ProfileDestroyed(content::BrowserContext* profile) OVERRIDE; + virtual void SetEmptyTestingFactory( + content::BrowserContext* profile) OVERRIDE; + virtual void CreateServiceNow(content::BrowserContext* profile) OVERRIDE; + + private: + typedef std::map<content::BrowserContext*, + scoped_refptr<RefcountedProfileKeyedService> > + RefCountedStorage; + typedef std::map<content::BrowserContext*, + FactoryFunction> ProfileOverriddenFunctions; + + // The mapping between a Profile and its refcounted service. + RefCountedStorage mapping_; + + // The mapping between a Profile and its overridden FactoryFunction. + ProfileOverriddenFunctions factories_; + + DISALLOW_COPY_AND_ASSIGN(RefcountedProfileKeyedServiceFactory); +}; + +#endif // COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_ |