| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/profile_sync_service.h" | 5 #include "chrome/browser/sync/profile_sync_service.h" |
| 6 | 6 |
| 7 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "chrome/browser/chrome_notification_types.h" | 31 #include "chrome/browser/chrome_notification_types.h" |
| 32 #include "chrome/browser/defaults.h" | 32 #include "chrome/browser/defaults.h" |
| 33 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" | 33 #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" |
| 34 #include "chrome/browser/net/chrome_cookie_notification_details.h" | 34 #include "chrome/browser/net/chrome_cookie_notification_details.h" |
| 35 #include "chrome/browser/prefs/chrome_pref_service_factory.h" | 35 #include "chrome/browser/prefs/chrome_pref_service_factory.h" |
| 36 #include "chrome/browser/prefs/pref_service_syncable.h" | 36 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 37 #include "chrome/browser/profiles/profile.h" | 37 #include "chrome/browser/profiles/profile.h" |
| 38 #include "chrome/browser/services/gcm/gcm_profile_service.h" | 38 #include "chrome/browser/services/gcm/gcm_profile_service.h" |
| 39 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h" | 39 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h" |
| 40 #include "chrome/browser/signin/about_signin_internals_factory.h" | 40 #include "chrome/browser/signin/about_signin_internals_factory.h" |
| 41 #include "chrome/browser/signin/chrome_signin_client_factory.h" |
| 41 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 42 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 42 #include "chrome/browser/signin/signin_manager_factory.h" | 43 #include "chrome/browser/signin/signin_manager_factory.h" |
| 43 #include "chrome/browser/sync/backend_migrator.h" | 44 #include "chrome/browser/sync/backend_migrator.h" |
| 44 #include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" | 45 #include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" |
| 45 #include "chrome/browser/sync/glue/device_info.h" | 46 #include "chrome/browser/sync/glue/device_info.h" |
| 46 #include "chrome/browser/sync/glue/favicon_cache.h" | 47 #include "chrome/browser/sync/glue/favicon_cache.h" |
| 47 #include "chrome/browser/sync/glue/sync_backend_host.h" | 48 #include "chrome/browser/sync/glue/sync_backend_host.h" |
| 48 #include "chrome/browser/sync/glue/sync_backend_host_impl.h" | 49 #include "chrome/browser/sync/glue/sync_backend_host_impl.h" |
| 49 #include "chrome/browser/sync/glue/sync_start_util.h" | 50 #include "chrome/browser/sync/glue/sync_start_util.h" |
| 50 #include "chrome/browser/sync/glue/synced_device_tracker.h" | 51 #include "chrome/browser/sync/glue/synced_device_tracker.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 } // anonymous namespace | 182 } // anonymous namespace |
| 182 | 183 |
| 183 bool ShouldShowActionOnUI( | 184 bool ShouldShowActionOnUI( |
| 184 const syncer::SyncProtocolError& error) { | 185 const syncer::SyncProtocolError& error) { |
| 185 return (error.action != syncer::UNKNOWN_ACTION && | 186 return (error.action != syncer::UNKNOWN_ACTION && |
| 186 error.action != syncer::DISABLE_SYNC_ON_CLIENT && | 187 error.action != syncer::DISABLE_SYNC_ON_CLIENT && |
| 187 error.action != syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT); | 188 error.action != syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT); |
| 188 } | 189 } |
| 189 | 190 |
| 190 ProfileSyncService::ProfileSyncService( | 191 ProfileSyncService::ProfileSyncService( |
| 191 ProfileSyncComponentsFactory* factory, | 192 scoped_ptr<ProfileSyncComponentsFactory> factory, |
| 192 Profile* profile, | 193 Profile* profile, |
| 193 scoped_ptr<SupervisedUserSigninManagerWrapper> signin_wrapper, | 194 scoped_ptr<SupervisedUserSigninManagerWrapper> signin_wrapper, |
| 194 ProfileOAuth2TokenService* oauth2_token_service, | 195 ProfileOAuth2TokenService* oauth2_token_service, |
| 195 ProfileSyncServiceStartBehavior start_behavior) | 196 ProfileSyncServiceStartBehavior start_behavior) |
| 196 : OAuth2TokenService::Consumer("sync"), | 197 : OAuth2TokenService::Consumer("sync"), |
| 197 last_auth_error_(AuthError::AuthErrorNone()), | 198 last_auth_error_(AuthError::AuthErrorNone()), |
| 198 passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), | 199 passphrase_required_reason_(syncer::REASON_PASSPHRASE_NOT_REQUIRED), |
| 199 factory_(factory), | 200 factory_(factory.Pass()), |
| 200 profile_(profile), | 201 profile_(profile), |
| 201 sync_prefs_(profile_->GetPrefs()), | 202 sync_prefs_(profile_->GetPrefs()), |
| 202 sync_service_url_(GetSyncServiceURL(*CommandLine::ForCurrentProcess())), | 203 sync_service_url_(GetSyncServiceURL(*CommandLine::ForCurrentProcess())), |
| 203 is_first_time_sync_configure_(false), | 204 is_first_time_sync_configure_(false), |
| 204 backend_initialized_(false), | 205 backend_initialized_(false), |
| 205 sync_disabled_by_admin_(false), | 206 sync_disabled_by_admin_(false), |
| 206 is_auth_in_progress_(false), | 207 is_auth_in_progress_(false), |
| 207 signin_(signin_wrapper.Pass()), | 208 signin_(signin_wrapper.Pass()), |
| 208 unrecoverable_error_reason_(ERROR_REASON_UNSET), | 209 unrecoverable_error_reason_(ERROR_REASON_UNSET), |
| 209 expect_sync_configuration_aborted_(false), | 210 expect_sync_configuration_aborted_(false), |
| (...skipping 26 matching lines...) Expand all Loading... |
| 236 startup_controller_weak_factory_.GetWeakPtr(), | 237 startup_controller_weak_factory_.GetWeakPtr(), |
| 237 ROLLBACK)), | 238 ROLLBACK)), |
| 238 backend_mode_(IDLE), | 239 backend_mode_(IDLE), |
| 239 backup_start_delay_(base::TimeDelta::FromSeconds(kBackupStartDelay)), | 240 backup_start_delay_(base::TimeDelta::FromSeconds(kBackupStartDelay)), |
| 240 clear_browsing_data_(base::Bind(&ClearBrowsingData)) { | 241 clear_browsing_data_(base::Bind(&ClearBrowsingData)) { |
| 241 DCHECK(profile); | 242 DCHECK(profile); |
| 242 syncer::SyncableService::StartSyncFlare flare( | 243 syncer::SyncableService::StartSyncFlare flare( |
| 243 sync_start_util::GetFlareForSyncableService(profile->GetPath())); | 244 sync_start_util::GetFlareForSyncableService(profile->GetPath())); |
| 244 scoped_ptr<browser_sync::LocalSessionEventRouter> router( | 245 scoped_ptr<browser_sync::LocalSessionEventRouter> router( |
| 245 new NotificationServiceSessionsRouter(profile, flare)); | 246 new NotificationServiceSessionsRouter(profile, flare)); |
| 247 |
| 248 DCHECK(factory_.get()); |
| 249 local_device_ = factory_->CreateLocalDeviceInfoProvider(); |
| 246 sessions_sync_manager_.reset( | 250 sessions_sync_manager_.reset( |
| 247 new SessionsSyncManager(profile, this, router.Pass())); | 251 new SessionsSyncManager(profile, local_device_.get(), router.Pass())); |
| 248 } | 252 } |
| 249 | 253 |
| 250 ProfileSyncService::~ProfileSyncService() { | 254 ProfileSyncService::~ProfileSyncService() { |
| 251 sync_prefs_.RemoveSyncPrefObserver(this); | 255 sync_prefs_.RemoveSyncPrefObserver(this); |
| 252 // Shutdown() should have been called before destruction. | 256 // Shutdown() should have been called before destruction. |
| 253 CHECK(!backend_initialized_); | 257 CHECK(!backend_initialized_); |
| 254 } | 258 } |
| 255 | 259 |
| 256 bool ProfileSyncService::IsSyncEnabledAndLoggedIn() { | 260 bool ProfileSyncService::IsSyncEnabledAndLoggedIn() { |
| 257 // Exit if sync is disabled. | 261 // Exit if sync is disabled. |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 browser_sync::OpenTabsUIDelegate* ProfileSyncService::GetOpenTabsUIDelegate() { | 421 browser_sync::OpenTabsUIDelegate* ProfileSyncService::GetOpenTabsUIDelegate() { |
| 418 if (!IsSessionsDataTypeControllerRunning()) | 422 if (!IsSessionsDataTypeControllerRunning()) |
| 419 return NULL; | 423 return NULL; |
| 420 return sessions_sync_manager_.get(); | 424 return sessions_sync_manager_.get(); |
| 421 } | 425 } |
| 422 | 426 |
| 423 browser_sync::FaviconCache* ProfileSyncService::GetFaviconCache() { | 427 browser_sync::FaviconCache* ProfileSyncService::GetFaviconCache() { |
| 424 return sessions_sync_manager_->GetFaviconCache(); | 428 return sessions_sync_manager_->GetFaviconCache(); |
| 425 } | 429 } |
| 426 | 430 |
| 427 scoped_ptr<browser_sync::DeviceInfo> | 431 browser_sync::SyncedWindowDelegatesGetter* |
| 428 ProfileSyncService::GetLocalDeviceInfo() const { | 432 ProfileSyncService::GetSyncedWindowDelegatesGetter() const { |
| 429 if (HasSyncingBackend()) { | 433 return sessions_sync_manager_->GetSyncedWindowDelegatesGetter(); |
| 430 browser_sync::SyncedDeviceTracker* device_tracker = | 434 } |
| 431 backend_->GetSyncedDeviceTracker(); | 435 |
| 432 if (device_tracker) | 436 browser_sync::LocalDeviceInfoProvider* |
| 433 return device_tracker->ReadLocalDeviceInfo(); | 437 ProfileSyncService::GetLocalDeviceInfoProvider() { |
| 434 } | 438 return local_device_.get(); |
| 435 return scoped_ptr<browser_sync::DeviceInfo>(); | |
| 436 } | 439 } |
| 437 | 440 |
| 438 scoped_ptr<browser_sync::DeviceInfo> | 441 scoped_ptr<browser_sync::DeviceInfo> |
| 439 ProfileSyncService::GetDeviceInfo(const std::string& client_id) const { | 442 ProfileSyncService::GetDeviceInfo(const std::string& client_id) const { |
| 440 if (HasSyncingBackend()) { | 443 if (HasSyncingBackend()) { |
| 441 browser_sync::SyncedDeviceTracker* device_tracker = | 444 browser_sync::SyncedDeviceTracker* device_tracker = |
| 442 backend_->GetSyncedDeviceTracker(); | 445 backend_->GetSyncedDeviceTracker(); |
| 443 if (device_tracker) | 446 if (device_tracker) |
| 444 return device_tracker->ReadDeviceInfo(client_id); | 447 return device_tracker->ReadDeviceInfo(client_id); |
| 445 } | 448 } |
| 446 return scoped_ptr<browser_sync::DeviceInfo>(); | 449 return scoped_ptr<browser_sync::DeviceInfo>(); |
| 447 } | 450 } |
| 448 | 451 |
| 449 ScopedVector<browser_sync::DeviceInfo> | 452 ScopedVector<browser_sync::DeviceInfo> |
| 450 ProfileSyncService::GetAllSignedInDevices() const { | 453 ProfileSyncService::GetAllSignedInDevices() const { |
| 451 ScopedVector<browser_sync::DeviceInfo> devices; | 454 ScopedVector<browser_sync::DeviceInfo> devices; |
| 452 if (HasSyncingBackend()) { | 455 if (HasSyncingBackend()) { |
| 453 browser_sync::SyncedDeviceTracker* device_tracker = | 456 browser_sync::SyncedDeviceTracker* device_tracker = |
| 454 backend_->GetSyncedDeviceTracker(); | 457 backend_->GetSyncedDeviceTracker(); |
| 455 if (device_tracker) { | 458 if (device_tracker) { |
| 456 // TODO(lipalani) - Make device tracker return a scoped vector. | 459 // TODO(lipalani) - Make device tracker return a scoped vector. |
| 457 device_tracker->GetAllSyncedDeviceInfo(&devices); | 460 device_tracker->GetAllSyncedDeviceInfo(&devices); |
| 458 } | 461 } |
| 459 } | 462 } |
| 460 return devices.Pass(); | 463 return devices.Pass(); |
| 461 } | 464 } |
| 462 | 465 |
| 463 std::string ProfileSyncService::GetLocalSyncCacheGUID() const { | |
| 464 if (HasSyncingBackend()) { | |
| 465 browser_sync::SyncedDeviceTracker* device_tracker = | |
| 466 backend_->GetSyncedDeviceTracker(); | |
| 467 if (device_tracker) { | |
| 468 return device_tracker->cache_guid(); | |
| 469 } | |
| 470 } | |
| 471 return std::string(); | |
| 472 } | |
| 473 | |
| 474 // Notifies the observer of any device info changes. | 466 // Notifies the observer of any device info changes. |
| 475 void ProfileSyncService::AddObserverForDeviceInfoChange( | 467 void ProfileSyncService::AddObserverForDeviceInfoChange( |
| 476 browser_sync::SyncedDeviceTracker::Observer* observer) { | 468 browser_sync::SyncedDeviceTracker::Observer* observer) { |
| 477 if (HasSyncingBackend()) { | 469 if (HasSyncingBackend()) { |
| 478 browser_sync::SyncedDeviceTracker* device_tracker = | 470 browser_sync::SyncedDeviceTracker* device_tracker = |
| 479 backend_->GetSyncedDeviceTracker(); | 471 backend_->GetSyncedDeviceTracker(); |
| 480 if (device_tracker) { | 472 if (device_tracker) { |
| 481 device_tracker->AddObserver(observer); | 473 device_tracker->AddObserver(observer); |
| 482 } | 474 } |
| 483 } | 475 } |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 DCHECK(FirstSetupInProgress()); | 1056 DCHECK(FirstSetupInProgress()); |
| 1065 } | 1057 } |
| 1066 | 1058 |
| 1067 NotifyObservers(); | 1059 NotifyObservers(); |
| 1068 } | 1060 } |
| 1069 | 1061 |
| 1070 void ProfileSyncService::OnBackendInitialized( | 1062 void ProfileSyncService::OnBackendInitialized( |
| 1071 const syncer::WeakHandle<syncer::JsBackend>& js_backend, | 1063 const syncer::WeakHandle<syncer::JsBackend>& js_backend, |
| 1072 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& | 1064 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& |
| 1073 debug_info_listener, | 1065 debug_info_listener, |
| 1066 const std::string& cache_guid, |
| 1074 bool success) { | 1067 bool success) { |
| 1075 UpdateBackendInitUMA(success); | 1068 UpdateBackendInitUMA(success); |
| 1076 | 1069 |
| 1077 if (!success) { | 1070 if (!success) { |
| 1078 // Something went unexpectedly wrong. Play it safe: stop syncing at once | 1071 // Something went unexpectedly wrong. Play it safe: stop syncing at once |
| 1079 // and surface error UI to alert the user sync has stopped. | 1072 // and surface error UI to alert the user sync has stopped. |
| 1080 // Keep the directory around for now so that on restart we will retry | 1073 // Keep the directory around for now so that on restart we will retry |
| 1081 // again and potentially succeed in presence of transient file IO failures | 1074 // again and potentially succeed in presence of transient file IO failures |
| 1082 // or permissions issues, etc. | 1075 // or permissions issues, etc. |
| 1083 // | 1076 // |
| 1084 // TODO(rlarocque): Consider making this UnrecoverableError less special. | 1077 // TODO(rlarocque): Consider making this UnrecoverableError less special. |
| 1085 // Unlike every other UnrecoverableError, it does not delete our sync data. | 1078 // Unlike every other UnrecoverableError, it does not delete our sync data. |
| 1086 // This exception made sense at the time it was implemented, but our new | 1079 // This exception made sense at the time it was implemented, but our new |
| 1087 // directory corruption recovery mechanism makes it obsolete. By the time | 1080 // directory corruption recovery mechanism makes it obsolete. By the time |
| 1088 // we get here, we will have already tried and failed to delete the | 1081 // we get here, we will have already tried and failed to delete the |
| 1089 // directory. It would be no big deal if we tried to delete it again. | 1082 // directory. It would be no big deal if we tried to delete it again. |
| 1090 OnInternalUnrecoverableError(FROM_HERE, | 1083 OnInternalUnrecoverableError(FROM_HERE, |
| 1091 "BackendInitialize failure", | 1084 "BackendInitialize failure", |
| 1092 false, | 1085 false, |
| 1093 ERROR_REASON_BACKEND_INIT_FAILURE); | 1086 ERROR_REASON_BACKEND_INIT_FAILURE); |
| 1094 return; | 1087 return; |
| 1095 } | 1088 } |
| 1096 | 1089 |
| 1097 backend_initialized_ = true; | 1090 backend_initialized_ = true; |
| 1098 | 1091 |
| 1099 sync_js_controller_.AttachJsBackend(js_backend); | 1092 sync_js_controller_.AttachJsBackend(js_backend); |
| 1100 debug_info_listener_ = debug_info_listener; | 1093 debug_info_listener_ = debug_info_listener; |
| 1101 | 1094 |
| 1095 SigninClient* signin_client = |
| 1096 ChromeSigninClientFactory::GetForProfile(profile_); |
| 1097 DCHECK(signin_client); |
| 1098 std::string signin_scoped_device_id = |
| 1099 signin_client->GetSigninScopedDeviceId(); |
| 1100 |
| 1101 // Initialize local device info. |
| 1102 local_device_->Initialize(cache_guid, signin_scoped_device_id); |
| 1103 |
| 1102 // Give the DataTypeControllers a handle to the now initialized backend | 1104 // Give the DataTypeControllers a handle to the now initialized backend |
| 1103 // as a UserShare. | 1105 // as a UserShare. |
| 1104 for (DataTypeController::TypeMap::iterator it = | 1106 for (DataTypeController::TypeMap::iterator it = |
| 1105 directory_data_type_controllers_.begin(); | 1107 directory_data_type_controllers_.begin(); |
| 1106 it != directory_data_type_controllers_.end(); ++it) { | 1108 it != directory_data_type_controllers_.end(); ++it) { |
| 1107 it->second->OnUserShareReady(GetUserShare()); | 1109 it->second->OnUserShareReady(GetUserShare()); |
| 1108 } | 1110 } |
| 1109 | 1111 |
| 1110 if (backend_mode_ == BACKUP || backend_mode_ == ROLLBACK) | 1112 if (backend_mode_ == BACKUP || backend_mode_ == ROLLBACK) |
| 1111 ConfigureDataTypeManager(); | 1113 ConfigureDataTypeManager(); |
| (...skipping 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2658 browser_sync::SyncedDeviceTracker* device_tracker = | 2660 browser_sync::SyncedDeviceTracker* device_tracker = |
| 2659 backend_->GetSyncedDeviceTracker(); | 2661 backend_->GetSyncedDeviceTracker(); |
| 2660 if (device_tracker) | 2662 if (device_tracker) |
| 2661 device_tracker->UpdateLocalDeviceBackupTime(*last_backup_time_); | 2663 device_tracker->UpdateLocalDeviceBackupTime(*last_backup_time_); |
| 2662 } | 2664 } |
| 2663 } | 2665 } |
| 2664 | 2666 |
| 2665 base::Time ProfileSyncService::GetDeviceBackupTimeForTesting() const { | 2667 base::Time ProfileSyncService::GetDeviceBackupTimeForTesting() const { |
| 2666 return backend_->GetSyncedDeviceTracker()->GetLocalDeviceBackupTime(); | 2668 return backend_->GetSyncedDeviceTracker()->GetLocalDeviceBackupTime(); |
| 2667 } | 2669 } |
| OLD | NEW |