Chromium Code Reviews| Index: components/sync/driver/ui_data_type_controller.cc |
| diff --git a/components/sync/driver/ui_data_type_controller.cc b/components/sync/driver/ui_data_type_controller.cc |
| index ccab2de1feffa6f78b60b8eb558b6d5369e1959b..8ec2b9a73280525046c5c6301cd720813d8bb56d 100644 |
| --- a/components/sync/driver/ui_data_type_controller.cc |
| +++ b/components/sync/driver/ui_data_type_controller.cc |
| @@ -8,10 +8,12 @@ |
| #include "base/location.h" |
| #include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/profiler/scoped_tracker.h" |
| #include "base/single_thread_task_runner.h" |
|
skym
2016/09/02 22:45:29
remove
maxbogue
2016/09/03 00:14:51
Done.
|
| #include "base/threading/thread_task_runner_handle.h" |
| +#include "components/sync/api/data_type_error_handler_impl.h" |
| #include "components/sync/api/sync_error.h" |
| #include "components/sync/api/sync_merge_result.h" |
| #include "components/sync/api/syncable_service.h" |
| @@ -25,24 +27,18 @@ |
| namespace sync_driver { |
| UIDataTypeController::UIDataTypeController() |
| - : DirectoryDataTypeController(base::ThreadTaskRunnerHandle::Get(), |
| + : DirectoryDataTypeController(syncer::UNSPECIFIED, |
| base::Closure(), |
| nullptr), |
| + state_(NOT_RUNNING) {} |
| + |
| +UIDataTypeController::UIDataTypeController(syncer::ModelType type, |
| + const base::Closure& dump_stack, |
| + SyncClient* sync_client) |
| + : DirectoryDataTypeController(type, dump_stack, sync_client), |
| state_(NOT_RUNNING), |
| - type_(syncer::UNSPECIFIED) {} |
| - |
| -UIDataTypeController::UIDataTypeController( |
| - const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread, |
| - const base::Closure& error_callback, |
| - syncer::ModelType type, |
| - SyncClient* sync_client) |
| - : DirectoryDataTypeController(ui_thread, error_callback, sync_client), |
| - state_(NOT_RUNNING), |
| - type_(type), |
| - processor_factory_(new GenericChangeProcessorFactory()), |
| - ui_thread_(ui_thread) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| - DCHECK(syncer::IsRealDataType(type_)); |
| + processor_factory_(new GenericChangeProcessorFactory()) { |
| + DCHECK(syncer::IsRealDataType(type)); |
| } |
| void UIDataTypeController::SetGenericChangeProcessorFactoryForTest( |
| @@ -51,14 +47,12 @@ void UIDataTypeController::SetGenericChangeProcessorFactoryForTest( |
| processor_factory_ = std::move(factory); |
| } |
| -UIDataTypeController::~UIDataTypeController() { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| -} |
| +UIDataTypeController::~UIDataTypeController() {} |
| void UIDataTypeController::LoadModels( |
| const ModelLoadCallback& model_load_callback) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| - DCHECK(syncer::IsRealDataType(type_)); |
| + DCHECK(CalledOnValidThread()); |
| + DCHECK(syncer::IsRealDataType(type())); |
| model_load_callback_ = model_load_callback; |
| if (state_ != NOT_RUNNING) { |
| model_load_callback.Run( |
| @@ -85,7 +79,7 @@ void UIDataTypeController::LoadModels( |
| } |
| void UIDataTypeController::OnModelLoaded() { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| DCHECK_EQ(state_, MODEL_STARTING); |
| state_ = MODEL_LOADED; |
| @@ -94,14 +88,15 @@ void UIDataTypeController::OnModelLoaded() { |
| void UIDataTypeController::StartAssociating( |
| const StartCallback& start_callback) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| DCHECK(!start_callback.is_null()); |
| DCHECK_EQ(state_, MODEL_LOADED); |
| start_callback_ = start_callback; |
| state_ = ASSOCIATING; |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(&UIDataTypeController::Associate, this)); |
| + FROM_HERE, |
| + base::Bind(&UIDataTypeController::Associate, base::AsWeakPtr(this))); |
| } |
| bool UIDataTypeController::StartModels() { |
| @@ -112,6 +107,7 @@ bool UIDataTypeController::StartModels() { |
| } |
| void UIDataTypeController::Associate() { |
| + DCHECK(CalledOnValidThread()); |
| if (state_ != ASSOCIATING) { |
| // Stop() must have been called while Associate() task have been waiting. |
| DCHECK_EQ(state_, NOT_RUNNING); |
| @@ -134,7 +130,7 @@ void UIDataTypeController::Associate() { |
| DCHECK(sync_client_->GetSyncService()); |
| local_service_ = shared_change_processor_->Connect( |
| sync_client_, processor_factory_.get(), |
| - sync_client_->GetSyncService()->GetUserShare(), this, |
| + sync_client_->GetSyncService()->GetUserShare(), CreateErrorHandler(), |
| weak_ptr_factory.GetWeakPtr()); |
| if (!local_service_.get()) { |
| syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| @@ -243,7 +239,7 @@ ChangeProcessor* UIDataTypeController::GetChangeProcessor() const { |
| } |
| void UIDataTypeController::AbortModelLoad() { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| state_ = NOT_RUNNING; |
| if (shared_change_processor_.get()) { |
| @@ -259,7 +255,7 @@ void UIDataTypeController::StartDone( |
| ConfigureResult start_result, |
| const syncer::SyncMergeResult& local_merge_result, |
| const syncer::SyncMergeResult& syncer_merge_result) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| // TODO(robliao): Remove ScopedTracker below once https://crbug.com/471403 is |
| // fixed. |
| @@ -286,8 +282,8 @@ void UIDataTypeController::StartDone( |
| } |
| void UIDataTypeController::Stop() { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| - DCHECK(syncer::IsRealDataType(type_)); |
| + DCHECK(CalledOnValidThread()); |
| + DCHECK(syncer::IsRealDataType(type())); |
| if (state_ == NOT_RUNNING) |
| return; |
| @@ -318,17 +314,12 @@ void UIDataTypeController::Stop() { |
| state_ = NOT_RUNNING; |
| } |
| -syncer::ModelType UIDataTypeController::type() const { |
| - DCHECK(syncer::IsRealDataType(type_)); |
| - return type_; |
| -} |
| - |
| void UIDataTypeController::StopModels() { |
| // Do nothing by default. |
| } |
| syncer::ModelSafeGroup UIDataTypeController::model_safe_group() const { |
| - DCHECK(syncer::IsRealDataType(type_)); |
| + DCHECK(syncer::IsRealDataType(type())); |
| return syncer::GROUP_UI; |
| } |
| @@ -341,23 +332,26 @@ DataTypeController::State UIDataTypeController::state() const { |
| return state_; |
| } |
| -void UIDataTypeController::OnSingleDataTypeUnrecoverableError( |
| +std::unique_ptr<syncer::DataTypeErrorHandler> |
| +UIDataTypeController::CreateErrorHandler() { |
| + DCHECK(CalledOnValidThread()); |
| + return base::MakeUnique<syncer::DataTypeErrorHandlerImpl>( |
| + base::ThreadTaskRunnerHandle::Get(), dump_stack_, |
| + base::Bind(&UIDataTypeController::OnUnrecoverableError, |
| + base::AsWeakPtr(this))); |
| +} |
| + |
| +void UIDataTypeController::OnUnrecoverableError( |
| const syncer::SyncError& error) { |
| + DCHECK(CalledOnValidThread()); |
| DCHECK_EQ(type(), error.model_type()); |
| - UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeRunFailures", |
| - ModelTypeToHistogramInt(type()), |
| - syncer::MODEL_TYPE_COUNT); |
| - // TODO(tim): We double-upload some errors. See bug 383480. |
| - if (!error_callback_.is_null()) |
| - error_callback_.Run(); |
| if (!model_load_callback_.is_null()) { |
| - base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(model_load_callback_, type(), error)); |
| + model_load_callback_.Run(type(), error); |
| } |
| } |
| void UIDataTypeController::RecordAssociationTime(base::TimeDelta time) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| #define PER_DATA_TYPE_MACRO(type_str) \ |
| UMA_HISTOGRAM_TIMES("Sync." type_str "AssociationTime", time); |
| SYNC_DATA_TYPE_HISTOGRAM(type()); |
| @@ -365,7 +359,7 @@ void UIDataTypeController::RecordAssociationTime(base::TimeDelta time) { |
| } |
| void UIDataTypeController::RecordStartFailure(ConfigureResult result) { |
| - DCHECK(ui_thread_->BelongsToCurrentThread()); |
| + DCHECK(CalledOnValidThread()); |
| UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeStartFailures", |
| ModelTypeToHistogramInt(type()), |
| syncer::MODEL_TYPE_COUNT); |