| Index: chrome/browser/sync/glue/autofill_profile_data_type_controller.cc
|
| diff --git a/chrome/browser/sync/glue/autofill_profile_data_type_controller.cc b/chrome/browser/sync/glue/autofill_profile_data_type_controller.cc
|
| index 479fe764fc07dd220b310a080b0cb9e1f5833ed9..a48073737ee06af20bbd6f97690e532c8e3e34ff 100644
|
| --- a/chrome/browser/sync/glue/autofill_profile_data_type_controller.cc
|
| +++ b/chrome/browser/sync/glue/autofill_profile_data_type_controller.cc
|
| @@ -28,7 +28,8 @@ AutofillProfileDataTypeController::AutofillProfileDataTypeController(
|
| : NonUIDataTypeController(profile_sync_factory,
|
| profile,
|
| sync_service),
|
| - personal_data_(NULL) {}
|
| + personal_data_(NULL),
|
| + callback_registered_(false) {}
|
|
|
| syncer::ModelType AutofillProfileDataTypeController::type() const {
|
| return syncer::AUTOFILL_PROFILE;
|
| @@ -41,8 +42,6 @@ syncer::ModelSafeGroup
|
|
|
| void AutofillProfileDataTypeController::WebDatabaseLoaded() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (web_data_service_.get())
|
| - web_data_service_->RemoveDBObserver(this);
|
| OnModelLoaded();
|
| }
|
|
|
| @@ -51,15 +50,19 @@ void AutofillProfileDataTypeController::OnPersonalDataChanged() {
|
| DCHECK_EQ(state(), MODEL_STARTING);
|
|
|
| personal_data_->RemoveObserver(this);
|
| - web_data_service_ = AutofillWebDataService::FromBrowserContext(profile());
|
| + autofill::AutofillWebDataService* web_data_service =
|
| + autofill::AutofillWebDataService::FromBrowserContext(profile());
|
|
|
| - if (!web_data_service_.get())
|
| + if (!web_data_service)
|
| return;
|
|
|
| - if (web_data_service_->IsDatabaseLoaded())
|
| + if (web_data_service->IsDatabaseLoaded()) {
|
| OnModelLoaded();
|
| - else
|
| - web_data_service_->AddDBObserver(this);
|
| + } else if (!callback_registered_) {
|
| + web_data_service->RegisterDBLoadedCallback(base::Bind(
|
| + &AutofillProfileDataTypeController::WebDatabaseLoaded, this));
|
| + callback_registered_ = true;
|
| + }
|
| }
|
|
|
| AutofillProfileDataTypeController::~AutofillProfileDataTypeController() {}
|
| @@ -84,15 +87,21 @@ bool AutofillProfileDataTypeController::StartModels() {
|
| return false;
|
| }
|
|
|
| - web_data_service_ = AutofillWebDataService::FromBrowserContext(profile());
|
| + autofill::AutofillWebDataService* web_data_service =
|
| + AutofillWebDataService::FromBrowserContext(profile());
|
|
|
| - if (!web_data_service_.get())
|
| + if (!web_data_service)
|
| return false;
|
|
|
| - if (web_data_service_->IsDatabaseLoaded())
|
| + if (web_data_service->IsDatabaseLoaded())
|
| return true;
|
|
|
| - web_data_service_->AddDBObserver(this);
|
| + if (!callback_registered_) {
|
| + web_data_service->RegisterDBLoadedCallback(base::Bind(
|
| + &AutofillProfileDataTypeController::WebDatabaseLoaded, this));
|
| + callback_registered_ = true;
|
| + }
|
| +
|
| return false;
|
| }
|
|
|
| @@ -100,9 +109,6 @@ void AutofillProfileDataTypeController::StopModels() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(state() == STOPPING || state() == NOT_RUNNING);
|
|
|
| - if (web_data_service_.get())
|
| - web_data_service_->RemoveDBObserver(this);
|
| -
|
| personal_data_->RemoveObserver(this);
|
| }
|
|
|
|
|