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

Unified Diff: chrome/browser/profiles/profile_keyed_service_factory.cc

Issue 9703038: Profiles: Really fix refcounted services. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Forgot to save a file. >_< Created 8 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/profiles/profile_keyed_service_factory.cc
diff --git a/chrome/browser/profiles/profile_keyed_service_factory.cc b/chrome/browser/profiles/profile_keyed_service_factory.cc
index 10e14599ffa0bf25f410f659c08fc7a40031cef5..d5ca934aa7edd802ccd2876b9c63ad70da1cd798 100644
--- a/chrome/browser/profiles/profile_keyed_service_factory.cc
+++ b/chrome/browser/profiles/profile_keyed_service_factory.cc
@@ -11,6 +11,34 @@
#include "chrome/browser/profiles/profile_dependency_manager.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
+void ProfileKeyedServiceFactory::SetTestingFactory(Profile* profile,
+ FactoryFunction factory) {
+ // Destroying the profile may cause us to lose data about whether |profile|
+ // has our preferences registered on it (since the profile object itself
+ // isn't dead). See if we need to readd it once we've gone through normal
+ // destruction.
+ bool add_profile = ArePreferencesSetOn(profile);
+
+ // We have to go through the shutdown and destroy mechanisms because there
+ // are unit tests that create a service on a profile and then change the
+ // testing service mid-test.
+ ProfileShutdown(profile);
+ ProfileDestroyed(profile);
+
+ if (add_profile)
+ MarkPreferencesSetOn(profile);
+
+ factories_[profile] = factory;
+}
+
+ProfileKeyedService* ProfileKeyedServiceFactory::SetTestingFactoryAndUse(
+ Profile* profile,
+ FactoryFunction factory) {
+ DCHECK(factory);
+ SetTestingFactory(profile, factory);
+ return GetServiceForProfile(profile, true);
+}
+
ProfileKeyedServiceFactory::ProfileKeyedServiceFactory(
const char* name, ProfileDependencyManager* manager)
: ProfileKeyedBaseFactory(name, manager) {
@@ -23,28 +51,47 @@ ProfileKeyedServiceFactory::~ProfileKeyedServiceFactory() {
ProfileKeyedService* ProfileKeyedServiceFactory::GetServiceForProfile(
Profile* profile,
bool create) {
- return static_cast<ProfileKeyedService*>(GetBaseForProfile(profile, create));
-}
-
-void ProfileKeyedServiceFactory::Associate(Profile* profile,
- ProfileKeyedBase* service) {
- DCHECK(mapping_.find(profile) == mapping_.end());
- mapping_.insert(std::make_pair(
- profile, static_cast<ProfileKeyedService*>(service)));
-}
+ profile = GetProfileToUse(profile);
+ if (!profile)
+ return NULL;
-bool ProfileKeyedServiceFactory::GetAssociation(
- Profile* profile,
- ProfileKeyedBase** out) const {
- bool found = false;
+ // NOTE: If you modify any of the logic below, make sure to update the
+ // refcounted version in refcounted_profile_keyed_service_factory.cc!
+ ProfileKeyedService* service = NULL;
std::map<Profile*, ProfileKeyedService*>::const_iterator it =
mapping_.find(profile);
if (it != mapping_.end()) {
- found = true;
- if (out)
- *out = it->second;
+ return it->second;
+ } else if (create) {
+ // Object not found, and we must create it.
+ //
+ // Check to see if we have a per-Profile testing factory that we should use
+ // instead of default behavior.
+ std::map<Profile*, FactoryFunction>::iterator jt = factories_.find(profile);
+ if (jt != factories_.end()) {
+ if (jt->second) {
+ if (!profile->IsOffTheRecord())
+ RegisterUserPrefsOnProfile(profile);
+ service = jt->second(profile);
+ } else {
+ service = NULL;
+ }
+ } else {
+ service = BuildServiceInstanceFor(profile);
+ }
+ } else {
+ // Object not found, and we're forbidden from creating one.
+ return NULL;
}
- return found;
+
+ Associate(profile, service);
+ return service;
+}
+
+void ProfileKeyedServiceFactory::Associate(Profile* profile,
+ ProfileKeyedService* service) {
+ DCHECK(mapping_.find(profile) == mapping_.end());
+ mapping_.insert(std::make_pair(profile, service));
}
void ProfileKeyedServiceFactory::ProfileShutdown(Profile* profile) {
@@ -62,5 +109,20 @@ void ProfileKeyedServiceFactory::ProfileDestroyed(Profile* profile) {
mapping_.erase(it);
}
+ // For unit tests, we also remove the factory function both so we don't
+ // maintain a big map of dead pointers, but also since we may have a second
+ // object that lives at the same address (see other comments about unit tests
+ // in this file).
+ factories_.erase(profile);
+
ProfileKeyedBaseFactory::ProfileDestroyed(profile);
}
+
+void ProfileKeyedServiceFactory::SetEmptyTestingFactory(
+ Profile* profile) {
+ SetTestingFactory(profile, NULL);
+}
+
+void ProfileKeyedServiceFactory::CreateServiceNow(Profile* profile) {
+ GetServiceForProfile(profile, true);
+}
« no previous file with comments | « chrome/browser/profiles/profile_keyed_service_factory.h ('k') | chrome/browser/profiles/refcounted_profile_keyed_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698