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