| Index: chrome/browser/sync/glue/data_type_manager_impl.cc
|
| diff --git a/chrome/browser/sync/glue/data_type_manager_impl.cc b/chrome/browser/sync/glue/data_type_manager_impl.cc
|
| index ebafd82195b0e9c4ad4faefe7e0a1b2c163dd95e..5a7cf23a0a71a781ce606c7d16df96a195b50742 100644
|
| --- a/chrome/browser/sync/glue/data_type_manager_impl.cc
|
| +++ b/chrome/browser/sync/glue/data_type_manager_impl.cc
|
| @@ -130,7 +130,8 @@ void DataTypeManagerImpl::ConfigureImpl(const TypeSet& desired_types,
|
| // If we're already configured and the types haven't changed, we can exit
|
| // out early.
|
| NotifyStart();
|
| - NotifyDone(OK, FROM_HERE);
|
| + ConfigureResult result(OK, last_requested_types_);
|
| + NotifyDone(result);
|
| return;
|
| }
|
|
|
| @@ -221,7 +222,7 @@ void DataTypeManagerImpl::DownloadReady(bool success) {
|
| DCHECK(state_ == DOWNLOAD_PENDING);
|
|
|
| if (!success) {
|
| - NotifyDone(UNRECOVERABLE_ERROR, FROM_HERE);
|
| + Abort(UNRECOVERABLE_ERROR, FROM_HERE, needs_start_[0]->type());
|
| return;
|
| }
|
|
|
| @@ -276,7 +277,8 @@ void DataTypeManagerImpl::StartNextType() {
|
|
|
| // If no more data types need starting, we're done.
|
| state_ = CONFIGURED;
|
| - NotifyDone(OK, FROM_HERE);
|
| + ConfigureResult result(OK, last_requested_types_);
|
| + NotifyDone(result);
|
| }
|
|
|
| void DataTypeManagerImpl::TypeStartCallback(
|
| @@ -291,7 +293,7 @@ void DataTypeManagerImpl::TypeStartCallback(
|
| // DataTypeManager::Stop() was called while the current data type
|
| // was starting. Now that it has finished starting, we can finish
|
| // stopping the DataTypeManager. This is considered an ABORT.
|
| - FinishStopAndNotify(ABORTED, FROM_HERE);
|
| + Abort(ABORTED, location, needs_start_[0]->type());
|
| return;
|
| } else if (state_ == STOPPED) {
|
| // If our state_ is STOPPED, we have already stopped all of the data
|
| @@ -306,8 +308,6 @@ void DataTypeManagerImpl::TypeStartCallback(
|
| DCHECK_EQ(needs_start_[0], started_dtc);
|
| needs_start_.erase(needs_start_.begin());
|
|
|
| - if (result == DataTypeController::NEEDS_CRYPTO) {
|
| - }
|
| // If the type started normally, continue to the next type.
|
| // If the type is waiting for the cryptographer, continue to the next type.
|
| // Once the cryptographer is ready, we'll attempt to restart this type.
|
| @@ -322,22 +322,29 @@ void DataTypeManagerImpl::TypeStartCallback(
|
| // managed to start up to this point and pass the result to the
|
| // callback.
|
| VLOG(0) << "Failed " << started_dtc->name();
|
| - ConfigureResult configure_result = DataTypeManager::ABORTED;
|
| + ConfigureStatus configure_status = DataTypeManager::ABORTED;
|
| switch (result) {
|
| case DataTypeController::ABORTED:
|
| - configure_result = DataTypeManager::ABORTED;
|
| + configure_status = DataTypeManager::ABORTED;
|
| break;
|
| case DataTypeController::ASSOCIATION_FAILED:
|
| - configure_result = DataTypeManager::ASSOCIATION_FAILED;
|
| + configure_status = DataTypeManager::ASSOCIATION_FAILED;
|
| break;
|
| case DataTypeController::UNRECOVERABLE_ERROR:
|
| - configure_result = DataTypeManager::UNRECOVERABLE_ERROR;
|
| + configure_status = DataTypeManager::UNRECOVERABLE_ERROR;
|
| break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| }
|
| - FinishStopAndNotify(configure_result, location);
|
| +
|
| + // TODO(sync): We currently only specify the last attempted type as the failed
|
| + // type. At some point we should allow a datatype to fail without preventing
|
| + // other datatypes from continuing. In that case we'll have to support
|
| + // multiple types failing.
|
| + Abort(configure_status,
|
| + location,
|
| + started_dtc->type());
|
| }
|
|
|
| void DataTypeManagerImpl::Stop() {
|
| @@ -368,7 +375,10 @@ void DataTypeManagerImpl::Stop() {
|
| // If Stop() is called while waiting for download, cancel all
|
| // outstanding tasks.
|
| weak_ptr_factory_.InvalidateWeakPtrs();
|
| - FinishStopAndNotify(ABORTED, FROM_HERE);
|
| + syncable::ModelType type = syncable::UNSPECIFIED;
|
| + if (needs_start_.size() > 0)
|
| + type = needs_start_[0]->type();
|
| + Abort(ABORTED, FROM_HERE, type);
|
| return;
|
| }
|
|
|
| @@ -390,10 +400,20 @@ void DataTypeManagerImpl::FinishStop() {
|
| state_ = STOPPED;
|
| }
|
|
|
| -void DataTypeManagerImpl::FinishStopAndNotify(ConfigureResult result,
|
| - const tracked_objects::Location& location) {
|
| +void DataTypeManagerImpl::Abort(
|
| + ConfigureStatus status,
|
| + const tracked_objects::Location& location,
|
| + syncable::ModelType last_attempted_type) {
|
| + DCHECK_NE(OK, status);
|
| FinishStop();
|
| - NotifyDone(result, location);
|
| + TypeSet attempted_types;
|
| + if (syncable::IsRealDataType(last_attempted_type))
|
| + attempted_types.insert(last_attempted_type);
|
| + ConfigureResult result(status,
|
| + last_requested_types_,
|
| + attempted_types,
|
| + location);
|
| + NotifyDone(result);
|
| }
|
|
|
| void DataTypeManagerImpl::NotifyStart() {
|
| @@ -403,14 +423,12 @@ void DataTypeManagerImpl::NotifyStart() {
|
| NotificationService::NoDetails());
|
| }
|
|
|
| -void DataTypeManagerImpl::NotifyDone(ConfigureResult result,
|
| - const tracked_objects::Location& location) {
|
| - ConfigureResultWithErrorLocation result_with_location(result, location,
|
| - last_requested_types_);
|
| +void DataTypeManagerImpl::NotifyDone(const ConfigureResult& result) {
|
| AddToConfigureTime();
|
| +
|
| VLOG(1) << "Total time spent configuring: "
|
| << configure_time_delta_.InSecondsF() << "s";
|
| - switch (result) {
|
| + switch (result.status) {
|
| case DataTypeManager::OK:
|
| VLOG(1) << "NotifyDone called with result: OK";
|
| UMA_HISTOGRAM_TIMES("Sync.ConfigureTime.OK",
|
| @@ -438,7 +456,7 @@ void DataTypeManagerImpl::NotifyDone(ConfigureResult result,
|
| NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_SYNC_CONFIGURE_DONE,
|
| Source<DataTypeManager>(this),
|
| - Details<ConfigureResultWithErrorLocation>(&result_with_location));
|
| + Details<const ConfigureResult>(&result));
|
| }
|
|
|
| const DataTypeController::TypeMap& DataTypeManagerImpl::controllers() {
|
|
|