Index: chrome/browser/autofill/personal_data_manager.cc |
diff --git a/chrome/browser/autofill/personal_data_manager.cc b/chrome/browser/autofill/personal_data_manager.cc |
index 05bc8ab1f74927fbc17496e3c40674f1f0b6393e..43c06d17fb7a4d7bb27cb6cd7b2a0616101a2584 100644 |
--- a/chrome/browser/autofill/personal_data_manager.cc |
+++ b/chrome/browser/autofill/personal_data_manager.cc |
@@ -22,8 +22,8 @@ |
namespace { |
// The minimum number of fields that must contain user data and have known types |
-// before autofill will attempt to import the data into a profile. |
-const int kMinImportSize = 5; |
+// before AutoFill will attempt to import the data into a profile. |
+const int kMinImportSize = 3; |
const char kUnlabeled[] = "Unlabeled"; |
@@ -78,8 +78,8 @@ void PersonalDataManager::OnWebDataServiceRequestDone( |
void PersonalDataManager::OnAutoFillDialogApply( |
std::vector<AutoFillProfile>* profiles, |
std::vector<CreditCard>* credit_cards) { |
- // |profiles| may be NULL |
- // |credit_cards| may be NULL |
+ // |profiles| may be NULL. |
+ // |credit_cards| may be NULL. |
if (profiles) { |
CancelPendingQuery(&pending_profiles_query_); |
SetProfiles(profiles); |
@@ -205,28 +205,16 @@ bool PersonalDataManager::ImportFormData( |
if (importable_credit_card_fields == 0) |
imported_credit_card_.reset(); |
- return true; |
-} |
- |
-void PersonalDataManager::SaveImportedFormData() { |
- if (profile_->IsOffTheRecord()) |
- return; |
+ { |
+ // We're now done with the unique IDs, and SaveImportedProfile() needs the |
+ // lock, so release it. |
+ AutoUnlock unlock(unique_ids_lock_); |
- if (imported_profile_.get()) { |
- imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); |
- |
- std::vector<AutoFillProfile> profiles; |
- profiles.push_back(*imported_profile_); |
- SetProfiles(&profiles); |
+ // We always save imported profiles. |
+ SaveImportedProfile(); |
} |
- if (imported_credit_card_.get()) { |
- imported_credit_card_->set_label(ASCIIToUTF16(kUnlabeled)); |
- |
- std::vector<CreditCard> credit_cards; |
- credit_cards.push_back(*imported_credit_card_); |
- SetCreditCards(&credit_cards); |
- } |
+ return true; |
} |
void PersonalDataManager::GetImportedFormData(AutoFillProfile** profile, |
@@ -256,6 +244,7 @@ void PersonalDataManager::SetProfiles(std::vector<AutoFillProfile>* profiles) { |
return; |
AutoLock lock(unique_ids_lock_); |
+ |
// Remove the unique IDs of the new set of profiles from the unique ID set. |
for (std::vector<AutoFillProfile>::iterator iter = profiles->begin(); |
iter != profiles->end(); ++iter) { |
@@ -320,6 +309,7 @@ void PersonalDataManager::SetCreditCards( |
return; |
AutoLock lock(unique_ids_lock_); |
+ |
// Remove the unique IDs of the new set of credit cards from the unique ID |
// set. |
for (std::vector<CreditCard>::iterator iter = credit_cards->begin(); |
@@ -603,3 +593,49 @@ void PersonalDataManager::SetUniqueCreditCardLabels( |
} |
} |
} |
+ |
+void PersonalDataManager::SaveImportedProfile() { |
+ if (profile_->IsOffTheRecord()) |
+ return; |
+ |
+ if (!imported_profile_.get()) |
+ return; |
+ |
+ // Set to true if |imported_profile_| is merged into the profile list. |
+ bool merged = false; |
+ |
+ imported_profile_->set_label(ASCIIToUTF16(kUnlabeled)); |
+ |
+ // Don't save a web profile if the data in the profile is a subset of an |
+ // auxiliary profile. |
+ for (std::vector<AutoFillProfile*>::const_iterator iter = |
+ auxiliary_profiles_.begin(); |
+ iter != auxiliary_profiles_.end(); ++iter) { |
+ if (imported_profile_->IsSubsetOf(**iter)) |
+ return; |
+ } |
+ |
+ std::vector<AutoFillProfile> profiles; |
+ for (std::vector<AutoFillProfile*>::const_iterator iter = |
+ web_profiles_.begin(); |
+ iter != web_profiles_.end(); ++iter) { |
+ if (imported_profile_->IsSubsetOf(**iter)) { |
+ // In this case, the existing profile already contains all of the data |
+ // in |imported_profile|, so consider the profiles already merged. |
+ merged = true; |
+ } else if ((*iter)->IntersectionOfTypesHasEqualValues( |
+ *imported_profile_)) { |
+ // |imported_profile| contains all of the data in this profile, plus |
+ // more. |
+ merged = true; |
+ (*iter)->MergeWith(*imported_profile_); |
+ } |
+ |
+ profiles.push_back(**iter); |
+ } |
+ |
+ if (!merged) |
+ profiles.push_back(*imported_profile_); |
+ |
+ SetProfiles(&profiles); |
+} |