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_change_processor.h" | 5 #include "chrome/browser/sync/glue/autofill_change_processor.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "chrome/browser/guid.h" | 12 #include "chrome/browser/guid.h" |
13 #include "chrome/browser/autofill/personal_data_manager.h" | |
tim (not reviewing)
2010/12/13 19:24:33
alphabetical
lipalani
2010/12/15 09:08:33
Done.
| |
14 #include "chrome/browser/prefs/pref_service.h" | |
13 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/autofill/personal_data_manager.h" | |
15 #include "chrome/browser/sync/glue/autofill_change_processor2.h" | 16 #include "chrome/browser/sync/glue/autofill_change_processor2.h" |
16 #include "chrome/browser/sync/glue/autofill_model_associator.h" | 17 #include "chrome/browser/sync/glue/autofill_model_associator.h" |
18 #include "chrome/browser/sync/glue/autofill_profile_model_associator.h" | |
19 #include "chrome/browser/sync/glue/do_optimistic_refresh_Task.h" | |
17 #include "chrome/browser/sync/profile_sync_service.h" | 20 #include "chrome/browser/sync/profile_sync_service.h" |
18 #include "chrome/browser/webdata/autofill_change.h" | 21 #include "chrome/browser/webdata/autofill_change.h" |
19 #include "chrome/browser/webdata/web_data_service.h" | 22 #include "chrome/browser/webdata/web_data_service.h" |
20 #include "chrome/browser/webdata/web_database.h" | 23 #include "chrome/browser/webdata/web_database.h" |
21 #include "chrome/common/notification_service.h" | 24 #include "chrome/common/notification_service.h" |
25 #include "chrome/common/pref_names.h" | |
22 | 26 |
23 namespace browser_sync { | 27 namespace browser_sync { |
24 | 28 |
25 struct AutofillChangeProcessor::AutofillChangeRecord { | 29 struct AutofillChangeProcessor::AutofillChangeRecord { |
26 sync_api::SyncManager::ChangeRecord::Action action_; | 30 sync_api::SyncManager::ChangeRecord::Action action_; |
27 int64 id_; | 31 int64 id_; |
28 sync_pb::AutofillSpecifics autofill_; | 32 sync_pb::AutofillSpecifics autofill_; |
29 AutofillChangeRecord(sync_api::SyncManager::ChangeRecord::Action action, | 33 AutofillChangeRecord(sync_api::SyncManager::ChangeRecord::Action action, |
30 int64 id, const sync_pb::AutofillSpecifics& autofill) | 34 int64 id, const sync_pb::AutofillSpecifics& autofill) |
31 : action_(action), | 35 : action_(action), |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 } | 80 } |
77 | 81 |
78 DCHECK(type.value == NotificationType::AUTOFILL_ENTRIES_CHANGED); | 82 DCHECK(type.value == NotificationType::AUTOFILL_ENTRIES_CHANGED); |
79 | 83 |
80 AutofillChangeList* changes = Details<AutofillChangeList>(details).ptr(); | 84 AutofillChangeList* changes = Details<AutofillChangeList>(details).ptr(); |
81 ObserveAutofillEntriesChanged(changes, &trans, autofill_root); | 85 ObserveAutofillEntriesChanged(changes, &trans, autofill_root); |
82 } | 86 } |
83 | 87 |
84 void AutofillChangeProcessor::PostOptimisticRefreshTask() { | 88 void AutofillChangeProcessor::PostOptimisticRefreshTask() { |
85 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 89 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
86 new AutofillModelAssociator::DoOptimisticRefreshTask( | 90 new DoOptimisticRefreshForAutofill( |
87 personal_data_)); | 91 personal_data_)); |
88 } | 92 } |
89 | 93 |
90 void AutofillChangeProcessor::ObserveAutofillEntriesChanged( | 94 void AutofillChangeProcessor::ObserveAutofillEntriesChanged( |
91 AutofillChangeList* changes, sync_api::WriteTransaction* trans, | 95 AutofillChangeList* changes, sync_api::WriteTransaction* trans, |
92 const sync_api::ReadNode& autofill_root) { | 96 const sync_api::ReadNode& autofill_root) { |
93 for (AutofillChangeList::iterator change = changes->begin(); | 97 for (AutofillChangeList::iterator change = changes->begin(); |
94 change != changes->end(); ++change) { | 98 change != changes->end(); ++change) { |
95 switch (change->type()) { | 99 switch (change->type()) { |
96 case AutofillChange::ADD: | 100 case AutofillChange::ADD: |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
188 | 192 |
189 void AutofillChangeProcessor::ApplyChangesFromSyncModel( | 193 void AutofillChangeProcessor::ApplyChangesFromSyncModel( |
190 const sync_api::BaseTransaction* trans, | 194 const sync_api::BaseTransaction* trans, |
191 const sync_api::SyncManager::ChangeRecord* changes, | 195 const sync_api::SyncManager::ChangeRecord* changes, |
192 int change_count) { | 196 int change_count) { |
193 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 197 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
194 if (!running()) | 198 if (!running()) |
195 return; | 199 return; |
196 StopObserving(); | 200 StopObserving(); |
197 | 201 |
202 bool autofill_profile_not_migrated = HasNotMigratedYet(trans); | |
203 | |
198 sync_api::ReadNode autofill_root(trans); | 204 sync_api::ReadNode autofill_root(trans); |
199 if (!autofill_root.InitByTagLookup(kAutofillTag)) { | 205 if (!autofill_root.InitByTagLookup(kAutofillTag)) { |
200 error_handler()->OnUnrecoverableError(FROM_HERE, | 206 error_handler()->OnUnrecoverableError(FROM_HERE, |
201 "Autofill root node lookup failed."); | 207 "Autofill root node lookup failed."); |
202 return; | 208 return; |
203 } | 209 } |
204 | 210 |
205 for (int i = 0; i < change_count; ++i) { | 211 for (int i = 0; i < change_count; ++i) { |
206 sync_api::SyncManager::ChangeRecord::Action action(changes[i].action); | 212 sync_api::SyncManager::ChangeRecord::Action action(changes[i].action); |
207 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == action) { | 213 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == action) { |
208 DCHECK(changes[i].specifics.HasExtension(sync_pb::autofill)) | 214 DCHECK(changes[i].specifics.HasExtension(sync_pb::autofill)) |
209 << "Autofill specifics data not present on delete!"; | 215 << "Autofill specifics data not present on delete!"; |
210 const sync_pb::AutofillSpecifics& autofill = | 216 const sync_pb::AutofillSpecifics& autofill = |
211 changes[i].specifics.GetExtension(sync_pb::autofill); | 217 changes[i].specifics.GetExtension(sync_pb::autofill); |
212 if (autofill.has_value() || | 218 if (autofill.has_value() || |
213 (HasNotMigratedYet() && autofill.has_profile())) { | 219 (autofill_profile_not_migrated && autofill.has_profile())) { |
214 autofill_changes_.push_back(AutofillChangeRecord(changes[i].action, | 220 autofill_changes_.push_back(AutofillChangeRecord(changes[i].action, |
215 changes[i].id, | 221 changes[i].id, |
216 autofill)); | 222 autofill)); |
217 } else { | 223 } else { |
218 NOTREACHED() << "Autofill specifics has no data!"; | 224 NOTREACHED() << "Autofill specifics has no data!"; |
219 } | 225 } |
220 continue; | 226 continue; |
221 } | 227 } |
222 | 228 |
223 // Handle an update or add. | 229 // Handle an update or add. |
224 sync_api::ReadNode sync_node(trans); | 230 sync_api::ReadNode sync_node(trans); |
225 if (!sync_node.InitByIdLookup(changes[i].id)) { | 231 if (!sync_node.InitByIdLookup(changes[i].id)) { |
226 error_handler()->OnUnrecoverableError(FROM_HERE, | 232 error_handler()->OnUnrecoverableError(FROM_HERE, |
227 "Autofill node lookup failed."); | 233 "Autofill node lookup failed."); |
228 return; | 234 return; |
229 } | 235 } |
230 | 236 |
231 // Check that the changed node is a child of the autofills folder. | 237 // Check that the changed node is a child of the autofills folder. |
232 DCHECK(autofill_root.GetId() == sync_node.GetParentId()); | 238 DCHECK(autofill_root.GetId() == sync_node.GetParentId()); |
233 DCHECK(syncable::AUTOFILL == sync_node.GetModelType()); | 239 DCHECK(syncable::AUTOFILL == sync_node.GetModelType()); |
234 | 240 |
235 const sync_pb::AutofillSpecifics& autofill( | 241 const sync_pb::AutofillSpecifics& autofill( |
236 sync_node.GetAutofillSpecifics()); | 242 sync_node.GetAutofillSpecifics()); |
237 int64 sync_id = sync_node.GetId(); | 243 int64 sync_id = sync_node.GetId(); |
238 if (autofill.has_value() || | 244 if (autofill.has_value() || |
239 (HasNotMigratedYet() && autofill.has_profile())) { | 245 (autofill_profile_not_migrated && autofill.has_profile())) { |
240 autofill_changes_.push_back(AutofillChangeRecord(changes[i].action, | 246 autofill_changes_.push_back(AutofillChangeRecord(changes[i].action, |
241 sync_id, autofill)); | 247 sync_id, autofill)); |
242 } else { | 248 } else { |
243 NOTREACHED() << "Autofill specifics has no data!"; | 249 NOTREACHED() << "Autofill specifics has no data!"; |
244 } | 250 } |
245 } | 251 } |
246 | 252 |
247 StartObserving(); | 253 StartObserving(); |
248 } | 254 } |
249 | 255 |
250 void AutofillChangeProcessor::CommitChangesFromSyncModel() { | 256 void AutofillChangeProcessor::CommitChangesFromSyncModel() { |
251 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 257 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
252 if (!running()) | 258 if (!running()) |
253 return; | 259 return; |
254 StopObserving(); | 260 StopObserving(); |
255 | 261 |
256 std::vector<AutofillEntry> new_entries; | 262 std::vector<AutofillEntry> new_entries; |
257 for (unsigned int i = 0; i < autofill_changes_.size(); i++) { | 263 for (unsigned int i = 0; i < autofill_changes_.size(); i++) { |
258 // Handle deletions. | 264 // Handle deletions. |
259 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == | 265 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == |
260 autofill_changes_[i].action_) { | 266 autofill_changes_[i].action_) { |
261 if (autofill_changes_[i].autofill_.has_value()) { | 267 if (autofill_changes_[i].autofill_.has_value()) { |
262 ApplySyncAutofillEntryDelete(autofill_changes_[i].autofill_); | 268 ApplySyncAutofillEntryDelete(autofill_changes_[i].autofill_); |
263 } else if (autofill_changes_[i].autofill_.has_profile()) { | 269 } else if (autofill_changes_[i].autofill_.has_profile()) { |
264 DCHECK(HasNotMigratedYet()); | |
265 ApplySyncAutofillProfileDelete(autofill_changes_[i].id_); | 270 ApplySyncAutofillProfileDelete(autofill_changes_[i].id_); |
266 } else { | 271 } else { |
267 NOTREACHED() << "Autofill's CommitChanges received change with no" | 272 NOTREACHED() << "Autofill's CommitChanges received change with no" |
268 " data!"; | 273 " data!"; |
269 } | 274 } |
270 continue; | 275 continue; |
271 } | 276 } |
272 | 277 |
273 // Handle update/adds. | 278 // Handle update/adds. |
274 if (autofill_changes_[i].autofill_.has_value()) { | 279 if (autofill_changes_[i].autofill_.has_value()) { |
275 ApplySyncAutofillEntryChange(autofill_changes_[i].action_, | 280 ApplySyncAutofillEntryChange(autofill_changes_[i].action_, |
276 autofill_changes_[i].autofill_, &new_entries, | 281 autofill_changes_[i].autofill_, &new_entries, |
277 autofill_changes_[i].id_); | 282 autofill_changes_[i].id_); |
278 } else if (autofill_changes_[i].autofill_.has_profile()) { | 283 } else if (autofill_changes_[i].autofill_.has_profile()) { |
279 DCHECK(HasNotMigratedYet()); | |
280 ApplySyncAutofillProfileChange(autofill_changes_[i].action_, | 284 ApplySyncAutofillProfileChange(autofill_changes_[i].action_, |
281 autofill_changes_[i].autofill_.profile(), | 285 autofill_changes_[i].autofill_.profile(), |
282 autofill_changes_[i].id_); | 286 autofill_changes_[i].id_); |
283 } else { | 287 } else { |
284 NOTREACHED() << "Autofill's CommitChanges received change with no data!"; | 288 NOTREACHED() << "Autofill's CommitChanges received change with no data!"; |
285 } | 289 } |
286 } | 290 } |
287 autofill_changes_.clear(); | 291 autofill_changes_.clear(); |
288 | 292 |
tim (not reviewing)
2010/12/13 19:24:33
extra newline
lipalani
2010/12/15 09:08:33
Done.
| |
293 | |
289 // Make changes | 294 // Make changes |
290 if (!web_database_->UpdateAutofillEntries(new_entries)) { | 295 if (!web_database_->UpdateAutofillEntries(new_entries)) { |
291 error_handler()->OnUnrecoverableError(FROM_HERE, | 296 error_handler()->OnUnrecoverableError(FROM_HERE, |
292 "Could not update autofill entries."); | 297 "Could not update autofill entries."); |
293 return; | 298 return; |
294 } | 299 } |
295 | 300 |
296 PostOptimisticRefreshTask(); | 301 PostOptimisticRefreshTask(); |
297 | 302 |
298 StartObserving(); | 303 StartObserving(); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 autofill.set_name(UTF16ToUTF8(entry.key().name())); | 431 autofill.set_name(UTF16ToUTF8(entry.key().name())); |
427 autofill.set_value(UTF16ToUTF8(entry.key().value())); | 432 autofill.set_value(UTF16ToUTF8(entry.key().value())); |
428 const std::vector<base::Time>& ts(entry.timestamps()); | 433 const std::vector<base::Time>& ts(entry.timestamps()); |
429 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); | 434 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); |
430 timestamp != ts.end(); ++timestamp) { | 435 timestamp != ts.end(); ++timestamp) { |
431 autofill.add_usage_timestamp(timestamp->ToInternalValue()); | 436 autofill.add_usage_timestamp(timestamp->ToInternalValue()); |
432 } | 437 } |
433 node->SetAutofillSpecifics(autofill); | 438 node->SetAutofillSpecifics(autofill); |
434 } | 439 } |
435 | 440 |
436 // static | 441 bool AutofillChangeProcessor::HasNotMigratedYet( |
437 void AutofillChangeProcessor::WriteAutofillProfile( | 442 const sync_api::BaseTransaction* trans) { |
438 const AutoFillProfile& profile, sync_api::WriteNode* node) { | 443 return model_associator_->HasNotMigratedYet(trans); |
439 sync_pb::AutofillSpecifics autofill; | |
440 sync_pb::AutofillProfileSpecifics* s(autofill.mutable_profile()); | |
441 s->set_name_first(UTF16ToUTF8( | |
442 profile.GetFieldText(AutoFillType(NAME_FIRST)))); | |
443 s->set_name_middle(UTF16ToUTF8( | |
444 profile.GetFieldText(AutoFillType(NAME_MIDDLE)))); | |
445 s->set_name_last(UTF16ToUTF8(profile.GetFieldText(AutoFillType(NAME_LAST)))); | |
446 s->set_address_home_line1( | |
447 UTF16ToUTF8(profile.GetFieldText(AutoFillType(ADDRESS_HOME_LINE1)))); | |
448 s->set_address_home_line2( | |
449 UTF16ToUTF8(profile.GetFieldText(AutoFillType(ADDRESS_HOME_LINE2)))); | |
450 s->set_address_home_city(UTF16ToUTF8(profile.GetFieldText( | |
451 AutoFillType(ADDRESS_HOME_CITY)))); | |
452 s->set_address_home_state(UTF16ToUTF8(profile.GetFieldText( | |
453 AutoFillType(ADDRESS_HOME_STATE)))); | |
454 s->set_address_home_country(UTF16ToUTF8(profile.GetFieldText( | |
455 AutoFillType(ADDRESS_HOME_COUNTRY)))); | |
456 s->set_address_home_zip(UTF16ToUTF8(profile.GetFieldText( | |
457 AutoFillType(ADDRESS_HOME_ZIP)))); | |
458 s->set_email_address(UTF16ToUTF8(profile.GetFieldText( | |
459 AutoFillType(EMAIL_ADDRESS)))); | |
460 s->set_company_name(UTF16ToUTF8(profile.GetFieldText( | |
461 AutoFillType(COMPANY_NAME)))); | |
462 s->set_phone_fax_whole_number(UTF16ToUTF8(profile.GetFieldText( | |
463 AutoFillType(PHONE_FAX_WHOLE_NUMBER)))); | |
464 s->set_phone_home_whole_number(UTF16ToUTF8(profile.GetFieldText( | |
465 AutoFillType(PHONE_HOME_WHOLE_NUMBER)))); | |
466 node->SetAutofillSpecifics(autofill); | |
467 } | |
468 bool AutofillChangeProcessor::HasNotMigratedYet() { | |
469 return true; | |
470 } | 444 } |
471 | 445 |
472 } // namespace browser_sync | 446 } // namespace browser_sync |
447 | |
tim (not reviewing)
2010/12/13 19:24:33
extra newline
lipalani
2010/12/15 09:08:33
Done.
| |
OLD | NEW |