• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/profiles/profile_keyed_service_factory.h"
6 
7 #include <vector>
8 
9 #include "base/memory/singleton.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/profiles/profile_dependency_manager.h"
12 #include "chrome/browser/profiles/profile_keyed_service.h"
13 
ProfileKeyedServiceFactory(ProfileDependencyManager * manager)14 ProfileKeyedServiceFactory::ProfileKeyedServiceFactory(
15     ProfileDependencyManager* manager)
16     : dependency_manager_(manager), factory_(NULL) {
17   dependency_manager_->AddComponent(this);
18 }
19 
~ProfileKeyedServiceFactory()20 ProfileKeyedServiceFactory::~ProfileKeyedServiceFactory() {
21   dependency_manager_->RemoveComponent(this);
22   DCHECK(mapping_.empty());
23 }
24 
GetServiceForProfile(Profile * profile)25 ProfileKeyedService* ProfileKeyedServiceFactory::GetServiceForProfile(
26     Profile* profile) {
27   // Possibly handle Incognito mode.
28   if (profile->IsOffTheRecord()) {
29     if (ServiceRedirectedInIncognito()) {
30       profile = profile->GetOriginalProfile();
31     } else if (ServiceHasOwnInstanceInIncognito()) {
32       // No-op; the pointers are already set correctly.
33     } else {
34       return NULL;
35     }
36   }
37 
38   ProfileKeyedService* service;
39 
40   std::map<Profile*, ProfileKeyedService*>::iterator it =
41       mapping_.find(profile);
42   if (it != mapping_.end()) {
43     service = it->second;
44     if (service || !factory_)
45       return service;
46 
47     // service is NULL but we have a mock factory function
48     mapping_.erase(it);
49     service = factory_(profile);
50   } else {
51     service = BuildServiceInstanceFor(profile);
52   }
53 
54   Associate(profile, service);
55   return service;
56 }
57 
DependsOn(ProfileKeyedServiceFactory * rhs)58 void ProfileKeyedServiceFactory::DependsOn(ProfileKeyedServiceFactory* rhs) {
59   dependency_manager_->AddEdge(rhs, this);
60 }
61 
Associate(Profile * profile,ProfileKeyedService * service)62 void ProfileKeyedServiceFactory::Associate(Profile* profile,
63                                            ProfileKeyedService* service) {
64   DCHECK(mapping_.find(profile) == mapping_.end());
65   mapping_.insert(std::make_pair(profile, service));
66 }
67 
ServiceRedirectedInIncognito()68 bool ProfileKeyedServiceFactory::ServiceRedirectedInIncognito() {
69   return false;
70 }
71 
ServiceHasOwnInstanceInIncognito()72 bool ProfileKeyedServiceFactory::ServiceHasOwnInstanceInIncognito() {
73   return false;
74 }
75 
ProfileShutdown(Profile * profile)76 void ProfileKeyedServiceFactory::ProfileShutdown(Profile* profile) {
77   std::map<Profile*, ProfileKeyedService*>::iterator it =
78       mapping_.find(profile);
79   if (it != mapping_.end() && it->second)
80     it->second->Shutdown();
81 }
82 
ProfileDestroyed(Profile * profile)83 void ProfileKeyedServiceFactory::ProfileDestroyed(Profile* profile) {
84   std::map<Profile*, ProfileKeyedService*>::iterator it =
85       mapping_.find(profile);
86   if (it != mapping_.end()) {
87     delete it->second;
88     mapping_.erase(it);
89   }
90 }
91