1 // Copyright (c) 2012 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/sync/profile_sync_service_factory.h" 6 7 #include "base/command_line.h" 8 #include "base/memory/singleton.h" 9 #include "base/prefs/pref_service.h" 10 #include "chrome/browser/autofill/personal_data_manager_factory.h" 11 #include "chrome/browser/bookmarks/bookmark_model_factory.h" 12 #include "chrome/browser/defaults.h" 13 #include "chrome/browser/history/history_service_factory.h" 14 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 15 #include "chrome/browser/password_manager/password_store_factory.h" 16 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile_manager.h" 18 #include "chrome/browser/search_engines/template_url_service_factory.h" 19 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h" 20 #include "chrome/browser/sessions/tab_restore_service_factory.h" 21 #include "chrome/browser/signin/about_signin_internals_factory.h" 22 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 23 #include "chrome/browser/signin/signin_manager_factory.h" 24 #include "chrome/browser/sync/managed_user_signin_manager_wrapper.h" 25 #include "chrome/browser/sync/profile_sync_components_factory_impl.h" 26 #include "chrome/browser/sync/profile_sync_service.h" 27 #include "chrome/browser/sync/startup_controller.h" 28 #include "chrome/browser/themes/theme_service_factory.h" 29 #include "chrome/browser/ui/global_error/global_error_service_factory.h" 30 #include "chrome/browser/webdata/web_data_service_factory.h" 31 #include "chrome/common/pref_names.h" 32 #include "components/keyed_service/content/browser_context_dependency_manager.h" 33 #include "components/signin/core/browser/profile_oauth2_token_service.h" 34 #include "components/signin/core/browser/signin_manager.h" 35 #include "extensions/browser/extension_system_provider.h" 36 #include "extensions/browser/extensions_browser_client.h" 37 #include "url/gurl.h" 38 39 // static 40 ProfileSyncServiceFactory* ProfileSyncServiceFactory::GetInstance() { 41 return Singleton<ProfileSyncServiceFactory>::get(); 42 } 43 44 // static 45 ProfileSyncService* ProfileSyncServiceFactory::GetForProfile( 46 Profile* profile) { 47 if (!ProfileSyncService::IsSyncEnabled()) 48 return NULL; 49 50 return static_cast<ProfileSyncService*>( 51 GetInstance()->GetServiceForBrowserContext(profile, true)); 52 } 53 54 ProfileSyncServiceFactory::ProfileSyncServiceFactory() 55 : BrowserContextKeyedServiceFactory( 56 "ProfileSyncService", 57 BrowserContextDependencyManager::GetInstance()) { 58 59 // The ProfileSyncService depends on various SyncableServices being around 60 // when it is shut down. Specify those dependencies here to build the proper 61 // destruction order. 62 DependsOn(AboutSigninInternalsFactory::GetInstance()); 63 DependsOn(autofill::PersonalDataManagerFactory::GetInstance()); 64 DependsOn(BookmarkModelFactory::GetInstance()); 65 DependsOn( 66 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); 67 DependsOn(GlobalErrorServiceFactory::GetInstance()); 68 DependsOn(HistoryServiceFactory::GetInstance()); 69 DependsOn(invalidation::ProfileInvalidationProviderFactory::GetInstance()); 70 DependsOn(PasswordStoreFactory::GetInstance()); 71 DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); 72 DependsOn(SigninManagerFactory::GetInstance()); 73 DependsOn(TemplateURLServiceFactory::GetInstance()); 74 #if defined(ENABLE_THEMES) 75 DependsOn(ThemeServiceFactory::GetInstance()); 76 #endif 77 DependsOn(WebDataServiceFactory::GetInstance()); 78 79 // The following have not been converted to KeyedServices yet, 80 // and for now they are explicitly destroyed after the 81 // BrowserContextDependencyManager is told to DestroyBrowserContextServices, 82 // so they will be around when the ProfileSyncService is destroyed. 83 84 // DependsOn(FaviconServiceFactory::GetInstance()); 85 } 86 87 ProfileSyncServiceFactory::~ProfileSyncServiceFactory() { 88 } 89 90 KeyedService* ProfileSyncServiceFactory::BuildServiceInstanceFor( 91 content::BrowserContext* context) const { 92 Profile* profile = static_cast<Profile*>(context); 93 94 SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile); 95 96 // Always create the GCMProfileService instance such that we can listen to 97 // the profile notifications and purge the GCM store when the profile is 98 // being signed out. 99 gcm::GCMProfileServiceFactory::GetForProfile(profile); 100 101 // TODO(atwilson): Change AboutSigninInternalsFactory to load on startup 102 // once http://crbug.com/171406 has been fixed. 103 AboutSigninInternalsFactory::GetForProfile(profile); 104 105 const GURL sync_service_url = 106 ProfileSyncService::GetSyncServiceURL(*CommandLine::ForCurrentProcess()); 107 108 scoped_ptr<ManagedUserSigninManagerWrapper> signin_wrapper( 109 new ManagedUserSigninManagerWrapper(profile, signin)); 110 std::string account_id = signin_wrapper->GetAccountIdToUse(); 111 OAuth2TokenService::ScopeSet scope_set; 112 scope_set.insert(signin_wrapper->GetSyncScopeToUse()); 113 ProfileOAuth2TokenService* token_service = 114 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); 115 net::URLRequestContextGetter* url_request_context_getter = 116 profile->GetRequestContext(); 117 118 // TODO(tim): Currently, AUTO/MANUAL settings refer to the *first* time sync 119 // is set up and *not* a browser restart for a manual-start platform (where 120 // sync has already been set up, and should be able to start without user 121 // intervention). We can get rid of the browser_default eventually, but 122 // need to take care that ProfileSyncService doesn't get tripped up between 123 // those two cases. Bug 88109. 124 browser_sync::ProfileSyncServiceStartBehavior behavior = 125 browser_defaults::kSyncAutoStarts ? browser_sync::AUTO_START 126 : browser_sync::MANUAL_START; 127 ProfileSyncService* pss = new ProfileSyncService( 128 new ProfileSyncComponentsFactoryImpl(profile, 129 CommandLine::ForCurrentProcess(), 130 sync_service_url, 131 account_id, 132 scope_set, 133 token_service, 134 url_request_context_getter), 135 profile, 136 signin_wrapper.Pass(), 137 token_service, 138 behavior); 139 140 pss->factory()->RegisterDataTypes(pss); 141 pss->Initialize(); 142 return pss; 143 } 144 145 // static 146 bool ProfileSyncServiceFactory::HasProfileSyncService(Profile* profile) { 147 return GetInstance()->GetServiceForBrowserContext(profile, false) != NULL; 148 } 149