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" | |
| 8 #include "chrome/browser/sync/profile_sync_service.h" | 10 #include "chrome/browser/sync/profile_sync_service.h" |
| 11 #include "chrome/browser/sync/syncable/syncable.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 |
| 35 bool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutoFillProfiles( | 39 bool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutoFillProfiles( |
| 36 sync_api::WriteTransaction* write_trans, | 40 sync_api::WriteTransaction* write_trans, |
| 37 const sync_api::ReadNode& autofill_root, | 41 const sync_api::ReadNode& autofill_root, |
| 38 const std::vector<AutoFillProfile*>& all_profiles_from_db, | 42 const std::vector<AutoFillProfile*>& all_profiles_from_db, |
| 39 std::set<std::string>* current_profiles, | 43 std::set<std::string>* current_profiles, |
| 40 std::vector<AutoFillProfile*>* updated_profiles, | 44 std::vector<AutoFillProfile*>* updated_profiles, |
| 41 std::vector<AutoFillProfile*>* new_profiles, | 45 std::vector<AutoFillProfile*>* new_profiles, |
| 42 std::vector<std::string>* profiles_to_delete) { | 46 std::vector<std::string>* profiles_to_delete) { |
| 43 | 47 |
| 48 if (MigrationLoggingEnabled()) { | |
| 49 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 50 << "Printing profiles from web db"; | |
| 51 | |
| 52 for (std::vector<AutoFillProfile*>::const_iterator ix = | |
| 53 all_profiles_from_db.begin(); ix != all_profiles_from_db.end(); ++ix) { | |
| 54 AutoFillProfile* p = *ix; | |
| 55 VLOG(1) << "[AUTOFILL MIGRATION] " | |
| 56 << UTF16ToUTF8(p->GetFieldText(AutoFillType(NAME_FIRST))) | |
| 57 << UTF16ToUTF8(p->GetFieldText(AutoFillType(NAME_LAST))) | |
| 58 << p->guid(); | |
| 59 } | |
| 60 } | |
| 61 | |
| 62 if (MigrationLoggingEnabled()) { | |
| 63 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 64 << "Looking for the above data in sync db.."; | |
| 65 } | |
| 44 // Alias the all_profiles_from_db so we fit in 80 characters | 66 // Alias the all_profiles_from_db so we fit in 80 characters |
| 45 const std::vector<AutoFillProfile*>& profiles(all_profiles_from_db); | 67 const std::vector<AutoFillProfile*>& profiles(all_profiles_from_db); |
| 46 for (std::vector<AutoFillProfile*>::const_iterator ix = profiles.begin(); | 68 for (std::vector<AutoFillProfile*>::const_iterator ix = profiles.begin(); |
| 47 ix != profiles.end(); | 69 ix != profiles.end(); |
| 48 ++ix) { | 70 ++ix) { |
| 49 std::string guid((*ix)->guid()); | 71 std::string guid((*ix)->guid()); |
| 50 | 72 |
| 51 ReadNode node(write_trans); | 73 ReadNode node(write_trans); |
| 52 if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid)) { | 74 if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid)) { |
| 75 if (MigrationLoggingEnabled()) { | |
| 76 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 77 << " Found in sync db: " | |
| 78 << UTF16ToUTF8((*ix)->GetFieldText(AutoFillType(NAME_FIRST))) | |
| 79 << UTF16ToUTF8((*ix)->GetFieldText(AutoFillType(NAME_LAST))) | |
| 80 << (*ix)->guid() | |
| 81 << " so associating"; | |
| 82 } | |
| 53 const sync_pb::AutofillProfileSpecifics& autofill( | 83 const sync_pb::AutofillProfileSpecifics& autofill( |
| 54 node.GetAutofillProfileSpecifics()); | 84 node.GetAutofillProfileSpecifics()); |
| 55 if (OverwriteProfileWithServerData(*ix, autofill)) { | 85 if (OverwriteProfileWithServerData(*ix, autofill)) { |
| 56 updated_profiles->push_back(*ix); | 86 updated_profiles->push_back(*ix); |
| 57 } | 87 } |
| 58 Associate(&guid, node.GetId()); | 88 Associate(&guid, node.GetId()); |
| 59 current_profiles->insert(guid); | 89 current_profiles->insert(guid); |
| 60 } else { | 90 } else { |
| 61 MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, | 91 MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, |
| 62 autofill_root, | 92 autofill_root, |
| 63 (**ix), | 93 (**ix), |
| 64 new_profiles, | 94 new_profiles, |
| 65 current_profiles, | 95 current_profiles, |
| 66 profiles_to_delete); | 96 profiles_to_delete); |
| 67 } | 97 } |
| 68 } | 98 } |
| 69 | |
| 70 return true; | 99 return true; |
| 71 } | 100 } |
| 72 | 101 |
| 102 bool AutofillProfileModelAssociator::GetSyncIdForTaggedNode( | |
| 103 const std::string& tag, | |
| 104 int64* sync_id) { | |
| 105 sync_api::ReadTransaction trans( | |
| 106 sync_service_->backend()->GetUserShareHandle()); | |
| 107 sync_api::ReadNode sync_node(&trans); | |
| 108 if (!sync_node.InitByTagLookup(tag.c_str())) | |
| 109 return false; | |
| 110 *sync_id = sync_node.GetId(); | |
| 111 return true; | |
| 112 } | |
| 113 | |
| 73 bool AutofillProfileModelAssociator::LoadAutofillData( | 114 bool AutofillProfileModelAssociator::LoadAutofillData( |
| 74 std::vector<AutoFillProfile*>* profiles) { | 115 std::vector<AutoFillProfile*>* profiles) { |
| 75 if (IsAbortPending()) | 116 if (IsAbortPending()) |
| 76 return false; | 117 return false; |
| 77 | 118 |
| 78 if (!web_database_->GetAutoFillProfiles(profiles)) | 119 if (!web_database_->GetAutoFillProfiles(profiles)) |
| 79 return false; | 120 return false; |
| 80 | 121 |
| 81 return true; | 122 return true; |
| 82 } | 123 } |
| 83 | 124 |
| 84 bool AutofillProfileModelAssociator::AssociateModels() { | 125 bool AutofillProfileModelAssociator::AssociateModels() { |
| 85 VLOG(1) << "Associating Autofill Models"; | 126 VLOG(1) << "Associating Autofill Models"; |
| 86 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 127 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 87 { | 128 { |
| 88 AutoLock lock(abort_association_pending_lock_); | 129 AutoLock lock(abort_association_pending_lock_); |
| 89 abort_association_pending_ = false; | 130 abort_association_pending_ = false; |
| 90 } | 131 } |
| 91 | 132 |
| 92 ScopedVector<AutoFillProfile> profiles; | 133 ScopedVector<AutoFillProfile> profiles; |
| 93 | 134 |
| 94 if (!LoadAutofillData(&profiles.get())) { | 135 if (!LoadAutofillData(&profiles.get())) { |
| 95 LOG(ERROR) << "Could not get the autofill data from WebDatabase."; | 136 LOG(ERROR) << "Could not get the autofill data from WebDatabase."; |
| 96 return false; | 137 return false; |
| 97 } | 138 } |
| 98 | 139 |
| 140 if (MigrationLoggingEnabled()) { | |
| 141 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 142 << " Now associating to the new autofill profile model associator" | |
| 143 << "root node"; | |
| 144 } | |
| 99 DataBundle bundle; | 145 DataBundle bundle; |
| 100 { | 146 { |
| 101 // The write transaction lock is held inside this block. | 147 // The write transaction lock is held inside this block. |
| 102 // We do all the web db operations outside this block. | 148 // We do all the web db operations outside this block. |
| 103 sync_api::WriteTransaction trans( | 149 sync_api::WriteTransaction trans( |
| 104 sync_service_->backend()->GetUserShareHandle()); | 150 sync_service_->backend()->GetUserShareHandle()); |
| 105 | 151 |
| 106 sync_api::ReadNode autofill_root(&trans); | 152 sync_api::ReadNode autofill_root(&trans); |
| 107 if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { | 153 if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { |
| 108 LOG(ERROR) << "Server did not create the top-level autofill node. We " | 154 LOG(ERROR) << "Server did not create the top-level autofill node. We " |
| 109 << "might be running against an out-of-date server."; | 155 << "might be running against an out-of-date server."; |
| 110 return false; | 156 return false; |
| 111 } | 157 } |
| 112 | 158 |
| 113 if (!TraverseAndAssociateChromeAutoFillProfiles(&trans, autofill_root, | 159 if (!TraverseAndAssociateChromeAutoFillProfiles(&trans, autofill_root, |
| 114 profiles.get(), &bundle.current_profiles, | 160 profiles.get(), &bundle.current_profiles, |
| 115 &bundle.updated_profiles, | 161 &bundle.updated_profiles, |
| 116 &bundle.new_profiles, | 162 &bundle.new_profiles, |
| 117 &bundle.profiles_to_delete) || | 163 &bundle.profiles_to_delete) || |
| 118 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { | 164 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { |
| 119 return false; | 165 return false; |
| 120 } | 166 } |
| 121 } | 167 } |
| 122 | 168 |
| 123 if (!SaveChangesToWebData(bundle)) { | 169 if (!SaveChangesToWebData(bundle)) { |
| 124 LOG(ERROR) << "Failed to update autofill entries."; | 170 LOG(ERROR) << "Failed to update autofill entries."; |
| 125 return false; | 171 return false; |
| 126 } | 172 } |
| 127 | 173 |
| 128 // TODO(lipalani) Bug 64111- split out the OptimisticRefreshTask | 174 if (sync_service_->backend()->GetAutofillMigrationState() != |
| 129 // into its own class | 175 syncable::MIGRATED) { |
| 130 // from autofill_model_associator | 176 syncable::AutofillMigrationDebugInfo debug_info; |
| 131 // Will be done as part of the autofill_model_associator work. | 177 debug_info.autofill_profile_added_during_migration = |
| 132 // BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 178 number_of_profiles_created_; |
| 133 // new DoOptimisticRefreshTask(personal_data_)); | 179 sync_service_->backend()->SetAutofillMigrationDebugInfo( |
| 180 syncable::AutofillMigrationDebugInfo::PROFILES_ADDED, | |
| 181 debug_info); | |
| 182 sync_service()->backend()->SetAutofillMigrationState( | |
| 183 syncable::MIGRATED); | |
| 184 } | |
| 185 | |
| 186 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 187 new DoOptimisticRefreshForAutofill(personal_data_)); | |
|
tim (not reviewing)
2010/12/13 19:24:33
nit indent
lipalani
2010/12/15 09:08:33
Done.
| |
| 134 return true; | 188 return true; |
| 135 } | 189 } |
| 136 | 190 |
| 137 bool AutofillProfileModelAssociator::DisassociateModels() { | 191 bool AutofillProfileModelAssociator::DisassociateModels() { |
| 138 id_map_.clear(); | 192 id_map_.clear(); |
| 139 id_map_inverse_.clear(); | 193 id_map_inverse_.clear(); |
| 140 return true; | 194 return true; |
| 141 } | 195 } |
| 142 | 196 |
| 143 // Helper to compare the local value and cloud value of a field, merge into | 197 // 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. | 198 // the local value if they differ, and return whether the merge happened. |
| 145 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, | 199 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, |
| 146 AutoFillFieldType t, | 200 AutoFillFieldType t, |
| 147 const std::string& specifics_field) { | 201 const std::string& specifics_field) { |
| 148 if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field) | 202 if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field) |
| 149 return false; | 203 return false; |
| 150 f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field)); | 204 f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field)); |
| 151 return true; | 205 return true; |
| 152 } | 206 } |
| 153 bool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( | 207 bool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( |
| 154 bool *has_nodes) { | 208 bool *has_nodes) { |
| 155 CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); | 209 CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); |
| 156 sync_api::ReadTransaction trans( | 210 sync_api::ReadTransaction trans( |
| 157 sync_service_->backend()->GetUserShareHandle()); | 211 sync_service_->backend()->GetUserShareHandle()); |
| 158 | 212 |
| 159 sync_api::ReadNode node(&trans); | 213 sync_api::ReadNode node(&trans); |
| 160 | 214 |
| 161 if (!node.InitByClientTagLookup( | 215 if (!node.InitByTagLookup(kAutofillProfileTag)) { |
| 162 syncable::AUTOFILL_PROFILE, | |
| 163 kAutofillProfileTag)) { | |
| 164 LOG(ERROR) << "Sever did not create a top level node" | 216 LOG(ERROR) << "Sever did not create a top level node" |
| 165 << "Out of data server or autofill type not enabled"; | 217 << "Out of data server or autofill type not enabled"; |
| 166 return false; | 218 return false; |
| 167 } | 219 } |
| 168 | 220 |
| 169 *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); | 221 *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); |
| 170 return true; | 222 return true; |
| 171 } | 223 } |
| 172 // static | 224 // static |
| 173 bool AutofillProfileModelAssociator::OverwriteProfileWithServerData( | 225 bool AutofillProfileModelAssociator::OverwriteProfileWithServerData( |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 196 | 248 |
| 197 | 249 |
| 198 int64 AutofillProfileModelAssociator::FindSyncNodeWithProfile( | 250 int64 AutofillProfileModelAssociator::FindSyncNodeWithProfile( |
| 199 sync_api::WriteTransaction* trans, | 251 sync_api::WriteTransaction* trans, |
| 200 const sync_api::BaseNode& autofill_root, | 252 const sync_api::BaseNode& autofill_root, |
| 201 const AutoFillProfile& profile_from_db) { | 253 const AutoFillProfile& profile_from_db) { |
| 202 int64 sync_child_id = autofill_root.GetFirstChildId(); | 254 int64 sync_child_id = autofill_root.GetFirstChildId(); |
| 203 while (sync_child_id != sync_api::kInvalidId) { | 255 while (sync_child_id != sync_api::kInvalidId) { |
| 204 ReadNode read_node(trans); | 256 ReadNode read_node(trans); |
| 205 AutoFillProfile p; | 257 AutoFillProfile p; |
| 206 if (read_node.InitByIdLookup(sync_child_id)) { | 258 if (!read_node.InitByIdLookup(sync_child_id)) { |
| 207 LOG(ERROR) << "unable to find the id given by getfirst child " << | 259 LOG(ERROR) << "unable to find the id given by getfirst child " << |
| 208 sync_child_id; | 260 sync_child_id; |
| 209 return sync_api::kInvalidId; | 261 return sync_api::kInvalidId; |
| 210 } | 262 } |
| 211 const sync_pb::AutofillProfileSpecifics& autofill_specifics( | 263 const sync_pb::AutofillProfileSpecifics& autofill_specifics( |
| 212 read_node.GetAutofillProfileSpecifics()); | 264 read_node.GetAutofillProfileSpecifics()); |
| 213 OverwriteProfileWithServerData(&p, autofill_specifics); | 265 OverwriteProfileWithServerData(&p, autofill_specifics); |
| 214 if (p.Compare(profile_from_db) == 0) { | 266 if (p.Compare(profile_from_db) == 0) { |
| 215 return sync_child_id; | 267 return sync_child_id; |
| 216 } | 268 } |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 238 return false; | 290 return false; |
| 239 } | 291 } |
| 240 const sync_pb::AutofillProfileSpecifics& autofill_specifics( | 292 const sync_pb::AutofillProfileSpecifics& autofill_specifics( |
| 241 read_node.GetAutofillProfileSpecifics()); | 293 read_node.GetAutofillProfileSpecifics()); |
| 242 AutoFillProfile* p = new AutoFillProfile(autofill_specifics.guid()); | 294 AutoFillProfile* p = new AutoFillProfile(autofill_specifics.guid()); |
| 243 OverwriteProfileWithServerData(p, autofill_specifics); | 295 OverwriteProfileWithServerData(p, autofill_specifics); |
| 244 new_profiles->push_back(p); | 296 new_profiles->push_back(p); |
| 245 std::string guid = autofill_specifics.guid(); | 297 std::string guid = autofill_specifics.guid(); |
| 246 Associate(&guid, sync_node_id); | 298 Associate(&guid, sync_node_id); |
| 247 current_profiles->insert(autofill_specifics.guid()); | 299 current_profiles->insert(autofill_specifics.guid()); |
| 300 if (MigrationLoggingEnabled()) { | |
| 301 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 302 << "Found in sync db but with a different guid: " | |
| 303 << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST))) | |
| 304 << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST))) | |
| 305 << "New guid " << autofill_specifics.guid() | |
| 306 << " so associating"; | |
| 307 } | |
| 248 } else { | 308 } else { |
| 249 sync_api::WriteNode node(trans); | 309 sync_api::WriteNode node(trans); |
| 250 if (!node.InitUniqueByCreation( | 310 if (!node.InitUniqueByCreation( |
| 251 syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { | 311 syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { |
| 252 LOG(ERROR) << "Failed to create autofill sync node."; | 312 LOG(ERROR) << "Failed to create autofill sync node."; |
| 253 return false; | 313 return false; |
| 254 } | 314 } |
| 255 node.SetTitle(UTF8ToWide(profile.guid())); | 315 node.SetTitle(UTF8ToWide(profile.guid())); |
| 316 if (MigrationLoggingEnabled()) { | |
| 317 VLOG(1) << "[AUTOFILL MIGRATION]" | |
| 318 << "NOT Found in sync db " | |
| 319 << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST))) | |
| 320 << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST))) | |
| 321 << profile.guid() | |
| 322 << " so creating a new sync node."; | |
| 323 } | |
| 324 AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node); | |
| 325 current_profiles->insert(profile.guid()); | |
| 326 number_of_profiles_created_++; | |
| 256 | 327 |
| 257 // TODO(lipalani) -Bug 64111 This needs rewriting. This will be tackled | |
| 258 // when rewriting autofill change processor. | |
| 259 // AutofillChangeProcessor::WriteAutofillProfile(profile, &node); | |
| 260 } | 328 } |
| 261 return true; | 329 return true; |
| 262 } | 330 } |
| 263 | 331 |
| 264 bool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( | 332 bool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( |
| 265 sync_api::WriteTransaction* write_trans, | 333 sync_api::WriteTransaction* write_trans, |
| 266 const sync_api::ReadNode& autofill_root, | 334 const sync_api::ReadNode& autofill_root, |
| 267 DataBundle* bundle) { | 335 DataBundle* bundle) { |
| 268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 336 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 269 | 337 |
| 338 if (MigrationLoggingEnabled()) { | |
| 339 VLOG(1) << "[AUTOFILL MIGRATION] " | |
| 340 << " Iterating over sync nodes of autofill profile root node"; | |
| 341 } | |
| 270 int64 sync_child_id = autofill_root.GetFirstChildId(); | 342 int64 sync_child_id = autofill_root.GetFirstChildId(); |
| 271 while (sync_child_id != sync_api::kInvalidId) { | 343 while (sync_child_id != sync_api::kInvalidId) { |
| 272 ReadNode sync_child(write_trans); | 344 ReadNode sync_child(write_trans); |
| 273 if (!sync_child.InitByIdLookup(sync_child_id)) { | 345 if (!sync_child.InitByIdLookup(sync_child_id)) { |
| 274 LOG(ERROR) << "Failed to fetch child node."; | 346 LOG(ERROR) << "Failed to fetch child node."; |
| 275 return false; | 347 return false; |
| 276 } | 348 } |
| 277 const sync_pb::AutofillProfileSpecifics& autofill( | 349 const sync_pb::AutofillProfileSpecifics& autofill( |
| 278 sync_child.GetAutofillProfileSpecifics()); | 350 sync_child.GetAutofillProfileSpecifics()); |
| 279 | 351 |
| 280 AddNativeProfileIfNeeded(autofill, bundle, sync_child); | 352 AddNativeProfileIfNeeded(autofill, bundle, sync_child); |
| 281 | 353 |
| 282 sync_child_id = sync_child.GetSuccessorId(); | 354 sync_child_id = sync_child.GetSuccessorId(); |
| 283 } | 355 } |
| 284 return true; | 356 return true; |
| 285 } | 357 } |
| 286 | 358 |
| 287 void AutofillProfileModelAssociator::AddNativeProfileIfNeeded( | 359 void AutofillProfileModelAssociator::AddNativeProfileIfNeeded( |
| 288 const sync_pb::AutofillProfileSpecifics& profile, | 360 const sync_pb::AutofillProfileSpecifics& profile, |
| 289 DataBundle* bundle, | 361 DataBundle* bundle, |
| 290 const sync_api::ReadNode& node) { | 362 const sync_api::ReadNode& node) { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 292 | 364 |
| 365 if (MigrationLoggingEnabled()) { | |
| 366 VLOG(1) << "[AUTOFILL MIGRATION] " | |
| 367 << "Trying to lookup " | |
| 368 << profile.name_first() | |
| 369 << " " | |
| 370 << profile.name_last() | |
| 371 << " in the web db"; | |
| 372 } | |
| 293 if (bundle->current_profiles.find(profile.guid()) == | 373 if (bundle->current_profiles.find(profile.guid()) == |
| 294 bundle->current_profiles.end()) { | 374 bundle->current_profiles.end()) { |
| 295 std::string guid(profile.guid()); | 375 std::string guid(profile.guid()); |
| 296 Associate(&guid, node.GetId()); | 376 Associate(&guid, node.GetId()); |
| 297 AutoFillProfile* p = new AutoFillProfile(profile.guid()); | 377 AutoFillProfile* p = new AutoFillProfile(profile.guid()); |
| 298 OverwriteProfileWithServerData(p, profile); | 378 OverwriteProfileWithServerData(p, profile); |
| 299 bundle->new_profiles.push_back(p); | 379 bundle->new_profiles.push_back(p); |
| 380 if (MigrationLoggingEnabled()) { | |
| 381 VLOG(1) << "[AUTOFILL MIGRATION] " | |
| 382 << " Did not find one so creating it on web db"; | |
| 383 } | |
| 384 } else { | |
| 385 if (MigrationLoggingEnabled()) { | |
| 386 VLOG(1) << "[AUTOFILL MIGRATION] " | |
| 387 << " Found it on web db. Moving on "; | |
| 388 } | |
| 300 } | 389 } |
| 301 } | 390 } |
| 302 | 391 |
| 303 bool AutofillProfileModelAssociator::SaveChangesToWebData( | 392 bool AutofillProfileModelAssociator::SaveChangesToWebData( |
| 304 const DataBundle& bundle) { | 393 const DataBundle& bundle) { |
| 305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 306 | 395 |
| 307 if (IsAbortPending()) | 396 if (IsAbortPending()) |
| 308 return false; | 397 return false; |
| 309 | 398 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); | 444 AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); |
| 356 return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; | 445 return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; |
| 357 } | 446 } |
| 358 | 447 |
| 359 void AutofillProfileModelAssociator::AbortAssociation() { | 448 void AutofillProfileModelAssociator::AbortAssociation() { |
| 360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 449 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 361 AutoLock lock(abort_association_pending_lock_); | 450 AutoLock lock(abort_association_pending_lock_); |
| 362 abort_association_pending_ = true; | 451 abort_association_pending_ = true; |
| 363 } | 452 } |
| 364 | 453 |
| 454 const std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId( | |
| 455 int64 sync_id) { | |
| 456 SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id); | |
| 457 return iter == id_map_inverse_.end() ? NULL : &(iter->second); | |
| 458 } | |
| 459 | |
| 365 bool AutofillProfileModelAssociator::IsAbortPending() { | 460 bool AutofillProfileModelAssociator::IsAbortPending() { |
| 366 AutoLock lock(abort_association_pending_lock_); | 461 AutoLock lock(abort_association_pending_lock_); |
| 367 return abort_association_pending_; | 462 return abort_association_pending_; |
| 368 } | 463 } |
| 369 | 464 |
| 465 bool AutofillProfileModelAssociator::MigrationLoggingEnabled() { | |
| 466 // [TODO] enable logging via a command line flag. | |
| 467 return false; | |
| 468 } | |
| 469 | |
| 370 } // namespace browser_sync | 470 } // namespace browser_sync |
| 371 | 471 |
| OLD | NEW |