| 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 a879e2ba2f5af5dc679301befaa3cd704743971b..18b62595dc60995013fddf144fc45959795b7ca0 100644
|
| --- a/chrome/browser/sync/glue/frontend_data_type_controller.cc
|
| +++ b/chrome/browser/sync/glue/frontend_data_type_controller.cc
|
| @@ -20,13 +20,6 @@ using content::BrowserThread;
|
|
|
| namespace browser_sync {
|
|
|
| -FrontendDataTypeController::FrontendDataTypeController()
|
| - : profile_sync_factory_(NULL),
|
| - profile_(NULL),
|
| - sync_service_(NULL),
|
| - state_(NOT_RUNNING) {
|
| -}
|
| -
|
| FrontendDataTypeController::FrontendDataTypeController(
|
| ProfileSyncComponentsFactory* profile_sync_factory,
|
| Profile* profile,
|
| @@ -41,10 +34,6 @@ FrontendDataTypeController::FrontendDataTypeController(
|
| DCHECK(sync_service);
|
| }
|
|
|
| -FrontendDataTypeController::~FrontendDataTypeController() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -}
|
| -
|
| void FrontendDataTypeController::Start(const StartCallback& start_callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!start_callback.is_null());
|
| @@ -73,6 +62,82 @@ void FrontendDataTypeController::Start(const StartCallback& start_callback) {
|
| DCHECK_EQ(state_, RUNNING);
|
| }
|
|
|
| +void FrontendDataTypeController::Stop() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + State prev_state = state_;
|
| + state_ = STOPPING;
|
| +
|
| + // If Stop() is called while Start() is waiting for the datatype model to
|
| + // load, abort the start.
|
| + if (prev_state == MODEL_STARTING) {
|
| + StartFailed(ABORTED, SyncError());
|
| + // We can just return here since we haven't performed association if we're
|
| + // still in MODEL_STARTING.
|
| + return;
|
| + }
|
| + DCHECK(start_callback_.is_null());
|
| +
|
| + CleanUpState();
|
| +
|
| + sync_service_->DeactivateDataType(type());
|
| +
|
| + if (model_associator()) {
|
| + SyncError error; // Not used.
|
| + error = model_associator()->DisassociateModels();
|
| + }
|
| +
|
| + set_model_associator(NULL);
|
| + change_processor_.reset();
|
| +
|
| + state_ = NOT_RUNNING;
|
| +}
|
| +
|
| +browser_sync::ModelSafeGroup FrontendDataTypeController::model_safe_group()
|
| + const {
|
| + return browser_sync::GROUP_UI;
|
| +}
|
| +
|
| +std::string FrontendDataTypeController::name() const {
|
| + // For logging only.
|
| + return syncable::ModelTypeToString(type());
|
| +}
|
| +
|
| +DataTypeController::State FrontendDataTypeController::state() const {
|
| + return state_;
|
| +}
|
| +
|
| +void FrontendDataTypeController::OnUnrecoverableError(
|
| + const tracked_objects::Location& from_here, const std::string& message) {
|
| + RecordUnrecoverableError(from_here, message);
|
| +
|
| + // The ProfileSyncService will invoke our Stop() method in response to this.
|
| + // We dont know the current state of the caller. Posting a task will allow
|
| + // the caller to unwind the stack before we process unrecoverable error.
|
| + MessageLoop::current()->PostTask(from_here,
|
| + base::Bind(&ProfileSyncService::OnUnrecoverableError,
|
| + sync_service_->AsWeakPtr(),
|
| + from_here,
|
| + message));
|
| +}
|
| +
|
| +void FrontendDataTypeController::OnSingleDatatypeUnrecoverableError(
|
| + const tracked_objects::Location& from_here, const std::string& message) {
|
| + RecordUnrecoverableError(from_here, message);
|
| + sync_service_->OnDisableDatatype(type(), from_here, message);
|
| +}
|
| +
|
| +FrontendDataTypeController::FrontendDataTypeController()
|
| + : profile_sync_factory_(NULL),
|
| + profile_(NULL),
|
| + sync_service_(NULL),
|
| + state_(NOT_RUNNING) {
|
| +}
|
| +
|
| +FrontendDataTypeController::~FrontendDataTypeController() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +}
|
| +
|
| bool FrontendDataTypeController::StartModels() {
|
| DCHECK_EQ(state_, MODEL_STARTING);
|
| // By default, no additional services need to be started before we can proceed
|
| @@ -120,6 +185,10 @@ bool FrontendDataTypeController::Associate() {
|
| return state_ == RUNNING;
|
| }
|
|
|
| +void FrontendDataTypeController::CleanUpState() {
|
| + // Do nothing by default.
|
| +}
|
| +
|
| void FrontendDataTypeController::StartFailed(StartResult result,
|
| const SyncError& error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -155,75 +224,6 @@ void FrontendDataTypeController::FinishStart(StartResult result) {
|
| callback.Run(result, SyncError());
|
| }
|
|
|
| -void FrontendDataTypeController::Stop() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - State prev_state = state_;
|
| - state_ = STOPPING;
|
| -
|
| - // If Stop() is called while Start() is waiting for the datatype model to
|
| - // load, abort the start.
|
| - if (prev_state == MODEL_STARTING) {
|
| - StartFailed(ABORTED, SyncError());
|
| - // We can just return here since we haven't performed association if we're
|
| - // still in MODEL_STARTING.
|
| - return;
|
| - }
|
| - DCHECK(start_callback_.is_null());
|
| -
|
| - CleanUpState();
|
| -
|
| - sync_service_->DeactivateDataType(type());
|
| -
|
| - if (model_associator()) {
|
| - SyncError error; // Not used.
|
| - error = model_associator()->DisassociateModels();
|
| - }
|
| -
|
| - set_model_associator(NULL);
|
| - change_processor_.reset();
|
| -
|
| - state_ = NOT_RUNNING;
|
| -}
|
| -
|
| -void FrontendDataTypeController::CleanUpState() {
|
| - // Do nothing by default.
|
| -}
|
| -
|
| -browser_sync::ModelSafeGroup FrontendDataTypeController::model_safe_group()
|
| - const {
|
| - return browser_sync::GROUP_UI;
|
| -}
|
| -
|
| -std::string FrontendDataTypeController::name() const {
|
| - // For logging only.
|
| - return syncable::ModelTypeToString(type());
|
| -}
|
| -
|
| -DataTypeController::State FrontendDataTypeController::state() const {
|
| - return state_;
|
| -}
|
| -
|
| -void FrontendDataTypeController::OnUnrecoverableError(
|
| - const tracked_objects::Location& from_here, const std::string& message) {
|
| - RecordUnrecoverableError(from_here, message);
|
| -
|
| - // The ProfileSyncService will invoke our Stop() method in response to this.
|
| - // We dont know the current state of the caller. Posting a task will allow
|
| - // the caller to unwind the stack before we process unrecoverable error.
|
| - MessageLoop::current()->PostTask(from_here,
|
| - base::Bind(&ProfileSyncService::OnUnrecoverableError,
|
| - sync_service_->AsWeakPtr(),
|
| - from_here,
|
| - message));
|
| -}
|
| -
|
| -void FrontendDataTypeController::OnSingleDatatypeUnrecoverableError(
|
| - const tracked_objects::Location& from_here, const std::string& message) {
|
| - RecordUnrecoverableError(from_here, message);
|
| - sync_service_->OnDisableDatatype(type(), from_here, message);
|
| -}
|
| -
|
| void FrontendDataTypeController::RecordAssociationTime(base::TimeDelta time) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| #define PER_DATA_TYPE_MACRO(type_str) \
|
| @@ -231,6 +231,7 @@ void FrontendDataTypeController::RecordAssociationTime(base::TimeDelta time) {
|
| SYNC_DATA_TYPE_HISTOGRAM(type());
|
| #undef PER_DATA_TYPE_MACRO
|
| }
|
| +
|
| void FrontendDataTypeController::RecordStartFailure(StartResult result) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeStartFailures", type(),
|
|
|