Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Side by Side Diff: chrome/browser/webdata/autocomplete_syncable_service.cc

Issue 14081043: Hook up Autofill Backend interface to SyncableServices (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "components/autofill/browser/webdata/autofill_backend_delegate.h"
10 #include "components/autofill/browser/webdata/autofill_table.h" 11 #include "components/autofill/browser/webdata/autofill_table.h"
11 #include "components/autofill/browser/webdata/autofill_webdata_service.h" 12 #include "components/autofill/browser/webdata/autofill_webdata_service.h"
12 #include "components/webdata/common/web_database.h" 13 #include "components/webdata/common/web_database.h"
13 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
14 #include "net/base/escape.h" 15 #include "net/base/escape.h"
15 #include "sync/api/sync_error.h" 16 #include "sync/api/sync_error.h"
16 #include "sync/api/sync_error_factory.h" 17 #include "sync/api/sync_error_factory.h"
17 #include "sync/protocol/autofill_specifics.pb.h" 18 #include "sync/protocol/autofill_specifics.pb.h"
18 #include "sync/protocol/sync.pb.h" 19 #include "sync/protocol/sync.pb.h"
19 20
20 using autofill::AutofillChange; 21 using autofill::AutofillChange;
21 using autofill::AutofillChangeList; 22 using autofill::AutofillChangeList;
22 using autofill::AutofillEntry; 23 using autofill::AutofillEntry;
23 using autofill::AutofillKey; 24 using autofill::AutofillKey;
24 using autofill::AutofillTable; 25 using autofill::AutofillTable;
25 using autofill::AutofillWebDataService; 26 using autofill::AutofillWebDataService;
27 using autofill::AutofillBackendDelegate;
26 using content::BrowserThread; 28 using content::BrowserThread;
27 29
28 namespace { 30 namespace {
29 31
30 const char kAutofillEntryNamespaceTag[] = "autofill_entry|"; 32 const char kAutofillEntryNamespaceTag[] = "autofill_entry|";
31 33
32 // Merges timestamps from the |autofill| entry and |timestamps|. Returns 34 // Merges timestamps from the |autofill| entry and |timestamps|. Returns
33 // true if they were different, false if they were the same. 35 // true if they were different, false if they were the same.
34 // All of the timestamp vectors are assummed to be sorted, resulting vector is 36 // All of the timestamp vectors are assummed to be sorted, resulting vector is
35 // sorted as well. Only two timestamps - the earliest and the latest are stored. 37 // sorted as well. Only two timestamps - the earliest and the latest are stored.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 void* UserDataKey() { 87 void* UserDataKey() {
86 // Use the address of a static that COMDAT folding won't ever fold 88 // Use the address of a static that COMDAT folding won't ever fold
87 // with something else. 89 // with something else.
88 static int user_data_key = 0; 90 static int user_data_key = 0;
89 return reinterpret_cast<void*>(&user_data_key); 91 return reinterpret_cast<void*>(&user_data_key);
90 } 92 }
91 93
92 } // namespace 94 } // namespace
93 95
94 AutocompleteSyncableService::AutocompleteSyncableService( 96 AutocompleteSyncableService::AutocompleteSyncableService(
97 AutofillBackendDelegate* web_data_delegate,
95 AutofillWebDataService* web_data_service) 98 AutofillWebDataService* web_data_service)
96 : web_data_service_(web_data_service), 99 : web_data_delegate_(web_data_delegate),
100 web_data_service_(web_data_service),
97 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_observer_(this)), 101 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_observer_(this)),
98 cull_expired_entries_(false) { 102 cull_expired_entries_(false) {
99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
100 DCHECK(web_data_service_); 104 DCHECK(web_data_delegate_);
101 105
102 scoped_observer_.Add(web_data_service_); 106 scoped_observer_.Add(web_data_delegate_);
103 } 107 }
104 108
105 AutocompleteSyncableService::~AutocompleteSyncableService() { 109 AutocompleteSyncableService::~AutocompleteSyncableService() {
106 DCHECK(CalledOnValidThread()); 110 DCHECK(CalledOnValidThread());
107 } 111 }
108 112
109 // static 113 // static
110 void AutocompleteSyncableService::CreateForWebDataService( 114 void AutocompleteSyncableService::CreateForWebDataService(
111 AutofillWebDataService* web_data_service) { 115 AutofillWebDataService* web_data_service,
116 AutofillBackendDelegate* delegate) {
112 web_data_service->GetDBUserData()->SetUserData( 117 web_data_service->GetDBUserData()->SetUserData(
113 UserDataKey(), new AutocompleteSyncableService(web_data_service)); 118 UserDataKey(),
119 new AutocompleteSyncableService(delegate, web_data_service));
114 } 120 }
115 121
116 // static 122 // static
117 AutocompleteSyncableService* AutocompleteSyncableService::FromWebDataService( 123 AutocompleteSyncableService* AutocompleteSyncableService::FromWebDataService(
118 AutofillWebDataService* web_data_service) { 124 AutofillWebDataService* web_data_service) {
119 return static_cast<AutocompleteSyncableService*>( 125 return static_cast<AutocompleteSyncableService*>(
120 web_data_service->GetDBUserData()->GetUserData(UserDataKey())); 126 web_data_service->GetDBUserData()->GetUserData(UserDataKey()));
121 } 127 }
122 128
123 AutocompleteSyncableService::AutocompleteSyncableService() 129 AutocompleteSyncableService::AutocompleteSyncableService()
124 : web_data_service_(NULL), 130 : web_data_delegate_(NULL),
125 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_observer_(this)), 131 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_observer_(this)),
126 cull_expired_entries_(false) { 132 cull_expired_entries_(false) {
127 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
128 } 134 }
129 135
130 syncer::SyncMergeResult AutocompleteSyncableService::MergeDataAndStartSyncing( 136 syncer::SyncMergeResult AutocompleteSyncableService::MergeDataAndStartSyncing(
131 syncer::ModelType type, 137 syncer::ModelType type,
132 const syncer::SyncDataList& initial_sync_data, 138 const syncer::SyncDataList& initial_sync_data,
133 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, 139 scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
134 scoped_ptr<syncer::SyncErrorFactory> error_handler) { 140 scoped_ptr<syncer::SyncErrorFactory> error_handler) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 CreateOrUpdateEntry(*sync_iter, &new_db_entries, &new_synced_entries); 173 CreateOrUpdateEntry(*sync_iter, &new_db_entries, &new_synced_entries);
168 } 174 }
169 175
170 if (!SaveChangesToWebData(new_synced_entries)) { 176 if (!SaveChangesToWebData(new_synced_entries)) {
171 merge_result.set_error(error_handler_->CreateAndUploadError( 177 merge_result.set_error(error_handler_->CreateAndUploadError(
172 FROM_HERE, 178 FROM_HERE,
173 "Failed to update webdata.")); 179 "Failed to update webdata."));
174 return merge_result; 180 return merge_result;
175 } 181 }
176 182
177 AutofillWebDataService::NotifyOfMultipleAutofillChanges(web_data_service_); 183 if (web_data_delegate_)
184 web_data_delegate_->NotifyOfMultipleAutofillChanges(web_data_service_);
178 185
179 syncer::SyncChangeList new_changes; 186 syncer::SyncChangeList new_changes;
180 for (AutocompleteEntryMap::iterator i = new_db_entries.begin(); 187 for (AutocompleteEntryMap::iterator i = new_db_entries.begin();
181 i != new_db_entries.end(); ++i) { 188 i != new_db_entries.end(); ++i) {
182 new_changes.push_back( 189 new_changes.push_back(
183 syncer::SyncChange(FROM_HERE, 190 syncer::SyncChange(FROM_HERE,
184 i->second.first, 191 i->second.first,
185 CreateSyncData(*(i->second.second)))); 192 CreateSyncData(*(i->second.second))));
186 } 193 }
187 194
188 if (cull_expired_entries_) { 195 if (cull_expired_entries_) {
189 // This will schedule a deletion operation on the DB thread, which will 196 // This will schedule a deletion operation on the DB thread, which will
190 // trigger a notification to propagate the deletion to Sync. 197 // trigger a notification to propagate the deletion to Sync.
191 web_data_service_->RemoveExpiredFormElements(); 198 web_data_delegate_->RemoveExpiredFormElements();
192 } 199 }
193 200
194 merge_result.set_error( 201 merge_result.set_error(
195 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes)); 202 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes));
196 return merge_result; 203 return merge_result;
197 } 204 }
198 205
199 void AutocompleteSyncableService::StopSyncing(syncer::ModelType type) { 206 void AutocompleteSyncableService::StopSyncing(syncer::ModelType type) {
200 DCHECK(CalledOnValidThread()); 207 DCHECK(CalledOnValidThread());
201 DCHECK_EQ(syncer::AUTOFILL, type); 208 DCHECK_EQ(syncer::AUTOFILL, type);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 syncer::SyncChange::ChangeTypeToString(i->change_type())); 291 syncer::SyncChange::ChangeTypeToString(i->change_type()));
285 } 292 }
286 } 293 }
287 294
288 if (!SaveChangesToWebData(new_entries)) { 295 if (!SaveChangesToWebData(new_entries)) {
289 return error_handler_->CreateAndUploadError( 296 return error_handler_->CreateAndUploadError(
290 FROM_HERE, 297 FROM_HERE,
291 "Failed to update webdata."); 298 "Failed to update webdata.");
292 } 299 }
293 300
294 AutofillWebDataService::NotifyOfMultipleAutofillChanges(web_data_service_); 301 if (web_data_delegate_)
302 web_data_delegate_->NotifyOfMultipleAutofillChanges(web_data_service_);
295 303
296 if (cull_expired_entries_) { 304 if (cull_expired_entries_) {
297 // This will schedule a deletion operation on the DB thread, which will 305 // This will schedule a deletion operation on the DB thread, which will
298 // trigger a notification to propagate the deletion to Sync. 306 // trigger a notification to propagate the deletion to Sync.
299 web_data_service_->RemoveExpiredFormElements(); 307 web_data_delegate_->RemoveExpiredFormElements();
300 } 308 }
301 309
302 return list_processing_error; 310 return list_processing_error;
303 } 311 }
304 312
305 void AutocompleteSyncableService::AutofillEntriesChanged( 313 void AutocompleteSyncableService::AutofillEntriesChanged(
306 const AutofillChangeList& changes) { 314 const AutofillChangeList& changes) {
307 // Check if sync is on. If we receive notification prior to the sync being set 315 // Check if sync is on. If we receive notification prior to the sync being set
308 // up we are going to process all when MergeData..() is called. If we receive 316 // up we are going to process all when MergeData..() is called. If we receive
309 // notification after the sync exited, it will be sinced next time Chrome 317 // notification after the sync exited, it will be sinced next time Chrome
310 // starts. 318 // starts.
311 if (sync_processor_.get()) 319 if (sync_processor_.get())
312 ActOnChanges(changes); 320 ActOnChanges(changes);
313 } 321 }
314 322
315 bool AutocompleteSyncableService::LoadAutofillData( 323 bool AutocompleteSyncableService::LoadAutofillData(
316 std::vector<AutofillEntry>* entries) const { 324 std::vector<AutofillEntry>* entries) const {
317 return AutofillTable::FromWebDatabase( 325 return AutofillTable::FromWebDatabase(
318 web_data_service_->GetDatabase())->GetAllAutofillEntries(entries); 326 web_data_delegate_->GetDatabase())->GetAllAutofillEntries(entries);
319 } 327 }
320 328
321 bool AutocompleteSyncableService::SaveChangesToWebData( 329 bool AutocompleteSyncableService::SaveChangesToWebData(
322 const std::vector<AutofillEntry>& new_entries) { 330 const std::vector<AutofillEntry>& new_entries) {
323 DCHECK(CalledOnValidThread()); 331 DCHECK(CalledOnValidThread());
324 332
325 if (!new_entries.empty() && 333 if (!new_entries.empty() &&
326 !AutofillTable::FromWebDatabase( 334 !AutofillTable::FromWebDatabase(
327 web_data_service_->GetDatabase())->UpdateAutofillEntries( 335 web_data_delegate_->GetDatabase())->UpdateAutofillEntries(
328 new_entries)) { 336 new_entries)) {
329 return false; 337 return false;
330 } 338 }
331 return true; 339 return true;
332 } 340 }
333 341
334 // Creates or updates an autocomplete entry based on |data|. 342 // Creates or updates an autocomplete entry based on |data|.
335 void AutocompleteSyncableService::CreateOrUpdateEntry( 343 void AutocompleteSyncableService::CreateOrUpdateEntry(
336 const syncer::SyncData& data, 344 const syncer::SyncData& data,
337 AutocompleteEntryMap* loaded_data, 345 AutocompleteEntryMap* loaded_data,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 const std::vector<base::Time>& ts(entry.timestamps()); 399 const std::vector<base::Time>& ts(entry.timestamps());
392 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); 400 for (std::vector<base::Time>::const_iterator timestamp = ts.begin();
393 timestamp != ts.end(); ++timestamp) { 401 timestamp != ts.end(); ++timestamp) {
394 autofill->add_usage_timestamp(timestamp->ToInternalValue()); 402 autofill->add_usage_timestamp(timestamp->ToInternalValue());
395 } 403 }
396 } 404 }
397 405
398 syncer::SyncError AutocompleteSyncableService::AutofillEntryDelete( 406 syncer::SyncError AutocompleteSyncableService::AutofillEntryDelete(
399 const sync_pb::AutofillSpecifics& autofill) { 407 const sync_pb::AutofillSpecifics& autofill) {
400 if (!AutofillTable::FromWebDatabase( 408 if (!AutofillTable::FromWebDatabase(
401 web_data_service_->GetDatabase())->RemoveFormElement( 409 web_data_delegate_->GetDatabase())->RemoveFormElement(
402 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) { 410 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) {
403 return error_handler_->CreateAndUploadError( 411 return error_handler_->CreateAndUploadError(
404 FROM_HERE, 412 FROM_HERE,
405 "Could not remove autocomplete entry from WebDatabase."); 413 "Could not remove autocomplete entry from WebDatabase.");
406 } 414 }
407 return syncer::SyncError(); 415 return syncer::SyncError();
408 } 416 }
409 417
410 void AutocompleteSyncableService::ActOnChanges( 418 void AutocompleteSyncableService::ActOnChanges(
411 const AutofillChangeList& changes) { 419 const AutofillChangeList& changes) {
412 DCHECK(sync_processor_.get()); 420 DCHECK(sync_processor_.get());
413 syncer::SyncChangeList new_changes; 421 syncer::SyncChangeList new_changes;
414 for (AutofillChangeList::const_iterator change = changes.begin(); 422 for (AutofillChangeList::const_iterator change = changes.begin();
415 change != changes.end(); ++change) { 423 change != changes.end(); ++change) {
416 switch (change->type()) { 424 switch (change->type()) {
417 case AutofillChange::ADD: 425 case AutofillChange::ADD:
418 case AutofillChange::UPDATE: { 426 case AutofillChange::UPDATE: {
419 std::vector<base::Time> timestamps; 427 std::vector<base::Time> timestamps;
420 if (!AutofillTable::FromWebDatabase( 428 if (!AutofillTable::FromWebDatabase(
421 web_data_service_->GetDatabase())->GetAutofillTimestamps( 429 web_data_delegate_->GetDatabase())->GetAutofillTimestamps(
422 change->key().name(), 430 change->key().name(),
423 change->key().value(), 431 change->key().value(),
424 &timestamps)) { 432 &timestamps)) {
425 NOTREACHED(); 433 NOTREACHED();
426 return; 434 return;
427 } 435 }
428 AutofillEntry entry(change->key(), timestamps); 436 AutofillEntry entry(change->key(), timestamps);
429 syncer::SyncChange::SyncChangeType change_type = 437 syncer::SyncChange::SyncChangeType change_type =
430 (change->type() == AutofillChange::ADD) ? 438 (change->type() == AutofillChange::ADD) ?
431 syncer::SyncChange::ACTION_ADD : 439 syncer::SyncChange::ACTION_ADD :
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 UTF16ToUTF8(entry.key().value()))); 480 UTF16ToUTF8(entry.key().value())));
473 return syncer::SyncData::CreateLocalData(tag, tag, autofill_specifics); 481 return syncer::SyncData::CreateLocalData(tag, tag, autofill_specifics);
474 } 482 }
475 483
476 // static 484 // static
477 std::string AutocompleteSyncableService::KeyToTag(const std::string& name, 485 std::string AutocompleteSyncableService::KeyToTag(const std::string& name,
478 const std::string& value) { 486 const std::string& value) {
479 std::string ns(kAutofillEntryNamespaceTag); 487 std::string ns(kAutofillEntryNamespaceTag);
480 return ns + net::EscapePath(name) + "|" + net::EscapePath(value); 488 return ns + net::EscapePath(name) + "|" + net::EscapePath(value);
481 } 489 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698