3c1bc710204b6d5fed835d9916e4ef9c9fab0aaf
[platform/framework/web/crosswalk.git] / src / chrome / browser / invalidation / profile_invalidation_provider_factory.cc
1 // Copyright 2014 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/invalidation/profile_invalidation_provider_factory.h"
6
7 #include "base/memory/scoped_ptr.h"
8 #include "base/prefs/pref_registry.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/invalidation/ticl_profile_settings_provider.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/services/gcm/gcm_profile_service.h"
13 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
14 #include "chrome/browser/signin/profile_identity_provider.h"
15 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
16 #include "chrome/browser/signin/signin_manager_factory.h"
17 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
18 #include "chrome/common/chrome_content_client.h"
19 #include "chrome/common/pref_names.h"
20 #include "components/invalidation/invalidation_service.h"
21 #include "components/invalidation/invalidation_state_tracker.h"
22 #include "components/invalidation/invalidator_storage.h"
23 #include "components/invalidation/profile_invalidation_provider.h"
24 #include "components/invalidation/ticl_invalidation_service.h"
25 #include "components/invalidation/ticl_settings_provider.h"
26 #include "components/keyed_service/content/browser_context_dependency_manager.h"
27 #include "components/pref_registry/pref_registry_syncable.h"
28 #include "components/signin/core/browser/profile_oauth2_token_service.h"
29 #include "components/signin/core/browser/signin_manager.h"
30 #include "net/url_request/url_request_context_getter.h"
31
32 #if defined(OS_ANDROID)
33 #include "chrome/browser/invalidation/invalidation_controller_android.h"
34 #include "chrome/browser/invalidation/invalidation_service_android.h"
35 #endif  // defined(OS_ANDROID)
36
37 #if defined(OS_CHROMEOS)
38 #include "base/files/file_path.h"
39 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
40 #include "chrome/browser/chromeos/profiles/profile_helper.h"
41 #include "chrome/browser/chromeos/settings/device_identity_provider.h"
42 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
43 #include "components/user_manager/user_manager.h"
44 #endif
45
46 namespace invalidation {
47
48 // static
49 ProfileInvalidationProvider* ProfileInvalidationProviderFactory::GetForProfile(
50     Profile* profile) {
51 #if defined(OS_CHROMEOS)
52   // Using ProfileHelper::GetSigninProfile() here would lead to an infinite loop
53   // when this method is called during the creation of the sign-in profile
54   // itself. Using ProfileHelper::GetSigninProfileDir() is safe because it does
55   // not try to access the sign-in profile.
56   if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir() ||
57       (user_manager::UserManager::IsInitialized() &&
58        user_manager::UserManager::Get()->IsLoggedInAsGuest())) {
59     // The Chrome OS login and Chrome OS guest profiles do not have GAIA
60     // credentials and do not support invalidation.
61     return NULL;
62   }
63 #endif
64   return static_cast<ProfileInvalidationProvider*>(
65       GetInstance()->GetServiceForBrowserContext(profile, true));
66 }
67
68 // static
69 ProfileInvalidationProviderFactory*
70 ProfileInvalidationProviderFactory::GetInstance() {
71   return Singleton<ProfileInvalidationProviderFactory>::get();
72 }
73
74 ProfileInvalidationProviderFactory::ProfileInvalidationProviderFactory()
75     : BrowserContextKeyedServiceFactory(
76         "InvalidationService",
77         BrowserContextDependencyManager::GetInstance()),
78       testing_factory_(NULL) {
79 #if !defined(OS_ANDROID)
80   DependsOn(SigninManagerFactory::GetInstance());
81   DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
82   DependsOn(gcm::GCMProfileServiceFactory::GetInstance());
83   DependsOn(LoginUIServiceFactory::GetInstance());
84 #endif
85 }
86
87 ProfileInvalidationProviderFactory::~ProfileInvalidationProviderFactory() {
88 }
89
90 void ProfileInvalidationProviderFactory::RegisterTestingFactory(
91     TestingFactoryFunction testing_factory) {
92   testing_factory_ = testing_factory;
93 }
94
95 KeyedService* ProfileInvalidationProviderFactory::BuildServiceInstanceFor(
96     content::BrowserContext* context) const {
97   Profile* profile = static_cast<Profile*>(context);
98
99   if (testing_factory_)
100     return testing_factory_(context);
101
102 #if defined(OS_ANDROID)
103   return new ProfileInvalidationProvider(scoped_ptr<InvalidationService>(
104       new InvalidationServiceAndroid(profile,
105                                      new InvalidationControllerAndroid())));
106 #else
107
108   scoped_ptr<IdentityProvider> identity_provider;
109
110 #if defined(OS_CHROMEOS)
111   policy::BrowserPolicyConnectorChromeOS* connector =
112       g_browser_process->platform_part()->browser_policy_connector_chromeos();
113   if (user_manager::UserManager::IsInitialized() &&
114       user_manager::UserManager::Get()->IsLoggedInAsKioskApp() &&
115       connector->IsEnterpriseManaged()) {
116     identity_provider.reset(new chromeos::DeviceIdentityProvider(
117         chromeos::DeviceOAuth2TokenServiceFactory::Get()));
118   }
119 #endif
120
121   if (!identity_provider) {
122     identity_provider.reset(new ProfileIdentityProvider(
123         SigninManagerFactory::GetForProfile(profile),
124         ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
125         LoginUIServiceFactory::GetForProfile(profile)));
126   }
127
128   scoped_ptr<TiclInvalidationService> service(new TiclInvalidationService(
129       GetUserAgent(),
130       identity_provider.Pass(),
131       scoped_ptr<TiclSettingsProvider>(
132           new TiclProfileSettingsProvider(profile)),
133       gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(),
134       profile->GetRequestContext()));
135   service->Init(scoped_ptr<syncer::InvalidationStateTracker>(
136       new InvalidatorStorage(profile->GetPrefs())));
137
138   return new ProfileInvalidationProvider(service.PassAs<InvalidationService>());
139 #endif
140 }
141
142 void ProfileInvalidationProviderFactory::RegisterProfilePrefs(
143     user_prefs::PrefRegistrySyncable* registry) {
144   registry->RegisterBooleanPref(
145       prefs::kInvalidationServiceUseGCMChannel,
146       false,
147       user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
148   InvalidatorStorage::RegisterProfilePrefs(registry);
149 }
150
151 }  // namespace invalidation