OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/webdata/autocomplete_syncable_service.h" | 5 #include "chrome/browser/webdata/autocomplete_syncable_service.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 return true; | 72 return true; |
73 } else { | 73 } else { |
74 new_timestamps->insert(new_timestamps->begin(), | 74 new_timestamps->insert(new_timestamps->begin(), |
75 timestamps.begin(), | 75 timestamps.begin(), |
76 timestamps.end()); | 76 timestamps.end()); |
77 return false; | 77 return false; |
78 } | 78 } |
79 } | 79 } |
80 } | 80 } |
81 | 81 |
| 82 void* UserDataKey() { |
| 83 // Use the address of a static that COMDAT folding won't ever fold |
| 84 // with something else. |
| 85 static int user_data_key = 0; |
| 86 return reinterpret_cast<void*>(&user_data_key); |
| 87 } |
| 88 |
82 } // namespace | 89 } // namespace |
83 | 90 |
84 AutocompleteSyncableService::AutocompleteSyncableService( | 91 AutocompleteSyncableService::AutocompleteSyncableService( |
85 WebDataService* web_data_service) | 92 WebDataService* web_data_service) |
86 : web_data_service_(web_data_service), | 93 : web_data_service_(web_data_service), |
87 cull_expired_entries_(false) { | 94 cull_expired_entries_(false) { |
88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
89 DCHECK(web_data_service_); | 96 DCHECK(web_data_service_); |
90 notification_registrar_.Add( | 97 notification_registrar_.Add( |
91 this, chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, | 98 this, chrome::NOTIFICATION_AUTOFILL_ENTRIES_CHANGED, |
92 content::Source<WebDataService>(web_data_service)); | 99 content::Source<WebDataService>(web_data_service)); |
93 } | 100 } |
94 | 101 |
95 AutocompleteSyncableService::~AutocompleteSyncableService() { | 102 AutocompleteSyncableService::~AutocompleteSyncableService() { |
96 DCHECK(CalledOnValidThread()); | 103 DCHECK(CalledOnValidThread()); |
97 } | 104 } |
98 | 105 |
| 106 // static |
| 107 void AutocompleteSyncableService::CreateForWebDataService( |
| 108 WebDataService* web_data) { |
| 109 web_data->GetDBUserData()->SetUserData( |
| 110 UserDataKey(), new AutocompleteSyncableService(web_data)); |
| 111 } |
| 112 |
| 113 // static |
| 114 AutocompleteSyncableService* AutocompleteSyncableService::FromWebDataService( |
| 115 WebDataService* web_data) { |
| 116 return static_cast<AutocompleteSyncableService*>( |
| 117 web_data->GetDBUserData()->GetUserData(UserDataKey())); |
| 118 } |
| 119 |
99 AutocompleteSyncableService::AutocompleteSyncableService() | 120 AutocompleteSyncableService::AutocompleteSyncableService() |
100 : web_data_service_(NULL), | 121 : web_data_service_(NULL), |
101 cull_expired_entries_(false) { | 122 cull_expired_entries_(false) { |
102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
103 } | 124 } |
104 | 125 |
105 syncer::SyncMergeResult AutocompleteSyncableService::MergeDataAndStartSyncing( | 126 syncer::SyncMergeResult AutocompleteSyncableService::MergeDataAndStartSyncing( |
106 syncer::ModelType type, | 127 syncer::ModelType type, |
107 const syncer::SyncDataList& initial_sync_data, | 128 const syncer::SyncDataList& initial_sync_data, |
108 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, | 129 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 313 |
293 DCHECK_EQ(web_data_service_, wds); | 314 DCHECK_EQ(web_data_service_, wds); |
294 | 315 |
295 AutofillChangeList* changes = | 316 AutofillChangeList* changes = |
296 content::Details<AutofillChangeList>(details).ptr(); | 317 content::Details<AutofillChangeList>(details).ptr(); |
297 ActOnChanges(*changes); | 318 ActOnChanges(*changes); |
298 } | 319 } |
299 | 320 |
300 bool AutocompleteSyncableService::LoadAutofillData( | 321 bool AutocompleteSyncableService::LoadAutofillData( |
301 std::vector<AutofillEntry>* entries) const { | 322 std::vector<AutofillEntry>* entries) const { |
302 return web_data_service_->GetDatabase()-> | 323 return AutofillTable::FromWebDatabase( |
303 GetAutofillTable()->GetAllAutofillEntries(entries); | 324 web_data_service_->GetDatabase())->GetAllAutofillEntries(entries); |
304 } | 325 } |
305 | 326 |
306 bool AutocompleteSyncableService::SaveChangesToWebData( | 327 bool AutocompleteSyncableService::SaveChangesToWebData( |
307 const std::vector<AutofillEntry>& new_entries) { | 328 const std::vector<AutofillEntry>& new_entries) { |
308 DCHECK(CalledOnValidThread()); | 329 DCHECK(CalledOnValidThread()); |
309 | 330 |
310 if (!new_entries.empty() && | 331 if (!new_entries.empty() && |
311 !web_data_service_->GetDatabase()-> | 332 !AutofillTable::FromWebDatabase( |
312 GetAutofillTable()->UpdateAutofillEntries(new_entries)) { | 333 web_data_service_->GetDatabase())->UpdateAutofillEntries( |
| 334 new_entries)) { |
313 return false; | 335 return false; |
314 } | 336 } |
315 return true; | 337 return true; |
316 } | 338 } |
317 | 339 |
318 // Creates or updates an autocomplete entry based on |data|. | 340 // Creates or updates an autocomplete entry based on |data|. |
319 void AutocompleteSyncableService::CreateOrUpdateEntry( | 341 void AutocompleteSyncableService::CreateOrUpdateEntry( |
320 const syncer::SyncData& data, | 342 const syncer::SyncData& data, |
321 AutocompleteEntryMap* loaded_data, | 343 AutocompleteEntryMap* loaded_data, |
322 std::vector<AutofillEntry>* new_entries) { | 344 std::vector<AutofillEntry>* new_entries) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 autofill->set_value(UTF16ToUTF8(entry.key().value())); | 396 autofill->set_value(UTF16ToUTF8(entry.key().value())); |
375 const std::vector<base::Time>& ts(entry.timestamps()); | 397 const std::vector<base::Time>& ts(entry.timestamps()); |
376 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); | 398 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); |
377 timestamp != ts.end(); ++timestamp) { | 399 timestamp != ts.end(); ++timestamp) { |
378 autofill->add_usage_timestamp(timestamp->ToInternalValue()); | 400 autofill->add_usage_timestamp(timestamp->ToInternalValue()); |
379 } | 401 } |
380 } | 402 } |
381 | 403 |
382 syncer::SyncError AutocompleteSyncableService::AutofillEntryDelete( | 404 syncer::SyncError AutocompleteSyncableService::AutofillEntryDelete( |
383 const sync_pb::AutofillSpecifics& autofill) { | 405 const sync_pb::AutofillSpecifics& autofill) { |
384 if (!web_data_service_->GetDatabase()->GetAutofillTable()->RemoveFormElement( | 406 if (!AutofillTable::FromWebDatabase( |
385 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) { | 407 web_data_service_->GetDatabase())->RemoveFormElement( |
| 408 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) { |
386 return error_handler_->CreateAndUploadError( | 409 return error_handler_->CreateAndUploadError( |
387 FROM_HERE, | 410 FROM_HERE, |
388 "Could not remove autocomplete entry from WebDatabase."); | 411 "Could not remove autocomplete entry from WebDatabase."); |
389 } | 412 } |
390 return syncer::SyncError(); | 413 return syncer::SyncError(); |
391 } | 414 } |
392 | 415 |
393 void AutocompleteSyncableService::ActOnChanges( | 416 void AutocompleteSyncableService::ActOnChanges( |
394 const AutofillChangeList& changes) { | 417 const AutofillChangeList& changes) { |
395 DCHECK(sync_processor_.get()); | 418 DCHECK(sync_processor_.get()); |
396 syncer::SyncChangeList new_changes; | 419 syncer::SyncChangeList new_changes; |
397 for (AutofillChangeList::const_iterator change = changes.begin(); | 420 for (AutofillChangeList::const_iterator change = changes.begin(); |
398 change != changes.end(); ++change) { | 421 change != changes.end(); ++change) { |
399 switch (change->type()) { | 422 switch (change->type()) { |
400 case AutofillChange::ADD: | 423 case AutofillChange::ADD: |
401 case AutofillChange::UPDATE: { | 424 case AutofillChange::UPDATE: { |
402 std::vector<base::Time> timestamps; | 425 std::vector<base::Time> timestamps; |
403 if (!web_data_service_->GetDatabase()-> | 426 if (!AutofillTable::FromWebDatabase( |
404 GetAutofillTable()->GetAutofillTimestamps( | 427 web_data_service_->GetDatabase())->GetAutofillTimestamps( |
405 change->key().name(), | 428 change->key().name(), |
406 change->key().value(), | 429 change->key().value(), |
407 ×tamps)) { | 430 ×tamps)) { |
408 NOTREACHED(); | 431 NOTREACHED(); |
409 return; | 432 return; |
410 } | 433 } |
411 AutofillEntry entry(change->key(), timestamps); | 434 AutofillEntry entry(change->key(), timestamps); |
412 syncer::SyncChange::SyncChangeType change_type = | 435 syncer::SyncChange::SyncChangeType change_type = |
413 (change->type() == AutofillChange::ADD) ? | 436 (change->type() == AutofillChange::ADD) ? |
414 syncer::SyncChange::ACTION_ADD : | 437 syncer::SyncChange::ACTION_ADD : |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 UTF16ToUTF8(entry.key().value()))); | 478 UTF16ToUTF8(entry.key().value()))); |
456 return syncer::SyncData::CreateLocalData(tag, tag, autofill_specifics); | 479 return syncer::SyncData::CreateLocalData(tag, tag, autofill_specifics); |
457 } | 480 } |
458 | 481 |
459 // static | 482 // static |
460 std::string AutocompleteSyncableService::KeyToTag(const std::string& name, | 483 std::string AutocompleteSyncableService::KeyToTag(const std::string& name, |
461 const std::string& value) { | 484 const std::string& value) { |
462 std::string ns(kAutofillEntryNamespaceTag); | 485 std::string ns(kAutofillEntryNamespaceTag); |
463 return ns + net::EscapePath(name) + "|" + net::EscapePath(value); | 486 return ns + net::EscapePath(name) + "|" + net::EscapePath(value); |
464 } | 487 } |
OLD | NEW |