diff options
-rw-r--r-- | chrome/browser/sync/engine/configure_reason.h | 3 | ||||
-rw-r--r-- | chrome/browser/sync/engine/sync_scheduler.cc | 2 | ||||
-rw-r--r-- | chrome/browser/sync/engine/syncapi.cc | 32 | ||||
-rw-r--r-- | chrome/browser/sync/engine/syncapi.h | 2 | ||||
-rw-r--r-- | chrome/browser/sync/profile_sync_service.cc | 18 |
5 files changed, 45 insertions, 12 deletions
diff --git a/chrome/browser/sync/engine/configure_reason.h b/chrome/browser/sync/engine/configure_reason.h index 5deb402..e87f6ce3 100644 --- a/chrome/browser/sync/engine/configure_reason.h +++ b/chrome/browser/sync/engine/configure_reason.h @@ -26,6 +26,9 @@ enum ConfigureReason { // Setting up sync performs an initial config to download NIGORI data, and // also a config to download initial data once the user selects types. CONFIGURE_REASON_NEW_CLIENT, + + // A new datatype is enabled for syncing due to a client upgrade. + CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, }; } // namespace sync_api diff --git a/chrome/browser/sync/engine/sync_scheduler.cc b/chrome/browser/sync/engine/sync_scheduler.cc index 2cb402b..990aece 100644 --- a/chrome/browser/sync/engine/sync_scheduler.cc +++ b/chrome/browser/sync/engine/sync_scheduler.cc @@ -113,6 +113,8 @@ GetUpdatesCallerInfo::GetUpdatesSource GetSourceFromReason( return GetUpdatesCallerInfo::MIGRATION; case sync_api::CONFIGURE_REASON_NEW_CLIENT: return GetUpdatesCallerInfo::NEW_CLIENT; + case sync_api::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE: + return GetUpdatesCallerInfo::NEWLY_SUPPORTED_DATATYPE; default: NOTREACHED(); } diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc index bfce97f..df7e7f5 100644 --- a/chrome/browser/sync/engine/syncapi.cc +++ b/chrome/browser/sync/engine/syncapi.cc @@ -229,6 +229,25 @@ std::string PassphraseRequiredReasonToString( } } +// Helper function to determine if initial sync had ended for types. +bool InitialSyncEndedForTypes(syncable::ModelTypeSet types, + sync_api::UserShare* share) { + syncable::ScopedDirLookup lookup(share->dir_manager.get(), + share->name); + if (!lookup.good()) { + DCHECK(false) << "ScopedDirLookup failed when checking initial sync"; + return false; + } + + for (syncable::ModelTypeSet::const_iterator i = types.begin(); + i != types.end(); ++i) { + if (!lookup->initial_sync_ended_for_type(*i)) + return false; + } + return true; +} + + UserShare::UserShare() {} UserShare::~UserShare() {} @@ -1369,20 +1388,15 @@ class SyncManager::SyncInternal virtual void OnIPAddressChanged(); bool InitialSyncEndedForAllEnabledTypes() { - syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); - if (!lookup.good()) { - DCHECK(false) << "ScopedDirLookup failed when checking initial sync"; - return false; - } - + syncable::ModelTypeSet types; ModelSafeRoutingInfo enabled_types; registrar_->GetModelSafeRoutingInfo(&enabled_types); for (ModelSafeRoutingInfo::const_iterator i = enabled_types.begin(); i != enabled_types.end(); ++i) { - if (!lookup->initial_sync_ended_for_type(i->first)) - return false; + types.insert(i->first); } - return true; + + return InitialSyncEndedForTypes(types, &share_); } // SyncEngineEventListener implementation. diff --git a/chrome/browser/sync/engine/syncapi.h b/chrome/browser/sync/engine/syncapi.h index 0e55270..98129fb 100644 --- a/chrome/browser/sync/engine/syncapi.h +++ b/chrome/browser/sync/engine/syncapi.h @@ -153,6 +153,8 @@ struct UserShare { std::string name; }; +bool InitialSyncEndedForTypes(syncable::ModelTypeSet types, UserShare* share); + // Contains everything needed to talk to and identify a user account. struct SyncCredentials { std::string email; diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc index 3427c39..1c14e25 100644 --- a/chrome/browser/sync/profile_sync_service.cc +++ b/chrome/browser/sync/profile_sync_service.cc @@ -1044,7 +1044,9 @@ SyncBackendHost* ProfileSyncService::GetBackendForTest() { } void ProfileSyncService::ConfigureDataTypeManager() { + bool restart = false; if (!data_type_manager_.get()) { + restart = true; data_type_manager_.reset( factory_->CreateDataTypeManager(backend_.get(), data_type_controllers_)); @@ -1078,9 +1080,19 @@ void ProfileSyncService::ConfigureDataTypeManager() { } } - data_type_manager_->Configure(types, - HasSyncSetupCompleted() ? sync_api::CONFIGURE_REASON_RECONFIGURATION : - sync_api::CONFIGURE_REASON_NEW_CLIENT); + sync_api::ConfigureReason reason = sync_api::CONFIGURE_REASON_UNKNOWN; + if (!HasSyncSetupCompleted()) { + reason = sync_api::CONFIGURE_REASON_NEW_CLIENT; + } else if (restart == false || + sync_api::InitialSyncEndedForTypes(types, GetUserShare())) { + reason = sync_api::CONFIGURE_REASON_RECONFIGURATION; + } else { + DCHECK(restart); + reason = sync_api::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE; + } + DCHECK(reason != sync_api::CONFIGURE_REASON_UNKNOWN); + + data_type_manager_->Configure(types, reason); } sync_api::UserShare* ProfileSyncService::GetUserShare() const { |