summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/sync/engine/configure_reason.h3
-rw-r--r--chrome/browser/sync/engine/sync_scheduler.cc2
-rw-r--r--chrome/browser/sync/engine/syncapi.cc32
-rw-r--r--chrome/browser/sync/engine/syncapi.h2
-rw-r--r--chrome/browser/sync/profile_sync_service.cc18
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 {