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

Side by Side Diff: chrome/browser/sync/glue/autofill_model_associator.cc

Issue 5159001: Rest of the autofill work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Diff against the first part of the review. Created 10 years, 1 month 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) 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_model_associator.h" 5 #include "chrome/browser/sync/glue/autofill_model_associator.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/task.h" 9 #include "base/task.h"
10 #include "base/time.h" 10 #include "base/time.h"
11 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/autofill/autofill_profile.h" 13 #include "chrome/browser/autofill/autofill_profile.h"
14 #include "chrome/browser/browser_thread.h" 14 #include "chrome/browser/browser_thread.h"
15 #include "chrome/browser/guid.h" 15 #include "chrome/browser/guid.h"
16 #include "chrome/browser/prefs/pref_service.h"
16 #include "chrome/browser/profile.h" 17 #include "chrome/browser/profile.h"
17 #include "chrome/browser/sync/engine/syncapi.h" 18 #include "chrome/browser/sync/engine/syncapi.h"
18 #include "chrome/browser/sync/glue/autofill_change_processor.h" 19 #include "chrome/browser/sync/glue/autofill_change_processor.h"
20 #include "chrome/browser/sync/glue/autofill_profile_model_associator.h"
21 #include "chrome/browser/sync/glue/do_optimistic_refresh_Task.h"
19 #include "chrome/browser/sync/profile_sync_service.h" 22 #include "chrome/browser/sync/profile_sync_service.h"
20 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" 23 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
21 #include "chrome/browser/webdata/web_database.h" 24 #include "chrome/browser/webdata/web_database.h"
25 #include "chrome/common/pref_names.h"
22 #include "net/base/escape.h" 26 #include "net/base/escape.h"
23 27
24 using base::TimeTicks; 28 using base::TimeTicks;
25 29
26 namespace browser_sync { 30 namespace browser_sync {
27 31
28 const char kAutofillTag[] = "google_chrome_autofill"; 32 const char kAutofillTag[] = "google_chrome_autofill";
29 const char kAutofillEntryNamespaceTag[] = "autofill_entry|"; 33 const char kAutofillEntryNamespaceTag[] = "autofill_entry|";
30 34
31 struct AutofillModelAssociator::DataBundle { 35 struct AutofillModelAssociator::DataBundle {
32 std::set<AutofillKey> current_entries; 36 std::set<AutofillKey> current_entries;
33 std::vector<AutofillEntry> new_entries; 37 std::vector<AutofillEntry> new_entries;
34 std::set<string16> current_profiles; 38 std::set<string16> current_profiles;
35 std::vector<AutoFillProfile*> updated_profiles; 39 std::vector<AutoFillProfile*> updated_profiles;
36 std::vector<AutoFillProfile*> new_profiles; // We own these pointers. 40 std::vector<AutoFillProfile*> new_profiles; // We own these pointers.
37 ~DataBundle() { STLDeleteElements(&new_profiles); } 41 ~DataBundle() { STLDeleteElements(&new_profiles); }
38 }; 42 };
39 43
40 AutofillModelAssociator::DoOptimisticRefreshTask::DoOptimisticRefreshTask(
41 PersonalDataManager* pdm) : pdm_(pdm) {}
42
43 AutofillModelAssociator::DoOptimisticRefreshTask::~DoOptimisticRefreshTask() {}
44
45 void AutofillModelAssociator::DoOptimisticRefreshTask::Run() {
46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
47 pdm_->Refresh();
48 }
49
50 AutofillModelAssociator::AutofillModelAssociator( 44 AutofillModelAssociator::AutofillModelAssociator(
51 ProfileSyncService* sync_service, 45 ProfileSyncService* sync_service,
52 WebDatabase* web_database, 46 WebDatabase* web_database,
53 PersonalDataManager* personal_data) 47 PersonalDataManager* personal_data)
54 : sync_service_(sync_service), 48 : sync_service_(sync_service),
55 web_database_(web_database), 49 web_database_(web_database),
56 personal_data_(personal_data), 50 personal_data_(personal_data),
57 autofill_node_id_(sync_api::kInvalidId), 51 autofill_node_id_(sync_api::kInvalidId),
58 abort_association_pending_(false) { 52 abort_association_pending_(false) {
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 53 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 node.SetTitle(UTF8ToWide(tag)); 108 node.SetTitle(UTF8ToWide(tag));
115 AutofillChangeProcessor::WriteAutofillEntry(*ix, &node); 109 AutofillChangeProcessor::WriteAutofillEntry(*ix, &node);
116 Associate(&tag, node.GetId()); 110 Associate(&tag, node.GetId());
117 } 111 }
118 112
119 current_entries->insert(ix->key()); 113 current_entries->insert(ix->key());
120 } 114 }
121 return true; 115 return true;
122 } 116 }
123 117
124 bool AutofillModelAssociator::MakeNewAutofillProfileSyncNode(
125 sync_api::WriteTransaction* trans, const sync_api::BaseNode& autofill_root,
126 const std::string& tag, const AutoFillProfile& profile, int64* sync_id) {
127 sync_api::WriteNode node(trans);
128 if (!node.InitUniqueByCreation(syncable::AUTOFILL, autofill_root, tag)) {
129 LOG(ERROR) << "Failed to create autofill sync node.";
130 return false;
131 }
132 node.SetTitle(UTF8ToWide(tag));
133 AutofillChangeProcessor::WriteAutofillProfile(profile, &node);
134 *sync_id = node.GetId();
135 return true;
136 }
137
138
139 bool AutofillModelAssociator::LoadAutofillData( 118 bool AutofillModelAssociator::LoadAutofillData(
140 std::vector<AutofillEntry>* entries, 119 std::vector<AutofillEntry>* entries,
141 std::vector<AutoFillProfile*>* profiles) { 120 std::vector<AutoFillProfile*>* profiles) {
142 if (IsAbortPending()) 121 if (IsAbortPending())
143 return false; 122 return false;
144 if (!web_database_->GetAllAutofillEntries(entries)) 123 if (!web_database_->GetAllAutofillEntries(entries))
145 return false; 124 return false;
146 125
147 if (IsAbortPending()) 126 if (IsAbortPending())
148 return false; 127 return false;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 if (!sync_child.InitByIdLookup(sync_child_id)) { 229 if (!sync_child.InitByIdLookup(sync_child_id)) {
251 LOG(ERROR) << "Failed to fetch child node."; 230 LOG(ERROR) << "Failed to fetch child node.";
252 return false; 231 return false;
253 } 232 }
254 const sync_pb::AutofillSpecifics& autofill( 233 const sync_pb::AutofillSpecifics& autofill(
255 sync_child.GetAutofillSpecifics()); 234 sync_child.GetAutofillSpecifics());
256 235
257 if (autofill.has_value()) 236 if (autofill.has_value())
258 AddNativeEntryIfNeeded(autofill, bundle, sync_child); 237 AddNativeEntryIfNeeded(autofill, bundle, sync_child);
259 // Ignore autofill profiles if we are not upgrading. 238 // Ignore autofill profiles if we are not upgrading.
260 else if (autofill.has_profile() && IsUpgrading()) { 239 else if (autofill.has_profile() && IsUpgrading(write_trans)) {
261 AddNativeProfileIfNeeded( 240 AddNativeProfileIfNeeded(
262 autofill.profile(), 241 autofill.profile(),
263 bundle, 242 bundle,
264 sync_child, 243 sync_child,
265 all_profiles_from_db); 244 all_profiles_from_db);
266 } else { 245 } else {
267 NOTREACHED() << "AutofillSpecifics has no autofill data!"; 246 NOTREACHED() << "AutofillSpecifics has no autofill data!";
268 } 247 }
269 248
270 sync_child_id = sync_child.GetSuccessorId(); 249 sync_child_id = sync_child.GetSuccessorId();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 } 315 }
337 316
338 void AutofillModelAssociator::AddNativeProfileIfNeeded( 317 void AutofillModelAssociator::AddNativeProfileIfNeeded(
339 const sync_pb::AutofillProfileSpecifics& profile, 318 const sync_pb::AutofillProfileSpecifics& profile,
340 DataBundle* bundle, 319 DataBundle* bundle,
341 const sync_api::ReadNode& node, 320 const sync_api::ReadNode& node,
342 std::vector<AutoFillProfile*>& all_profiles_from_db) { 321 std::vector<AutoFillProfile*>& all_profiles_from_db) {
343 322
344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 323 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
345 324
346 scoped_ptr<AutoFillProfile> profile_in_web_db(FindCorrespondingNodeFromWebDB( 325 AutoFillProfile* profile_in_web_db = FindCorrespondingNodeFromWebDB(
347 profile, all_profiles_from_db)); 326 profile, all_profiles_from_db);
348 327
349 if (profile_in_web_db.get() != NULL) { 328 if (profile_in_web_db != NULL) {
350 int64 sync_id = node.GetId(); 329 int64 sync_id = node.GetId();
351 Associate(&(profile_in_web_db->guid()), sync_id); 330 Associate(&(profile_in_web_db->guid()), sync_id);
352 return; 331 return;
353 } else { // Create a new node. 332 } else { // Create a new node.
354 std::string guid = guid::GenerateGUID(); 333 std::string guid = guid::GenerateGUID();
355 Associate(&guid, node.GetId()); 334 Associate(&guid, node.GetId());
356 AutoFillProfile* p = new AutoFillProfile(guid); 335 AutoFillProfile* p = new AutoFillProfile(guid);
357 OverwriteProfileWithServerData(p, profile); 336 OverwriteProfileWithServerData(p, profile);
358 bundle->new_profiles.push_back(p); 337 bundle->new_profiles.push_back(p);
359 } 338 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff; 492 diff = MergeField(p, ADDRESS_HOME_ZIP, s.address_home_zip()) || diff;
514 diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff; 493 diff = MergeField(p, EMAIL_ADDRESS, s.email_address()) || diff;
515 diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff; 494 diff = MergeField(p, COMPANY_NAME, s.company_name()) || diff;
516 diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number()) 495 diff = MergeField(p, PHONE_FAX_WHOLE_NUMBER, s.phone_fax_whole_number())
517 || diff; 496 || diff;
518 diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number()) 497 diff = MergeField(p, PHONE_HOME_WHOLE_NUMBER, s.phone_home_whole_number())
519 || diff; 498 || diff;
520 return diff; 499 return diff;
521 } 500 }
522 501
523 bool AutofillModelAssociator::IsUpgrading() 502 bool AutofillModelAssociator::IsUpgrading(sync_api::WriteTransaction* trans) {
524 { 503
lipalani 2010/12/08 21:37:46 call the fn in model associator.
525 return true; 504 sync_api::ReadNode node(trans);
505
506 return !node.InitByClientTagLookup(syncable::AUTOFILL_PROFILE,
507 kAutofillProfileTag);
526 } 508 }
527 509
528 } // namespace browser_sync 510 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698