| Index: chrome/browser/sync/glue/frontend_data_type_controller.cc | 
| diff --git a/chrome/browser/sync/glue/frontend_data_type_controller.cc b/chrome/browser/sync/glue/frontend_data_type_controller.cc | 
| index 5e324f9f1de8147d2e14e153c454596979fd4b91..edec12ce9388ed79c9745f67414c7b3697974569 100644 | 
| --- a/chrome/browser/sync/glue/frontend_data_type_controller.cc | 
| +++ b/chrome/browser/sync/glue/frontend_data_type_controller.cc | 
| @@ -103,15 +103,46 @@ bool FrontendDataTypeController::Associate() { | 
| return true; | 
| } | 
|  | 
| +void FrontendDataTypeController::StartFailed(StartResult result, | 
| +    const tracked_objects::Location& location) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  CleanUpState(); | 
| +  model_associator_.reset(); | 
| +  change_processor_.reset(); | 
| +  state_ = NOT_RUNNING; | 
| +  RecordStartFailure(result); | 
| + | 
| +  // We have to release the callback before we call it, since it's possible | 
| +  // invoking the callback will trigger a call to STOP(), which will get | 
| +  // confused by the non-NULL start_callback_. | 
| +  scoped_ptr<StartCallback> callback(start_callback_.release()); | 
| +  callback->Run(result, location); | 
| +} | 
| + | 
| +void FrontendDataTypeController::FinishStart(StartResult result, | 
| +    const tracked_objects::Location& location) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| + | 
| +  // We have to release the callback before we call it, since it's possible | 
| +  // invoking the callback will trigger a call to STOP(), which will get | 
| +  // confused by the non-NULL start_callback_. | 
| +  scoped_ptr<StartCallback> callback(start_callback_.release()); | 
| +  callback->Run(result, location); | 
| +} | 
| + | 
| void FrontendDataTypeController::Stop() { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| // If Stop() is called while Start() is waiting for the datatype model to | 
| // load, abort the start. | 
| -  if (state_ == MODEL_STARTING) | 
| -    FinishStart(ABORTED, FROM_HERE); | 
| +  if (state_ == MODEL_STARTING) { | 
| +    StartFailed(ABORTED, FROM_HERE); | 
| +    // We can just return here since we haven't performed association if we're | 
| +    // still in MODEL_STARTING. | 
| +    return; | 
| +  } | 
| DCHECK(!start_callback_.get()); | 
|  | 
| -  CleanupState(); | 
| +  CleanUpState(); | 
|  | 
| if (change_processor_ != NULL) | 
| sync_service_->DeactivateDataType(this, change_processor_.get()); | 
| @@ -125,7 +156,7 @@ void FrontendDataTypeController::Stop() { | 
| state_ = NOT_RUNNING; | 
| } | 
|  | 
| -void FrontendDataTypeController::CleanupState() { | 
| +void FrontendDataTypeController::CleanUpState() { | 
| // Do nothing by default. | 
| } | 
|  | 
| @@ -150,23 +181,4 @@ void FrontendDataTypeController::OnUnrecoverableError( | 
| sync_service_->OnUnrecoverableError(from_here, message); | 
| } | 
|  | 
| -void FrontendDataTypeController::FinishStart(StartResult result, | 
| -    const tracked_objects::Location& location) { | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| -  start_callback_->Run(result, location); | 
| -  start_callback_.reset(); | 
| -} | 
| - | 
| -void FrontendDataTypeController::StartFailed(StartResult result, | 
| -    const tracked_objects::Location& location) { | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| -  CleanupState(); | 
| -  model_associator_.reset(); | 
| -  change_processor_.reset(); | 
| -  state_ = NOT_RUNNING; | 
| -  start_callback_->Run(result, location); | 
| -  start_callback_.reset(); | 
| -  RecordStartFailure(result); | 
| -} | 
| - | 
| }  // namespace browser_sync | 
|  |