| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/glue/autofill_profile_syncable_service.h" | 5 #include "chrome/browser/sync/glue/autofill_profile_syncable_service.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/autofill/autofill_profile.h" | 10 #include "chrome/browser/autofill/autofill_profile.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 } // namespace | 35 } // namespace |
| 36 | 36 |
| 37 namespace browser_sync { | 37 namespace browser_sync { |
| 38 | 38 |
| 39 const char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; | 39 const char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; |
| 40 | 40 |
| 41 AutofillProfileSyncableService::AutofillProfileSyncableService( | 41 AutofillProfileSyncableService::AutofillProfileSyncableService( |
| 42 WebDatabase* web_database, | 42 WebDatabase* web_database, |
| 43 Profile* profile) | 43 Profile* profile) |
| 44 : web_database_(web_database), | 44 : web_database_(web_database), |
| 45 profile_(profile), | 45 profile_(profile) { |
| 46 sync_processor_(NULL) { | |
| 47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 48 DCHECK(web_database_); | 47 DCHECK(web_database_); |
| 49 DCHECK(profile); | 48 DCHECK(profile); |
| 50 notification_registrar_.Add(this, | 49 notification_registrar_.Add(this, |
| 51 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, | 50 chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED, |
| 52 Source<WebDataService>( | 51 Source<WebDataService>( |
| 53 profile_->GetWebDataService(Profile::EXPLICIT_ACCESS))); | 52 profile_->GetWebDataService(Profile::EXPLICIT_ACCESS))); |
| 54 } | 53 } |
| 55 | 54 |
| 56 AutofillProfileSyncableService::~AutofillProfileSyncableService() { | 55 AutofillProfileSyncableService::~AutofillProfileSyncableService() { |
| 57 DCHECK(CalledOnValidThread()); | 56 DCHECK(CalledOnValidThread()); |
| 58 } | 57 } |
| 59 | 58 |
| 60 AutofillProfileSyncableService::AutofillProfileSyncableService() | 59 AutofillProfileSyncableService::AutofillProfileSyncableService() |
| 61 : web_database_(NULL), | 60 : web_database_(NULL), |
| 62 profile_(NULL), | 61 profile_(NULL) { |
| 63 sync_processor_(NULL) { | |
| 64 } | 62 } |
| 65 | 63 |
| 66 SyncError AutofillProfileSyncableService::MergeDataAndStartSyncing( | 64 SyncError AutofillProfileSyncableService::MergeDataAndStartSyncing( |
| 67 syncable::ModelType type, | 65 syncable::ModelType type, |
| 68 const SyncDataList& initial_sync_data, | 66 const SyncDataList& initial_sync_data, |
| 69 SyncChangeProcessor* sync_processor) { | 67 SyncChangeProcessor* sync_processor) { |
| 70 DCHECK(CalledOnValidThread()); | 68 DCHECK(CalledOnValidThread()); |
| 71 DCHECK(sync_processor_ == NULL); | 69 DCHECK(!sync_processor_.get()); |
| 72 VLOG(1) << "Associating Autofill: MergeDataAndStartSyncing"; | 70 VLOG(1) << "Associating Autofill: MergeDataAndStartSyncing"; |
| 73 | 71 |
| 74 if (!LoadAutofillData(&profiles_.get())) { | 72 if (!LoadAutofillData(&profiles_.get())) { |
| 75 return SyncError( | 73 return SyncError( |
| 76 FROM_HERE, "Could not get the autofill data from WebDatabase.", | 74 FROM_HERE, "Could not get the autofill data from WebDatabase.", |
| 77 model_type()); | 75 model_type()); |
| 78 } | 76 } |
| 79 | 77 |
| 80 if (VLOG_IS_ON(2)) { | 78 if (VLOG_IS_ON(2)) { |
| 81 VLOG(2) << "[AUTOFILL MIGRATION]" | 79 VLOG(2) << "[AUTOFILL MIGRATION]" |
| 82 << "Printing profiles from web db"; | 80 << "Printing profiles from web db"; |
| 83 | 81 |
| 84 for (ScopedVector<AutofillProfile>::const_iterator ix = | 82 for (ScopedVector<AutofillProfile>::const_iterator ix = |
| 85 profiles_.begin(); ix != profiles_.end(); ++ix) { | 83 profiles_.begin(); ix != profiles_.end(); ++ix) { |
| 86 AutofillProfile* p = *ix; | 84 AutofillProfile* p = *ix; |
| 87 VLOG(2) << "[AUTOFILL MIGRATION] " | 85 VLOG(2) << "[AUTOFILL MIGRATION] " |
| 88 << p->GetInfo(NAME_FIRST) | 86 << p->GetInfo(NAME_FIRST) |
| 89 << p->GetInfo(NAME_LAST) | 87 << p->GetInfo(NAME_LAST) |
| 90 << p->guid(); | 88 << p->guid(); |
| 91 } | 89 } |
| 92 } | 90 } |
| 93 | 91 |
| 94 sync_processor_ = sync_processor; | 92 sync_processor_.reset(sync_processor); |
| 95 | 93 |
| 96 GUIDToProfileMap remaining_profiles; | 94 GUIDToProfileMap remaining_profiles; |
| 97 CreateGUIDToProfileMap(profiles_.get(), &remaining_profiles); | 95 CreateGUIDToProfileMap(profiles_.get(), &remaining_profiles); |
| 98 | 96 |
| 99 DataBundle bundle; | 97 DataBundle bundle; |
| 100 // Go through and check for all the profiles that sync already knows about. | 98 // Go through and check for all the profiles that sync already knows about. |
| 101 for (SyncDataList::const_iterator sync_iter = initial_sync_data.begin(); | 99 for (SyncDataList::const_iterator sync_iter = initial_sync_data.begin(); |
| 102 sync_iter != initial_sync_data.end(); | 100 sync_iter != initial_sync_data.end(); |
| 103 ++sync_iter) { | 101 ++sync_iter) { |
| 104 GUIDToProfileMap::iterator it = | 102 GUIDToProfileMap::iterator it = |
| (...skipping 15 matching lines...) Expand all Loading... |
| 120 | 118 |
| 121 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); | 119 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); |
| 122 | 120 |
| 123 WebDataService::NotifyOfMultipleAutofillChanges(profile_); | 121 WebDataService::NotifyOfMultipleAutofillChanges(profile_); |
| 124 | 122 |
| 125 return error; | 123 return error; |
| 126 } | 124 } |
| 127 | 125 |
| 128 void AutofillProfileSyncableService::StopSyncing(syncable::ModelType type) { | 126 void AutofillProfileSyncableService::StopSyncing(syncable::ModelType type) { |
| 129 DCHECK(CalledOnValidThread()); | 127 DCHECK(CalledOnValidThread()); |
| 130 DCHECK(sync_processor_ != NULL); | |
| 131 DCHECK_EQ(type, syncable::AUTOFILL_PROFILE); | 128 DCHECK_EQ(type, syncable::AUTOFILL_PROFILE); |
| 132 | 129 |
| 133 sync_processor_ = NULL; | 130 sync_processor_.reset(); |
| 134 profiles_.reset(); | 131 profiles_.reset(); |
| 135 profiles_map_.clear(); | 132 profiles_map_.clear(); |
| 136 } | 133 } |
| 137 | 134 |
| 138 SyncDataList AutofillProfileSyncableService::GetAllSyncData( | 135 SyncDataList AutofillProfileSyncableService::GetAllSyncData( |
| 139 syncable::ModelType type) const { | 136 syncable::ModelType type) const { |
| 140 DCHECK(CalledOnValidThread()); | 137 DCHECK(CalledOnValidThread()); |
| 141 DCHECK(sync_processor_ != NULL); | 138 DCHECK(sync_processor_.get()); |
| 142 DCHECK_EQ(type, syncable::AUTOFILL_PROFILE); | 139 DCHECK_EQ(type, syncable::AUTOFILL_PROFILE); |
| 143 | 140 |
| 144 SyncDataList current_data; | 141 SyncDataList current_data; |
| 145 | 142 |
| 146 for (GUIDToProfileMap::const_iterator i = profiles_map_.begin(); | 143 for (GUIDToProfileMap::const_iterator i = profiles_map_.begin(); |
| 147 i != profiles_map_.end(); ++i) { | 144 i != profiles_map_.end(); ++i) { |
| 148 current_data.push_back(CreateData(*(i->second))); | 145 current_data.push_back(CreateData(*(i->second))); |
| 149 } | 146 } |
| 150 return current_data; | 147 return current_data; |
| 151 } | 148 } |
| 152 | 149 |
| 153 SyncError AutofillProfileSyncableService::ProcessSyncChanges( | 150 SyncError AutofillProfileSyncableService::ProcessSyncChanges( |
| 154 const tracked_objects::Location& from_here, | 151 const tracked_objects::Location& from_here, |
| 155 const SyncChangeList& change_list) { | 152 const SyncChangeList& change_list) { |
| 156 DCHECK(CalledOnValidThread()); | 153 DCHECK(CalledOnValidThread()); |
| 157 DCHECK(sync_processor_ != NULL); | 154 if (!sync_processor_.get()) { |
| 158 if (sync_processor_ == NULL) { | |
| 159 SyncError error(FROM_HERE, "Models not yet associated.", | 155 SyncError error(FROM_HERE, "Models not yet associated.", |
| 160 syncable::AUTOFILL_PROFILE); | 156 syncable::AUTOFILL_PROFILE); |
| 161 return error; | 157 return error; |
| 162 } | 158 } |
| 163 | 159 |
| 164 DataBundle bundle; | 160 DataBundle bundle; |
| 165 | 161 |
| 166 for (SyncChangeList::const_iterator i = change_list.begin(); | 162 for (SyncChangeList::const_iterator i = change_list.begin(); |
| 167 i != change_list.end(); ++i) { | 163 i != change_list.end(); ++i) { |
| 168 DCHECK(i->IsValid()); | 164 DCHECK(i->IsValid()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 194 } | 190 } |
| 195 | 191 |
| 196 void AutofillProfileSyncableService::Observe(int type, | 192 void AutofillProfileSyncableService::Observe(int type, |
| 197 const NotificationSource& source, | 193 const NotificationSource& source, |
| 198 const NotificationDetails& details) { | 194 const NotificationDetails& details) { |
| 199 DCHECK_EQ(type, chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED); | 195 DCHECK_EQ(type, chrome::NOTIFICATION_AUTOFILL_PROFILE_CHANGED); |
| 200 // Check if sync is on. If we receive notification prior to the sync being set | 196 // Check if sync is on. If we receive notification prior to the sync being set |
| 201 // up we are going to process all when MergeData..() is called. If we receive | 197 // up we are going to process all when MergeData..() is called. If we receive |
| 202 // notification after the sync exited, it will be sinced next time Chrome | 198 // notification after the sync exited, it will be sinced next time Chrome |
| 203 // starts. | 199 // starts. |
| 204 if (!sync_processor_) | 200 if (!sync_processor_.get()) |
| 205 return; | 201 return; |
| 206 WebDataService* wds = Source<WebDataService>(source).ptr(); | 202 WebDataService* wds = Source<WebDataService>(source).ptr(); |
| 207 | 203 |
| 208 DCHECK(wds && wds->GetDatabase() == web_database_); | 204 DCHECK(wds && wds->GetDatabase() == web_database_); |
| 209 | 205 |
| 210 AutofillProfileChange* change = Details<AutofillProfileChange>(details).ptr(); | 206 AutofillProfileChange* change = Details<AutofillProfileChange>(details).ptr(); |
| 211 | 207 |
| 212 ActOnChange(*change); | 208 ActOnChange(*change); |
| 213 } | 209 } |
| 214 | 210 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 bundle->profiles_to_add.push_back(new_profile); | 349 bundle->profiles_to_add.push_back(new_profile); |
| 354 } | 350 } |
| 355 return it; | 351 return it; |
| 356 } | 352 } |
| 357 | 353 |
| 358 void AutofillProfileSyncableService::ActOnChange( | 354 void AutofillProfileSyncableService::ActOnChange( |
| 359 const AutofillProfileChange& change) { | 355 const AutofillProfileChange& change) { |
| 360 DCHECK((change.type() == AutofillProfileChange::REMOVE && | 356 DCHECK((change.type() == AutofillProfileChange::REMOVE && |
| 361 !change.profile()) || | 357 !change.profile()) || |
| 362 (change.type() != AutofillProfileChange::REMOVE && change.profile())); | 358 (change.type() != AutofillProfileChange::REMOVE && change.profile())); |
| 363 DCHECK(sync_processor_); | 359 DCHECK(sync_processor_.get()); |
| 364 SyncChangeList new_changes; | 360 SyncChangeList new_changes; |
| 365 DataBundle bundle; | 361 DataBundle bundle; |
| 366 switch (change.type()) { | 362 switch (change.type()) { |
| 367 case AutofillProfileChange::ADD: | 363 case AutofillProfileChange::ADD: |
| 368 new_changes.push_back( | 364 new_changes.push_back( |
| 369 SyncChange(SyncChange::ACTION_ADD, CreateData(*(change.profile())))); | 365 SyncChange(SyncChange::ACTION_ADD, CreateData(*(change.profile())))); |
| 370 DCHECK(profiles_map_.find(change.profile()->guid()) == | 366 DCHECK(profiles_map_.find(change.profile()->guid()) == |
| 371 profiles_map_.end()); | 367 profiles_map_.end()); |
| 372 profiles_.push_back(new AutofillProfile(*(change.profile()))); | 368 profiles_.push_back(new AutofillProfile(*(change.profile()))); |
| 373 profiles_map_[change.profile()->guid()] = profiles_.get().back(); | 369 profiles_map_[change.profile()->guid()] = profiles_.get().back(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 WriteAutofillProfile(profile, &specifics); | 403 WriteAutofillProfile(profile, &specifics); |
| 408 return SyncData::CreateLocalData(profile.guid(), profile.guid(), specifics); | 404 return SyncData::CreateLocalData(profile.guid(), profile.guid(), specifics); |
| 409 } | 405 } |
| 410 | 406 |
| 411 AutofillProfileSyncableService::DataBundle::DataBundle() {} | 407 AutofillProfileSyncableService::DataBundle::DataBundle() {} |
| 412 | 408 |
| 413 AutofillProfileSyncableService::DataBundle::~DataBundle() { | 409 AutofillProfileSyncableService::DataBundle::~DataBundle() { |
| 414 } | 410 } |
| 415 | 411 |
| 416 } // namespace browser_sync | 412 } // namespace browser_sync |
| OLD | NEW |