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/autofill/personal_data_manager.h" | 5 #include "chrome/browser/autofill/personal_data_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "chrome/browser/autofill/autofill_manager.h" | 12 #include "chrome/browser/autofill/autofill_manager.h" |
13 #include "chrome/browser/autofill/autofill_field.h" | 13 #include "chrome/browser/autofill/autofill_field.h" |
14 #include "chrome/browser/autofill/form_structure.h" | 14 #include "chrome/browser/autofill/form_structure.h" |
15 #include "chrome/browser/autofill/phone_number.h" | 15 #include "chrome/browser/autofill/phone_number.h" |
16 #include "chrome/browser/chrome_thread.h" | 16 #include "chrome/browser/chrome_thread.h" |
17 #include "chrome/browser/profile.h" | 17 #include "chrome/browser/profile.h" |
18 #include "chrome/browser/webdata/web_data_service.h" | 18 #include "chrome/browser/webdata/web_data_service.h" |
19 #include "chrome/browser/pref_service.h" | 19 #include "chrome/browser/pref_service.h" |
20 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 // The minimum number of fields that must contain user data and have known types | 24 // The minimum number of fields that must contain user data and have known types |
25 // before autofill will attempt to import the data into a profile. | 25 // before AutoFill will attempt to import the data into a profile. |
26 const int kMinImportSize = 5; | 26 const int kMinImportSize = 3; |
27 | 27 |
28 const char kUnlabeled[] = "Unlabeled"; | 28 const char kUnlabeled[] = "Unlabeled"; |
29 | 29 |
30 } // namespace | 30 } // namespace |
31 | 31 |
32 PersonalDataManager::~PersonalDataManager() { | 32 PersonalDataManager::~PersonalDataManager() { |
33 CancelPendingQuery(&pending_profiles_query_); | 33 CancelPendingQuery(&pending_profiles_query_); |
34 CancelPendingQuery(&pending_creditcards_query_); | 34 CancelPendingQuery(&pending_creditcards_query_); |
35 } | 35 } |
36 | 36 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 } | 71 } |
72 } | 72 } |
73 } | 73 } |
74 | 74 |
75 ///////////////////////////////////////////////////////////////////////////// | 75 ///////////////////////////////////////////////////////////////////////////// |
76 // PersonalDataManager, | 76 // PersonalDataManager, |
77 // views::ButtonListener implementations | 77 // views::ButtonListener implementations |
78 void PersonalDataManager::OnAutoFillDialogApply( | 78 void PersonalDataManager::OnAutoFillDialogApply( |
79 std::vector<AutoFillProfile>* profiles, | 79 std::vector<AutoFillProfile>* profiles, |
80 std::vector<CreditCard>* credit_cards) { | 80 std::vector<CreditCard>* credit_cards) { |
81 // |profiles| may be NULL | 81 // |profiles| may be NULL. |
82 // |credit_cards| may be NULL | 82 // |credit_cards| may be NULL. |
83 if (profiles) { | 83 if (profiles) { |
84 CancelPendingQuery(&pending_profiles_query_); | 84 CancelPendingQuery(&pending_profiles_query_); |
85 SetProfiles(profiles); | 85 SetProfiles(profiles); |
86 } | 86 } |
87 if (credit_cards) { | 87 if (credit_cards) { |
88 CancelPendingQuery(&pending_creditcards_query_); | 88 CancelPendingQuery(&pending_creditcards_query_); |
89 SetCreditCards(credit_cards); | 89 SetCreditCards(credit_cards); |
90 } | 90 } |
91 } | 91 } |
92 | 92 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 // importing the data. | 198 // importing the data. |
199 if (importable_fields + importable_credit_card_fields < kMinImportSize) | 199 if (importable_fields + importable_credit_card_fields < kMinImportSize) |
200 return false; | 200 return false; |
201 | 201 |
202 if (importable_fields == 0) | 202 if (importable_fields == 0) |
203 imported_profile_.reset(); | 203 imported_profile_.reset(); |
204 | 204 |
205 if (importable_credit_card_fields == 0) | 205 if (importable_credit_card_fields == 0) |
206 imported_credit_card_.reset(); | 206 imported_credit_card_.reset(); |
207 | 207 |
| 208 { |
| 209 // We're now done with the unique IDs, and SaveImportedProfile() needs the |
| 210 // lock, so release it. |
| 211 AutoUnlock unlock(unique_ids_lock_); |
| 212 |
| 213 // We always save imported profiles. |
| 214 SaveImportedProfile(); |
| 215 } |
| 216 |
208 return true; | 217 return true; |
209 } | 218 } |
210 | 219 |
211 void PersonalDataManager::SaveImportedFormData() { | |
212 if (profile_->IsOffTheRecord()) | |
213 return; | |
214 | |
215 if (imported_profile_.get()) { | |
216 imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); | |
217 | |
218 std::vector<AutoFillProfile> profiles; | |
219 profiles.push_back(*imported_profile_); | |
220 SetProfiles(&profiles); | |
221 } | |
222 | |
223 if (imported_credit_card_.get()) { | |
224 imported_credit_card_->set_label(ASCIIToUTF16(kUnlabeled)); | |
225 | |
226 std::vector<CreditCard> credit_cards; | |
227 credit_cards.push_back(*imported_credit_card_); | |
228 SetCreditCards(&credit_cards); | |
229 } | |
230 } | |
231 | |
232 void PersonalDataManager::GetImportedFormData(AutoFillProfile** profile, | 220 void PersonalDataManager::GetImportedFormData(AutoFillProfile** profile, |
233 CreditCard** credit_card) { | 221 CreditCard** credit_card) { |
234 DCHECK(profile); | 222 DCHECK(profile); |
235 DCHECK(credit_card); | 223 DCHECK(credit_card); |
236 | 224 |
237 if (imported_profile_.get()) { | 225 if (imported_profile_.get()) { |
238 imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); | 226 imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); |
239 } | 227 } |
240 *profile = imported_profile_.get(); | 228 *profile = imported_profile_.get(); |
241 | 229 |
242 if (imported_credit_card_.get()) { | 230 if (imported_credit_card_.get()) { |
243 imported_credit_card_->set_label(ASCIIToUTF16(kUnlabeled)); | 231 imported_credit_card_->set_label(ASCIIToUTF16(kUnlabeled)); |
244 } | 232 } |
245 *credit_card = imported_credit_card_.get(); | 233 *credit_card = imported_credit_card_.get(); |
246 } | 234 } |
247 | 235 |
248 void PersonalDataManager::SetProfiles(std::vector<AutoFillProfile>* profiles) { | 236 void PersonalDataManager::SetProfiles(std::vector<AutoFillProfile>* profiles) { |
249 if (profile_->IsOffTheRecord()) | 237 if (profile_->IsOffTheRecord()) |
250 return; | 238 return; |
251 | 239 |
252 SetUniqueProfileLabels(profiles); | 240 SetUniqueProfileLabels(profiles); |
253 | 241 |
254 WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS); | 242 WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS); |
255 if (!wds) | 243 if (!wds) |
256 return; | 244 return; |
257 | 245 |
258 AutoLock lock(unique_ids_lock_); | 246 AutoLock lock(unique_ids_lock_); |
| 247 |
259 // Remove the unique IDs of the new set of profiles from the unique ID set. | 248 // Remove the unique IDs of the new set of profiles from the unique ID set. |
260 for (std::vector<AutoFillProfile>::iterator iter = profiles->begin(); | 249 for (std::vector<AutoFillProfile>::iterator iter = profiles->begin(); |
261 iter != profiles->end(); ++iter) { | 250 iter != profiles->end(); ++iter) { |
262 if (iter->unique_id() != 0) | 251 if (iter->unique_id() != 0) |
263 unique_profile_ids_.erase(iter->unique_id()); | 252 unique_profile_ids_.erase(iter->unique_id()); |
264 } | 253 } |
265 | 254 |
266 // Any remaining IDs are not in the new profile list and should be removed | 255 // Any remaining IDs are not in the new profile list and should be removed |
267 // from the web database. | 256 // from the web database. |
268 for (std::set<int>::iterator iter = unique_profile_ids_.begin(); | 257 for (std::set<int>::iterator iter = unique_profile_ids_.begin(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 if (profile_->IsOffTheRecord()) | 302 if (profile_->IsOffTheRecord()) |
314 return; | 303 return; |
315 | 304 |
316 SetUniqueCreditCardLabels(credit_cards); | 305 SetUniqueCreditCardLabels(credit_cards); |
317 | 306 |
318 WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS); | 307 WebDataService* wds = profile_->GetWebDataService(Profile::EXPLICIT_ACCESS); |
319 if (!wds) | 308 if (!wds) |
320 return; | 309 return; |
321 | 310 |
322 AutoLock lock(unique_ids_lock_); | 311 AutoLock lock(unique_ids_lock_); |
| 312 |
323 // Remove the unique IDs of the new set of credit cards from the unique ID | 313 // Remove the unique IDs of the new set of credit cards from the unique ID |
324 // set. | 314 // set. |
325 for (std::vector<CreditCard>::iterator iter = credit_cards->begin(); | 315 for (std::vector<CreditCard>::iterator iter = credit_cards->begin(); |
326 iter != credit_cards->end(); ++iter) { | 316 iter != credit_cards->end(); ++iter) { |
327 if (iter->unique_id() != 0) | 317 if (iter->unique_id() != 0) |
328 unique_creditcard_ids_.erase(iter->unique_id()); | 318 unique_creditcard_ids_.erase(iter->unique_id()); |
329 } | 319 } |
330 | 320 |
331 // Any remaining IDs are not in the new credit card list and should be removed | 321 // Any remaining IDs are not in the new credit card list and should be removed |
332 // from the web database. | 322 // from the web database. |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 // Start at the second element because the first label should not be | 586 // Start at the second element because the first label should not be |
597 // renamed. The appended label number starts at 2, because the first label | 587 // renamed. The appended label number starts at 2, because the first label |
598 // has an implicit index of 1. | 588 // has an implicit index of 1. |
599 for (size_t i = 1; i < iter->second.size(); ++i) { | 589 for (size_t i = 1; i < iter->second.size(); ++i) { |
600 string16 newlabel = iter->second[i]->Label() + | 590 string16 newlabel = iter->second[i]->Label() + |
601 UintToString16(static_cast<unsigned int>(i + 1)); | 591 UintToString16(static_cast<unsigned int>(i + 1)); |
602 iter->second[i]->set_label(newlabel); | 592 iter->second[i]->set_label(newlabel); |
603 } | 593 } |
604 } | 594 } |
605 } | 595 } |
| 596 |
| 597 void PersonalDataManager::SaveImportedProfile() { |
| 598 if (profile_->IsOffTheRecord()) |
| 599 return; |
| 600 |
| 601 if (!imported_profile_.get()) |
| 602 return; |
| 603 |
| 604 // Set to true if |imported_profile_| is merged into the profile list. |
| 605 bool merged = false; |
| 606 |
| 607 imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); |
| 608 |
| 609 // Don't save a web profile if the data in the profile is a subset of an |
| 610 // auxiliary profile. |
| 611 for (std::vector<AutoFillProfile*>::const_iterator iter = |
| 612 auxiliary_profiles_.begin(); |
| 613 iter != auxiliary_profiles_.end(); ++iter) { |
| 614 if (imported_profile_->IsSubsetOf(**iter)) |
| 615 return; |
| 616 } |
| 617 |
| 618 std::vector<AutoFillProfile> profiles; |
| 619 for (std::vector<AutoFillProfile*>::const_iterator iter = |
| 620 web_profiles_.begin(); |
| 621 iter != web_profiles_.end(); ++iter) { |
| 622 if (imported_profile_->IsSubsetOf(**iter)) { |
| 623 // In this case, the existing profile already contains all of the data |
| 624 // in |imported_profile|, so consider the profiles already merged. |
| 625 merged = true; |
| 626 } else if ((*iter)->IntersectionOfTypesHasEqualValues( |
| 627 *imported_profile_)) { |
| 628 // |imported_profile| contains all of the data in this profile, plus |
| 629 // more. |
| 630 merged = true; |
| 631 (*iter)->MergeWith(*imported_profile_); |
| 632 } |
| 633 |
| 634 profiles.push_back(**iter); |
| 635 } |
| 636 |
| 637 if (!merged) |
| 638 profiles.push_back(*imported_profile_); |
| 639 |
| 640 SetProfiles(&profiles); |
| 641 } |
OLD | NEW |