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_model_associator.h" | 5 #include "chrome/browser/sync/glue/autofill_profile_model_associator.h" |
6 | 6 |
7 #include "base/tracked.h" | 7 #include "base/tracked.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "chrome/browser/sync/api/sync_error.h" | |
10 #include "chrome/browser/sync/glue/autofill_profile_change_processor.h" | 9 #include "chrome/browser/sync/glue/autofill_profile_change_processor.h" |
11 #include "chrome/browser/sync/glue/do_optimistic_refresh_task.h" | 10 #include "chrome/browser/sync/glue/do_optimistic_refresh_task.h" |
12 #include "chrome/browser/sync/profile_sync_service.h" | 11 #include "chrome/browser/sync/profile_sync_service.h" |
13 #include "chrome/browser/webdata/web_database.h" | 12 #include "chrome/browser/webdata/web_database.h" |
14 #include "chrome/common/guid.h" | 13 #include "chrome/common/guid.h" |
15 | 14 |
16 using sync_api::ReadNode; | 15 using sync_api::ReadNode; |
17 namespace browser_sync { | 16 namespace browser_sync { |
18 | 17 |
19 const char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; | 18 const char kAutofillProfileTag[] = "google_chrome_autofill_profiles"; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 std::vector<AutofillProfile*>* profiles) { | 129 std::vector<AutofillProfile*>* profiles) { |
131 if (IsAbortPending()) | 130 if (IsAbortPending()) |
132 return false; | 131 return false; |
133 | 132 |
134 if (!web_database_->GetAutofillTable()->GetAutofillProfiles(profiles)) | 133 if (!web_database_->GetAutofillTable()->GetAutofillProfiles(profiles)) |
135 return false; | 134 return false; |
136 | 135 |
137 return true; | 136 return true; |
138 } | 137 } |
139 | 138 |
140 bool AutofillProfileModelAssociator::AssociateModels(SyncError* error) { | 139 bool AutofillProfileModelAssociator::AssociateModels() { |
141 VLOG(1) << "Associating Autofill Models"; | 140 VLOG(1) << "Associating Autofill Models"; |
142 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
143 { | 142 { |
144 base::AutoLock lock(abort_association_pending_lock_); | 143 base::AutoLock lock(abort_association_pending_lock_); |
145 abort_association_pending_ = false; | 144 abort_association_pending_ = false; |
146 } | 145 } |
147 | 146 |
148 ScopedVector<AutofillProfile> profiles; | 147 ScopedVector<AutofillProfile> profiles; |
149 | 148 |
150 if (!LoadAutofillData(&profiles.get())) { | 149 if (!LoadAutofillData(&profiles.get())) { |
151 error->Reset(FROM_HERE, | 150 LOG(ERROR) << "Could not get the autofill data from WebDatabase."; |
152 "Could not get the autofill data from WebDatabase.", | |
153 model_type()); | |
154 return false; | 151 return false; |
155 } | 152 } |
156 | 153 |
157 VLOG(1) << "[AUTOFILL MIGRATION]" | 154 VLOG(1) << "[AUTOFILL MIGRATION]" |
158 << " Now associating to the new autofill profile model associator" | 155 << " Now associating to the new autofill profile model associator" |
159 << " root node"; | 156 << " root node"; |
160 DataBundle bundle; | 157 DataBundle bundle; |
161 { | 158 { |
162 // The write transaction lock is held inside this block. | 159 // The write transaction lock is held inside this block. |
163 // We do all the web db operations outside this block. | 160 // We do all the web db operations outside this block. |
164 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | 161 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); |
165 | 162 |
166 sync_api::ReadNode autofill_root(&trans); | 163 sync_api::ReadNode autofill_root(&trans); |
167 if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { | 164 if (!autofill_root.InitByTagLookup(kAutofillProfileTag)) { |
168 error->Reset(FROM_HERE, | 165 LOG(ERROR) << "Server did not create the top-level autofill node. We " |
169 "Server did not create the top-level autofill node. We " | 166 << "might be running against an out-of-date server."; |
170 "might be running against an out-of-date server.", | |
171 model_type()); | |
172 return false; | 167 return false; |
173 } | 168 } |
174 | 169 |
175 if (!TraverseAndAssociateChromeAutofillProfiles(&trans, autofill_root, | 170 if (!TraverseAndAssociateChromeAutofillProfiles(&trans, autofill_root, |
176 profiles.get(), &bundle.current_profiles, | 171 profiles.get(), &bundle.current_profiles, |
177 &bundle.updated_profiles, | 172 &bundle.updated_profiles, |
178 &bundle.new_profiles, | 173 &bundle.new_profiles, |
179 &bundle.profiles_to_delete) || | 174 &bundle.profiles_to_delete) || |
180 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { | 175 !TraverseAndAssociateAllSyncNodes(&trans, autofill_root, &bundle)) { |
181 error->Reset(FROM_HERE, | |
182 "Failed to associate all sync nodes.", | |
183 model_type()); | |
184 return false; | 176 return false; |
185 } | 177 } |
186 } | 178 } |
187 | 179 |
188 if (!SaveChangesToWebData(bundle)) { | 180 if (!SaveChangesToWebData(bundle)) { |
189 error->Reset(FROM_HERE, "Failed to update webdata.", model_type()); | 181 LOG(ERROR) << "Failed to update autofill entries."; |
190 return false; | 182 return false; |
191 } | 183 } |
192 | 184 |
193 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 185 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
194 new DoOptimisticRefreshForAutofill(personal_data_)); | 186 new DoOptimisticRefreshForAutofill(personal_data_)); |
195 return true; | 187 return true; |
196 } | 188 } |
197 | 189 |
198 bool AutofillProfileModelAssociator::DisassociateModels(SyncError* error) { | 190 bool AutofillProfileModelAssociator::DisassociateModels() { |
199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 191 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
200 id_map_.clear(); | 192 id_map_.clear(); |
201 id_map_inverse_.clear(); | 193 id_map_inverse_.clear(); |
202 return true; | 194 return true; |
203 } | 195 } |
204 | 196 |
205 // 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 |
206 // 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. |
207 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, | 199 bool AutofillProfileModelAssociator::MergeField(FormGroup* f, |
208 AutofillFieldType t, | 200 AutofillFieldType t, |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 bool AutofillProfileModelAssociator::CryptoReadyIfNecessary() { | 496 bool AutofillProfileModelAssociator::CryptoReadyIfNecessary() { |
505 // We only access the cryptographer while holding a transaction. | 497 // We only access the cryptographer while holding a transaction. |
506 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); | 498 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); |
507 syncable::ModelTypeSet encrypted_types; | 499 syncable::ModelTypeSet encrypted_types; |
508 encrypted_types = sync_api::GetEncryptedTypes(&trans); | 500 encrypted_types = sync_api::GetEncryptedTypes(&trans); |
509 return encrypted_types.count(syncable::AUTOFILL_PROFILE) == 0 || | 501 return encrypted_types.count(syncable::AUTOFILL_PROFILE) == 0 || |
510 sync_service_->IsCryptographerReady(&trans); | 502 sync_service_->IsCryptographerReady(&trans); |
511 } | 503 } |
512 | 504 |
513 } // namespace browser_sync | 505 } // namespace browser_sync |
OLD | NEW |