autofill_profile_model_associator.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file. 4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/glue/autofill_profile_model_associator.h" 6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/utf_string_conversions.h" 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/autofill_profile_change_processor.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/do_optimistic_refresh_task.h" 10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h" 11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/webdata/web_database.h" 12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing sync_api::ReadNode; 14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace browser_sync { 15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; 17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::AutofillProfileModelAssociator( 19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ProfileSyncService* sync_service, 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebDatabase* web_database, 21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch PersonalDataManager* personal_data) 22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch : sync_service_(sync_service), 23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch web_database_(web_database), 24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch personal_data_(personal_data), 25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch autofill_node_id_(sync_api::kInvalidId), 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen abort_association_pending_(false), 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_(0) { 28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(sync_service_); 30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(web_database_); 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(personal_data_); 32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochAutofillProfileModelAssociator::~AutofillProfileModelAssociator() { 35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenAutofillProfileModelAssociator::AutofillProfileModelAssociator() {} 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateChromeAutoFillProfiles( 41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* write_trans, 42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& autofill_root, 43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::vector<AutoFillProfile*>& all_profiles_from_db, 44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::set<std::string>* current_profiles, 45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<AutoFillProfile*>* updated_profiles, 46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<AutoFillProfile*>* new_profiles, 47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<std::string>* profiles_to_delete) { 48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (VLOG_IS_ON(1)) { 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Printing profiles from web db"; 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (std::vector<AutoFillProfile*>::const_iterator ix = 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen all_profiles_from_db.begin(); ix != all_profiles_from_db.end(); ++ix) { 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AutoFillProfile* p = *ix; 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << p->GetFieldText(AutoFillType(NAME_FIRST)) 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << p->GetFieldText(AutoFillType(NAME_LAST)) 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << p->guid(); 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Looking for the above data in sync db.."; 653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Alias the all_profiles_from_db so we fit in 80 characters 67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::vector<AutoFillProfile*>& profiles(all_profiles_from_db); 68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (std::vector<AutoFillProfile*>::const_iterator ix = profiles.begin(); 69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ix != profiles.end(); 70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ++ix) { 71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid((*ix)->guid()); 72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode node(write_trans); 743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE, guid) && 753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // The following check is to ensure the given sync node is not already 763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // associated with another profile. That could happen if the user has 773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // the same profile duplicated. 783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_profiles->find(guid) == current_profiles->end()) { 793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Found in sync db: " 823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << (*ix)->GetFieldText(AutoFillType(NAME_FIRST)) 833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << (*ix)->GetFieldText(AutoFillType(NAME_LAST)) 843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << (*ix)->guid() 853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " so associating with node id " << node.GetId(); 86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill( 87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch node.GetAutofillProfileSpecifics()); 88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (OverwriteProfileWithServerData(*ix, autofill)) { 89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch updated_profiles->push_back(*ix); 90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, node.GetId()); 92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles->insert(guid); 93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch MakeNewAutofillProfileSyncNodeIfNeeded(write_trans, 95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch autofill_root, 96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch (**ix), 97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch new_profiles, 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles, 99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles_to_delete); 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::GetSyncIdForTaggedNode( 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& tag, 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64* sync_id) { 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadTransaction trans(sync_service_->GetUserShare()); 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen sync_api::ReadNode sync_node(&trans); 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!sync_node.InitByTagLookup(tag.c_str())) 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *sync_id = sync_node.GetId(); 113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::LoadAutofillData( 117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<AutoFillProfile*>* profiles) { 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!web_database_->GetAutoFillProfiles(profiles)) 122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::AssociateModels() { 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch VLOG(1) << "Associating Autofill Models"; 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch { 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch abort_association_pending_ = false; 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ScopedVector<AutoFillProfile> profiles; 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!LoadAutofillData(&profiles.get())) { 138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Could not get the autofill data from WebDatabase."; 139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 1433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Now associating to the new autofill profile model associator" 1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " root node"; 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle bundle; 146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch { 147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The write transaction lock is held inside this block. 148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // We do all the web db operations outside this block. 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::WriteTransaction trans(sync_service_->GetUserShare()); 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode autofill_root(&trans); 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { 153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Server did not create the top-level autofill node. We " 154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch << "might be running against an out-of-date server."; 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!TraverseAndAssociateChromeAutoFillProfiles(&trans, autofill_root, 159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles.get(), &bundle.current_profiles, 160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.updated_profiles, 161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.new_profiles, 162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch &bundle.profiles_to_delete) || 163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { 164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!SaveChangesToWebData(bundle)) { 169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to update autofill entries."; 170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (sync_service_->GetAutofillMigrationState() != 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::MIGRATED) { 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::AutofillMigrationDebugInfo debug_info; 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen debug_info.autofill_profile_added_during_migration = 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_; 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_service_->SetAutofillMigrationDebugInfo( 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::AutofillMigrationDebugInfo::PROFILES_ADDED, 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen debug_info); 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_service_->SetAutofillMigrationState( 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen syncable::MIGRATED); 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen new DoOptimisticRefreshForAutofill(personal_data_)); 187201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::DisassociateModels() { 191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_.clear(); 192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_.clear(); 193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Helper to compare the local value and cloud value of a field, merge into 197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the local value if they differ, and return whether the merge happened. 198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MergeField(FormGroup* f, 199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillFieldType t, 200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::string& specifics_field) { 201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (UTF16ToUTF8(f->GetFieldText(AutoFillType(t))) == specifics_field) 202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch f->SetInfo(AutoFillType(t), UTF8ToUTF16(specifics_field)); 204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SyncModelHasUserCreatedNodes( 207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool *has_nodes) { 208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK_NE(has_nodes, reinterpret_cast<bool*>(NULL)); 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadTransaction trans(sync_service_->GetUserShare()); 210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 211201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode node(&trans); 212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!node.InitByTagLookup(kAutofillProfileTag)) { 214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Sever did not create a top level node" 215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch << "Out of data server or autofill type not enabled"; 216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch *has_nodes = sync_api::kInvalidId != node.GetFirstChildId(); 220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 221201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static 223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::OverwriteProfileWithServerData( 224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillProfile* merge_into, 225201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& specifics) { 226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool diff = false; 227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillProfile* p = merge_into; 228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& s(specifics); 229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_FIRST, s.name_first()) || diff; 230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_LAST, s.name_last()) || diff; 231201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, NAME_MIDDLE, s.name_middle()) || diff; 232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_LINE1, s.address_home_line1()) || diff; 233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_LINE2, s.address_home_line2()) || diff; 234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_CITY, s.address_home_city()) || diff; 235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_STATE, s.address_home_state()) || diff; 236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_COUNTRY, s.address_home_country()) || diff; 237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff; 238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff; 239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff; 240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number()) 241201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch || diff; 242201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number()) 243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch || diff; 244201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return diff; 245201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::FindSyncNodeWithProfile( 249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* trans, 250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::BaseNode& autofill_root, 2513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen const AutoFillProfile& profile_from_db, 2523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::set<std::string>* current_profiles) { 253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_child_id = autofill_root.GetFirstChildId(); 254201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch while (sync_child_id != sync_api::kInvalidId) { 255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode read_node(trans); 256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillProfile p; 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!read_node.InitByIdLookup(sync_child_id)) { 258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "unable to find the id given by getfirst child " << 259201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id; 260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return sync_api::kInvalidId; 261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill_specifics( 263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch read_node.GetAutofillProfileSpecifics()); 2643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // This find should be fast as the set uses tree. 2663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (current_profiles->find(autofill_specifics.guid()) 2673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen == current_profiles->end()) { 2683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen OverwriteProfileWithServerData(&p, autofill_specifics); 2693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if (p.Compare(profile_from_db) == 0) { 2703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return sync_child_id; 2713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } 272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id = read_node.GetSuccessorId(); 274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return sync_api::kInvalidId; 277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::MakeNewAutofillProfileSyncNodeIfNeeded( 279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* trans, 280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::BaseNode& autofill_root, 281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const AutoFillProfile& profile, 282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<AutoFillProfile*>* new_profiles, 283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::set<std::string>* current_profiles, 284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::vector<std::string>* profiles_to_delete) { 285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 2863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen int64 sync_node_id = FindSyncNodeWithProfile(trans, 2873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen autofill_root, 2883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen profile, 2893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_profiles); 290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (sync_node_id != sync_api::kInvalidId) { 291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // In case of duplicates throw away the local profile and apply the 292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // server profile.(The only difference between the 2 profiles are the guids) 293201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch profiles_to_delete->push_back(profile.guid()); 294201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::ReadNode read_node(trans); 295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!read_node.InitByIdLookup(sync_node_id)) { 296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR); 297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill_specifics( 300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch read_node.GetAutofillProfileSpecifics()); 301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillProfile* p = new AutoFillProfile(autofill_specifics.guid()); 302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch OverwriteProfileWithServerData(p, autofill_specifics); 303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch new_profiles->push_back(p); 304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid = autofill_specifics.guid(); 305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, sync_node_id); 306201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch current_profiles->insert(autofill_specifics.guid()); 3073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 3083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Found in sync db but with a different guid: " 3093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST))) 3103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST))) 3113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "New guid " << autofill_specifics.guid() << " sync node id " 3123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << sync_node_id << " so associating. Profile to be deleted " 3133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.guid(); 314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteNode node(trans); 316201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!node.InitUniqueByCreation( 317201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch syncable::AUTOFILL_PROFILE, autofill_root, profile.guid())) { 318201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to create autofill sync node."; 319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch node.SetTitle(UTF8ToWide(profile.guid())); 3223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION]" 3233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "NOT Found in sync db " 3243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_FIRST))) 3253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST))) 3263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.guid() 3273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " so creating a new sync node. Sync node id " 3283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << node.GetId(); 32921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AutofillProfileChangeProcessor::WriteAutofillProfile(profile, &node); 33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen current_profiles->insert(profile.guid()); 3313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::string guid = profile.guid(); 3323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen Associate(&guid, node.GetId()); 33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_profiles_created_++; 334201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::TraverseAndAssociateAllSyncNodes( 340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_api::WriteTransaction* write_trans, 341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& autofill_root, 342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle* bundle) { 343201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 3443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 3453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Iterating over sync nodes of autofill profile root node"; 346201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 347201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_child_id = autofill_root.GetFirstChildId(); 348201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch while (sync_child_id != sync_api::kInvalidId) { 349201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ReadNode sync_child(write_trans); 350201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!sync_child.InitByIdLookup(sync_child_id)) { 351201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOG(ERROR) << "Failed to fetch child node."; 352201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 353201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 354201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& autofill( 355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child.GetAutofillProfileSpecifics()); 356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AddNativeProfileIfNeeded(autofill, bundle, sync_child); 358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch sync_child_id = sync_child.GetSuccessorId(); 360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AddNativeProfileIfNeeded( 365201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_pb::AutofillProfileSpecifics& profile, 366201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DataBundle* bundle, 367201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const sync_api::ReadNode& node) { 368201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 3703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 3713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "Trying to lookup " 3723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.name_first() 3733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " " 3743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << profile.name_last() 3753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << "sync node id " << node.GetId() 3763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Guid " << profile.guid() 3773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " in the web db"; 3783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (bundle->current_profiles.find(profile.guid()) == 380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bundle->current_profiles.end()) { 381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch std::string guid(profile.guid()); 382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Associate(&guid, node.GetId()); 383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutoFillProfile* p = new AutoFillProfile(profile.guid()); 384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch OverwriteProfileWithServerData(p, profile); 385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bundle->new_profiles.push_back(p); 3863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 3873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Did not find one so creating it on web db"; 38821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else { 3893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen VLOG(1) << "[AUTOFILL MIGRATION] " 3903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen << " Found it on web db. Moving on "; 391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::SaveChangesToWebData( 395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const DataBundle& bundle) { 396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i < bundle.new_profiles.size(); i++) { 402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!web_database_->AddAutoFillProfile(*bundle.new_profiles[i])) 405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i < bundle.updated_profiles.size(); i++) { 409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!web_database_->UpdateAutoFillProfile(*bundle.updated_profiles[i])) 412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (size_t i = 0; i< bundle.profiles_to_delete.size(); ++i) { 416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (IsAbortPending()) 417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!web_database_->RemoveAutoFillProfile(bundle.profiles_to_delete[i])) 419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return false; 420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool AutofillProfileModelAssociator::InitSyncNodeFromChromeId( 42521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& node_id, 42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen sync_api::BaseNode* sync_node) { 42721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 42921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Associate( 431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const std::string* autofill, 432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int64 sync_id) { 433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK_NE(sync_api::kInvalidId, sync_id); 435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(id_map_.find(*autofill) == id_map_.end()); 436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(id_map_inverse_.find(sync_id) == id_map_inverse_.end()); 437201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_[*autofill] = sync_id; 438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_[sync_id] = *autofill; 439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::Disassociate(int64 sync_id) { 442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SyncIdToAutofillMap::iterator iter = id_map_inverse_.find(sync_id); 444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (iter == id_map_inverse_.end()) 445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 446201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch CHECK(id_map_.erase(iter->second)); 447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch id_map_inverse_.erase(iter); 448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 AutofillProfileModelAssociator::GetSyncIdFromChromeId( 45121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& autofill) { 452201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch AutofillToSyncIdMap::const_iterator iter = id_map_.find(autofill); 453201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return iter == id_map_.end() ? sync_api::kInvalidId : iter->second; 454201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 455201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 456201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid AutofillProfileModelAssociator::AbortAssociation() { 457201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch abort_association_pending_ = true; 460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst std::string* AutofillProfileModelAssociator::GetChromeNodeFromSyncId( 46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int64 sync_id) { 46421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SyncIdToAutofillMap::const_iterator iter = id_map_inverse_.find(sync_id); 46521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return iter == id_map_inverse_.end() ? NULL : &(iter->second); 46621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 46721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool AutofillProfileModelAssociator::IsAbortPending() { 46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock lock(abort_association_pending_lock_); 470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return abort_association_pending_; 471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::DataBundle() {} 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAutofillProfileModelAssociator::DataBundle::~DataBundle() { 47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STLDeleteElements(&new_profiles); 47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} // namespace browser_sync 481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 482