1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
8 #include "base/metrics/histogram.h"
9 #include "chrome/browser/autofill/personal_data_manager_factory.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h"
12 #include "chrome/browser/sync/profile_sync_components_factory.h"
13 #include "chrome/browser/sync/profile_sync_service.h"
14 #include "chrome/browser/webdata/web_data_service_factory.h"
15 #include "components/autofill/core/browser/personal_data_manager.h"
16 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
17 #include "content/public/browser/browser_thread.h"
18 #include "sync/api/sync_error.h"
19 #include "sync/api/syncable_service.h"
21 using autofill::AutofillWebDataService;
22 using content::BrowserThread;
24 namespace browser_sync {
26 AutofillProfileDataTypeController::AutofillProfileDataTypeController(
27 ProfileSyncComponentsFactory* profile_sync_factory,
29 ProfileSyncService* sync_service)
30 : NonUIDataTypeController(
31 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
32 base::Bind(&ChromeReportUnrecoverableError),
37 callback_registered_(false) {}
39 syncer::ModelType AutofillProfileDataTypeController::type() const {
40 return syncer::AUTOFILL_PROFILE;
43 syncer::ModelSafeGroup
44 AutofillProfileDataTypeController::model_safe_group() const {
45 return syncer::GROUP_DB;
48 void AutofillProfileDataTypeController::WebDatabaseLoaded() {
49 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
53 void AutofillProfileDataTypeController::OnPersonalDataChanged() {
54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
55 DCHECK_EQ(state(), MODEL_STARTING);
57 personal_data_->RemoveObserver(this);
58 autofill::AutofillWebDataService* web_data_service =
59 WebDataServiceFactory::GetAutofillWebDataForProfile(
60 profile(), Profile::EXPLICIT_ACCESS).get();
62 if (!web_data_service)
65 if (web_data_service->IsDatabaseLoaded()) {
67 } else if (!callback_registered_) {
68 web_data_service->RegisterDBLoadedCallback(base::Bind(
69 &AutofillProfileDataTypeController::WebDatabaseLoaded, this));
70 callback_registered_ = true;
74 AutofillProfileDataTypeController::~AutofillProfileDataTypeController() {}
76 bool AutofillProfileDataTypeController::PostTaskOnBackendThread(
77 const tracked_objects::Location& from_here,
78 const base::Closure& task) {
79 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
80 return BrowserThread::PostTask(BrowserThread::DB, from_here, task);
83 bool AutofillProfileDataTypeController::StartModels() {
84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
85 DCHECK_EQ(state(), MODEL_STARTING);
86 // Waiting for the personal data is subtle: we do this as the PDM resets
87 // its cache of unique IDs once it gets loaded. If we were to proceed with
88 // association, the local ids in the mappings would wind up colliding.
90 autofill::PersonalDataManagerFactory::GetForProfile(profile());
91 if (!personal_data_->IsDataLoaded()) {
92 personal_data_->AddObserver(this);
96 autofill::AutofillWebDataService* web_data_service =
97 WebDataServiceFactory::GetAutofillWebDataForProfile(
98 profile(), Profile::EXPLICIT_ACCESS).get();
100 if (!web_data_service)
103 if (web_data_service->IsDatabaseLoaded())
106 if (!callback_registered_) {
107 web_data_service->RegisterDBLoadedCallback(base::Bind(
108 &AutofillProfileDataTypeController::WebDatabaseLoaded, this));
109 callback_registered_ = true;
115 void AutofillProfileDataTypeController::StopModels() {
116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
117 personal_data_->RemoveObserver(this);
120 } // namespace browser_sync