Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_model_associator.h" | 5 #include "chrome/browser/sync/glue/autofill_profile_model_associator.h" |
| 6 | 6 |
| 7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "chrome/browser/sync/glue/autofill_profile_change_processor.h" | |
| 9 #include "chrome/browser/sync/glue/do_optimistic_refresh_Task.h" | |
| 10 #include "chrome/browser/sync/syncable/syncable.h" | |
| 8 #include "chrome/browser/sync/profile_sync_service.h" | 11 #include "chrome/browser/sync/profile_sync_service.h" |
| 9 #include "chrome/browser/webdata/web_database.h" | 12 #include "chrome/browser/webdata/web_database.h" |
| 10 | 13 |
| 11 using sync_api::ReadNode; | 14 using sync_api::ReadNode; |
| 12 namespace browser_sync { | 15 namespace browser_sync { |
| 13 | 16 |
| 14 const char kAutofillProfileTag[] = "google_chrome_autofill_profile"; | 17 const char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; |
| 15 | 18 |
| 16 AutofillProfileModelAssociator::AutofillProfileModelAssociator( | 19 AutofillProfileModelAssociator::AutofillProfileModelAssociator( |
| 17 ProfileSyncService* sync_service, | 20 ProfileSyncService* sync_service, |
| 18 WebDatabase* web_database, | 21 WebDatabase* web_database, |
| 19 PersonalDataManager* personal_data) | 22 PersonalDataManager* personal_data) |
| 20 : sync_service_(sync_service), | 23 : sync_service_(sync_service), |
| 21 web_database_(web_database), | 24 web_database_(web_database), |
| 22 personal_data_(personal_data), | 25 personal_data_(personal_data), |
| 23 autofill_node_id_(sync_api::kInvalidId), | 26 autofill_node_id_(sync_api::kInvalidId), |
| 24 abort_association_pending_(false) { | 27 abort_association_pending_(false), |
| 28 number_of_profiles_created_(0) { | |
| 25 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 29 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 26 DCHECK(sync_service_); | 30 DCHECK(sync_service_); |
| 27 DCHECK(web_database_); | 31 DCHECK(web_database_); |
| 28 DCHECK(personal_data_); | 32 DCHECK(personal_data_); |
| 29 } | 33 } |
| 30 | 34 |
| 31 AutofillProfileModelAssociator::~AutofillProfileModelAssociator() { | 35 AutofillProfileModelAssociator::~AutofillProfileModelAssociator() { |
| 32 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 33 } | 37 } |
| 34 | 38 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 59 current_profiles->insert(guid); | 63 current_profiles->insert(guid); |
| 60 } else { | 64 } else { |
| 61 MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, | 65 MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, |
| 62 autofill_root, | 66 autofill_root, |
| 63 (**ix), | 67 (**ix), |
| 64 new_profiles, | 68 new_profiles, |
| 65 current_profiles, | 69 current_profiles, |
| 66 profiles_to_delete); | 70 profiles_to_delete); |
| 67 } | 71 } |
| 68 } | 72 } |
| 69 | 73 return true; |
| 74 } | |
| 75 | |
| 76 bool AutofillProfileModelAssociator::GetSyncIdForTaggedNode( | |
| 77 const std::string& tag, | |
| 78 int64* sync_id) { | |
| 79 sync_api::ReadTransaction trans( | |
| 80 sync_service_->backend()->GetUserShareHandle()); | |
| 81 sync_api::ReadNode sync_node(&trans); | |
| 82 if (!sync_node.InitByTagLookup(tag.c_str())) | |
| 83 return false; | |
| 84 *sync_id = sync_node.GetId(); | |
| 70 return true; | 85 return true; |
| 71 } | 86 } |
| 72 | 87 |
| 73 bool AutofillProfileModelAssociator::LoadAutofillData( | 88 bool AutofillProfileModelAssociator::LoadAutofillData( |
| 74 std::vector<AutoFillProfile*>* profiles) { | 89 std::vector<AutoFillProfile*>* profiles) { |
| 75 if (IsAbortPending()) | 90 if (IsAbortPending()) |
| 76 return false; | 91 return false; |
| 77 | 92 |
| 78 if (!web_database_->GetAutoFillProfiles(profiles)) | 93 if (!web_database_->GetAutoFillProfiles(profiles)) |
| 79 return false; | 94 return false; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { | 133 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { |
| 119 return false; | 134 return false; |
| 120 } | 135 } |
| 121 } | 136 } |
| 122 | 137 |
| 123 if (!SaveChangesToWebData(bundle)) { | 138 if (!SaveChangesToWebData(bundle)) { |
| 124 LOG(ERROR) << "Failed to update autofill entries."; | 139 LOG(ERROR) << "Failed to update autofill entries."; |
| 125 return false; | 140 return false; |
| 126 } | 141 } |
| 127 | 142 |
| 128 // TODO(lipalani) Bug 64111- split out the OptimisticRefreshTask | 143 if (sync_service_->backend()->GetAutofillMigrationState() != |
| 129 // into its own class | 144 syncable::Directory::PersistedKernelInfo::MIGRATED) { |
| 130 // from autofill_model_associator | 145 syncable::AutofillMigrationDebugInfo debug_info; |
| 131 // Will be done as part of the autofill_model_associator work. | 146 debug_info.autofill_profile_added_during_migration = |
| 132 // BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 147 number_of_profiles_created_; |
| 133 // new DoOptimisticRefreshTask(personal_data_)); | 148 sync_service_->backend()->SetAutofillMigrationDebugInfo( |
| 149 syncable::AutofillMigrationDebugInfo::PROFILES_ADDED, | |
| 150 debug_info); | |
| 151 } | |
| 152 | |
|
lipalani
2010/12/09 19:45:25
move this code above.
lipalani
2010/12/11 00:12:36
Done.
| |
| 153 sync_service()->backend()->SetAutofillMigrationState( | |
| 154 syncable::Directory::PersistedKernelInfo::MIGRATED); | |
| 155 | |
| 156 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 157 new DoOptimisticRefreshForAutofill(personal_data_)); | |
| 134 return true; | 158 return true; |
| 135 } | 159 } |
| 136 | 160 |
| 137 bool AutofillProfileModelAssociator::DisassociateModels() { | 161 bool AutofillProfileModelAssociator::DisassociateModels() { |
| 138 id_map_.clear(); | 162 id_map_.clear(); |
| 139 id_map_inverse_.clear(); | 163 id_map_inverse_.clear(); |
| 140 return true; | 164 return true; |
| 141 } | 165 } |
| 142 | 166 |
| 143 // Helper to compare the local value and cloud value of a field, merge into | 167 // Helper to compare the local value and cloud value of a field, merge into |
| 144 // the local value if they differ, and return whether the merge happened. | 168 // the local value if they differ, and return whether the merge happened. |
| 145 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, | 169 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, |
| 146 AutoFillFieldType t, | 170 AutoFillFieldType t, |
| 147 const std::string& specifics_field) { | 171 const std::string& specifics_field) { |
| 148 if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field) | 172 if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field) |
| 149 return false; | 173 return false; |
| 150 f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field)); | 174 f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field)); |
| 151 return true; | 175 return true; |
| 152 } | 176 } |
| 153 bool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( | 177 bool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( |
| 154 bool *has_nodes) { | 178 bool *has_nodes) { |
| 155 CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); | 179 CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); |
| 156 sync_api::ReadTransaction trans( | 180 sync_api::ReadTransaction trans( |
| 157 sync_service_->backend()->GetUserShareHandle()); | 181 sync_service_->backend()->GetUserShareHandle()); |
| 158 | 182 |
| 159 sync_api::ReadNode node(&trans); | 183 sync_api::ReadNode node(&trans); |
| 160 | 184 |
| 161 if (!node.InitByClientTagLookup( | 185 if (!node.InitByTagLookup(kAutofillProfileTag)) { |
| 162 syncable::AUTOFILL_PROFILE, | |
| 163 kAutofillProfileTag)) { | |
| 164 LOG(ERROR) << "Sever did not create a top level node" | 186 LOG(ERROR) << "Sever did not create a top level node" |
| 165 << "Out of data server or autofill type not enabled"; | 187 << "Out of data server or autofill type not enabled"; |
| 166 return false; | 188 return false; |
| 167 } | 189 } |
| 168 | 190 |
| 169 *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); | 191 *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); |
| 170 return true; | 192 return true; |
| 171 } | 193 } |
| 172 // static | 194 // static |
| 173 bool AutofillProfileModelAssociator::OverwriteProfileWithServerData( | 195 bool AutofillProfileModelAssociator::OverwriteProfileWithServerData( |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 current_profiles->insert(autofill_specifics.guid()); | 269 current_profiles->insert(autofill_specifics.guid()); |
| 248 } else { | 270 } else { |
| 249 sync_api::WriteNode node(trans); | 271 sync_api::WriteNode node(trans); |
| 250 if (!node.InitUniqueByCreation( | 272 if (!node.InitUniqueByCreation( |
| 251 syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { | 273 syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { |
| 252 LOG(ERROR) << "Failed to create autofill sync node."; | 274 LOG(ERROR) << "Failed to create autofill sync node."; |
| 253 return false; | 275 return false; |
| 254 } | 276 } |
| 255 node.SetTitle(UTF8ToWide(profile.guid())); | 277 node.SetTitle(UTF8ToWide(profile.guid())); |
| 256 | 278 |
| 257 // TODO(lipalani) -Bug 64111 This needs rewriting. This will be tackled | 279 AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node); |
| 258 // when rewriting autofill change processor. | 280 current_profiles->insert(profile.guid()); |
| 259 // AutofillChangeProcessor::WriteAutofillProfile(profile, &node); | 281 number_of_profiles_created_++; |
| 260 } | 282 } |
| 261 return true; | 283 return true; |
| 262 } | 284 } |
| 263 | 285 |
| 264 bool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( | 286 bool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( |
| 265 sync_api::WriteTransaction* write_trans, | 287 sync_api::WriteTransaction* write_trans, |
| 266 const sync_api::ReadNode& autofill_root, | 288 const sync_api::ReadNode& autofill_root, |
| 267 DataBundle* bundle) { | 289 DataBundle* bundle) { |
| 268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 290 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 269 | 291 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); | 377 AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); |
| 356 return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; | 378 return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; |
| 357 } | 379 } |
| 358 | 380 |
| 359 void AutofillProfileModelAssociator::AbortAssociation() { | 381 void AutofillProfileModelAssociator::AbortAssociation() { |
| 360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 361 AutoLock lock(abort_association_pending_lock_); | 383 AutoLock lock(abort_association_pending_lock_); |
| 362 abort_association_pending_ = true; | 384 abort_association_pending_ = true; |
| 363 } | 385 } |
| 364 | 386 |
| 387 const std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId( | |
| 388 int64 sync_id) { | |
| 389 SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id); | |
| 390 return iter == id_map_inverse_.end() ? NULL : &(iter->second); | |
| 391 } | |
| 392 | |
| 365 bool AutofillProfileModelAssociator::IsAbortPending() { | 393 bool AutofillProfileModelAssociator::IsAbortPending() { |
| 366 AutoLock lock(abort_association_pending_lock_); | 394 AutoLock lock(abort_association_pending_lock_); |
| 367 return abort_association_pending_; | 395 return abort_association_pending_; |
| 368 } | 396 } |
| 369 | 397 |
| 370 } // namespace browser_sync | 398 } // namespace browser_sync |
| 371 | 399 |
| OLD | NEW |