| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/autofill/core/browser/autofill_profile.h" | 5 #include "components/autofill/core/browser/autofill_profile.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <ostream> | 10 #include <ostream> |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 return false; | 309 return false; |
| 310 | 310 |
| 311 return | 311 return |
| 312 form_group->SetInfo(type, CollapseWhitespace(value, false), app_locale); | 312 form_group->SetInfo(type, CollapseWhitespace(value, false), app_locale); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void AutofillProfile::SetRawMultiInfo( | 315 void AutofillProfile::SetRawMultiInfo( |
| 316 AutofillFieldType type, | 316 AutofillFieldType type, |
| 317 const std::vector<base::string16>& values) { | 317 const std::vector<base::string16>& values) { |
| 318 switch (AutofillType(type).group()) { | 318 switch (AutofillType(type).group()) { |
| 319 case AutofillType::NAME: | 319 case NAME: |
| 320 case AutofillType::NAME_BILLING: | 320 case NAME_BILLING: |
| 321 CopyValuesToItems(type, values, &name_, NameInfo()); | 321 CopyValuesToItems(type, values, &name_, NameInfo()); |
| 322 break; | 322 break; |
| 323 case AutofillType::EMAIL: | 323 case EMAIL: |
| 324 CopyValuesToItems(type, values, &email_, EmailInfo()); | 324 CopyValuesToItems(type, values, &email_, EmailInfo()); |
| 325 break; | 325 break; |
| 326 case AutofillType::PHONE_HOME: | 326 case PHONE_HOME: |
| 327 case AutofillType::PHONE_BILLING: | 327 case PHONE_BILLING: |
| 328 CopyValuesToItems(type, | 328 CopyValuesToItems(type, |
| 329 values, | 329 values, |
| 330 &phone_number_, | 330 &phone_number_, |
| 331 PhoneNumber(this)); | 331 PhoneNumber(this)); |
| 332 break; | 332 break; |
| 333 default: | 333 default: |
| 334 if (values.size() == 1) { | 334 if (values.size() == 1) { |
| 335 SetRawInfo(type, values[0]); | 335 SetRawInfo(type, values[0]); |
| 336 } else if (values.size() == 0) { | 336 } else if (values.size() == 0) { |
| 337 SetRawInfo(type, base::string16()); | 337 SetRawInfo(type, base::string16()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 353 const std::string& app_locale, | 353 const std::string& app_locale, |
| 354 std::vector<base::string16>* values) const { | 354 std::vector<base::string16>* values) const { |
| 355 GetMultiInfoImpl(type, app_locale, values); | 355 GetMultiInfoImpl(type, app_locale, values); |
| 356 } | 356 } |
| 357 | 357 |
| 358 void AutofillProfile::FillFormField(const AutofillField& field, | 358 void AutofillProfile::FillFormField(const AutofillField& field, |
| 359 size_t variant, | 359 size_t variant, |
| 360 const std::string& app_locale, | 360 const std::string& app_locale, |
| 361 FormFieldData* field_data) const { | 361 FormFieldData* field_data) const { |
| 362 AutofillFieldType type = field.type(); | 362 AutofillFieldType type = field.type(); |
| 363 DCHECK_NE(AutofillType::CREDIT_CARD, AutofillType(type).group()); | 363 DCHECK_NE(CREDIT_CARD, AutofillType(type).group()); |
| 364 DCHECK(field_data); | 364 DCHECK(field_data); |
| 365 | 365 |
| 366 if (type == PHONE_HOME_NUMBER || type == PHONE_BILLING_NUMBER) { | 366 if (type == PHONE_HOME_NUMBER || type == PHONE_BILLING_NUMBER) { |
| 367 FillPhoneNumberField(field, variant, app_locale, field_data); | 367 FillPhoneNumberField(field, variant, app_locale, field_data); |
| 368 } else if (field_data->form_control_type == "select-one") { | 368 } else if (field_data->form_control_type == "select-one") { |
| 369 FillSelectControl(type, app_locale, field_data); | 369 FillSelectControl(type, app_locale, field_data); |
| 370 } else { | 370 } else { |
| 371 std::vector<base::string16> values; | 371 std::vector<base::string16> values; |
| 372 GetMultiInfo(type, app_locale, &values); | 372 GetMultiInfo(type, app_locale, &values); |
| 373 if (variant >= values.size()) { | 373 if (variant >= values.size()) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 GetNonEmptyTypes(app_locale, &types); | 507 GetNonEmptyTypes(app_locale, &types); |
| 508 | 508 |
| 509 for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end(); | 509 for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end(); |
| 510 ++iter) { | 510 ++iter) { |
| 511 if (*iter == NAME_FULL) { | 511 if (*iter == NAME_FULL) { |
| 512 // Ignore the compound "full name" field type. We are only interested in | 512 // Ignore the compound "full name" field type. We are only interested in |
| 513 // comparing the constituent parts. For example, if |this| has a middle | 513 // comparing the constituent parts. For example, if |this| has a middle |
| 514 // name saved, but |profile| lacks one, |profile| could still be a subset | 514 // name saved, but |profile| lacks one, |profile| could still be a subset |
| 515 // of |this|. | 515 // of |this|. |
| 516 continue; | 516 continue; |
| 517 } else if (AutofillType(*iter).group() == AutofillType::PHONE_HOME) { | 517 } else if (AutofillType(*iter).group() == PHONE_HOME) { |
| 518 // Phone numbers should be canonicalized prior to being compared. | 518 // Phone numbers should be canonicalized prior to being compared. |
| 519 if (*iter != PHONE_HOME_WHOLE_NUMBER) { | 519 if (*iter != PHONE_HOME_WHOLE_NUMBER) { |
| 520 continue; | 520 continue; |
| 521 } else if (!i18n::PhoneNumbersMatch( | 521 } else if (!i18n::PhoneNumbersMatch( |
| 522 GetRawInfo(*iter), | 522 GetRawInfo(*iter), |
| 523 profile.GetRawInfo(*iter), | 523 profile.GetRawInfo(*iter), |
| 524 UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)), | 524 UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)), |
| 525 app_locale)) { | 525 app_locale)) { |
| 526 return false; | 526 return false; |
| 527 } | 527 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 558 // GetMultiInfo always returns at least one element, even if the profile | 558 // GetMultiInfo always returns at least one element, even if the profile |
| 559 // has no data stored for this field type. | 559 // has no data stored for this field type. |
| 560 if (existing_values.size() == 1 && existing_values.front().empty()) | 560 if (existing_values.size() == 1 && existing_values.front().empty()) |
| 561 existing_values.clear(); | 561 existing_values.clear(); |
| 562 | 562 |
| 563 FieldTypeGroup group = AutofillType(*iter).group(); | 563 FieldTypeGroup group = AutofillType(*iter).group(); |
| 564 for (std::vector<base::string16>::iterator value_iter = | 564 for (std::vector<base::string16>::iterator value_iter = |
| 565 new_values.begin(); | 565 new_values.begin(); |
| 566 value_iter != new_values.end(); ++value_iter) { | 566 value_iter != new_values.end(); ++value_iter) { |
| 567 // Don't add duplicates. | 567 // Don't add duplicates. |
| 568 if (group == AutofillType::PHONE_HOME) { | 568 if (group == PHONE_HOME) { |
| 569 AddPhoneIfUnique(*value_iter, app_locale, &existing_values); | 569 AddPhoneIfUnique(*value_iter, app_locale, &existing_values); |
| 570 } else { | 570 } else { |
| 571 std::vector<base::string16>::const_iterator existing_iter = | 571 std::vector<base::string16>::const_iterator existing_iter = |
| 572 std::find_if( | 572 std::find_if( |
| 573 existing_values.begin(), existing_values.end(), | 573 existing_values.begin(), existing_values.end(), |
| 574 std::bind1st(CaseInsensitiveStringEquals(), *value_iter)); | 574 std::bind1st(CaseInsensitiveStringEquals(), *value_iter)); |
| 575 if (existing_iter == existing_values.end()) | 575 if (existing_iter == existing_values.end()) |
| 576 existing_values.insert(existing_values.end(), *value_iter); | 576 existing_values.insert(existing_values.end(), *value_iter); |
| 577 } | 577 } |
| 578 } | 578 } |
| 579 SetRawMultiInfo(*iter, existing_values); | 579 SetRawMultiInfo(*iter, existing_values); |
| 580 } else { | 580 } else { |
| 581 base::string16 new_value = profile.GetRawInfo(*iter); | 581 base::string16 new_value = profile.GetRawInfo(*iter); |
| 582 if (StringToLowerASCII(GetRawInfo(*iter)) != | 582 if (StringToLowerASCII(GetRawInfo(*iter)) != |
| 583 StringToLowerASCII(new_value)) { | 583 StringToLowerASCII(new_value)) { |
| 584 SetRawInfo(*iter, new_value); | 584 SetRawInfo(*iter, new_value); |
| 585 } | 585 } |
| 586 } | 586 } |
| 587 } | 587 } |
| 588 } | 588 } |
| 589 | 589 |
| 590 // static | 590 // static |
| 591 bool AutofillProfile::SupportsMultiValue(AutofillFieldType type) { | 591 bool AutofillProfile::SupportsMultiValue(AutofillFieldType type) { |
| 592 AutofillType::FieldTypeGroup group = AutofillType(type).group(); | 592 FieldTypeGroup group = AutofillType(type).group(); |
| 593 return group == AutofillType::NAME || | 593 return group == NAME || |
| 594 group == AutofillType::NAME_BILLING || | 594 group == NAME_BILLING || |
| 595 group == AutofillType::EMAIL || | 595 group == EMAIL || |
| 596 group == AutofillType::PHONE_HOME || | 596 group == PHONE_HOME || |
| 597 group == AutofillType::PHONE_BILLING; | 597 group == PHONE_BILLING; |
| 598 } | 598 } |
| 599 | 599 |
| 600 // static | 600 // static |
| 601 bool AutofillProfile::AdjustInferredLabels( | 601 bool AutofillProfile::AdjustInferredLabels( |
| 602 std::vector<AutofillProfile*>* profiles) { | 602 std::vector<AutofillProfile*>* profiles) { |
| 603 const size_t kMinimalFieldsShown = 2; | 603 const size_t kMinimalFieldsShown = 2; |
| 604 | 604 |
| 605 std::vector<base::string16> created_labels; | 605 std::vector<base::string16> created_labels; |
| 606 CreateInferredLabels(profiles, NULL, UNKNOWN_TYPE, kMinimalFieldsShown, | 606 CreateInferredLabels(profiles, NULL, UNKNOWN_TYPE, kMinimalFieldsShown, |
| 607 &created_labels); | 607 &created_labels); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 } | 686 } |
| 687 | 687 |
| 688 return false; | 688 return false; |
| 689 } | 689 } |
| 690 | 690 |
| 691 void AutofillProfile::GetMultiInfoImpl( | 691 void AutofillProfile::GetMultiInfoImpl( |
| 692 AutofillFieldType type, | 692 AutofillFieldType type, |
| 693 const std::string& app_locale, | 693 const std::string& app_locale, |
| 694 std::vector<base::string16>* values) const { | 694 std::vector<base::string16>* values) const { |
| 695 switch (AutofillType(type).group()) { | 695 switch (AutofillType(type).group()) { |
| 696 case AutofillType::NAME: | 696 case NAME: |
| 697 case AutofillType::NAME_BILLING: | 697 case NAME_BILLING: |
| 698 CopyItemsToValues(type, name_, app_locale, values); | 698 CopyItemsToValues(type, name_, app_locale, values); |
| 699 break; | 699 break; |
| 700 case AutofillType::EMAIL: | 700 case EMAIL: |
| 701 CopyItemsToValues(type, email_, app_locale, values); | 701 CopyItemsToValues(type, email_, app_locale, values); |
| 702 break; | 702 break; |
| 703 case AutofillType::PHONE_HOME: | 703 case PHONE_HOME: |
| 704 case AutofillType::PHONE_BILLING: | 704 case PHONE_BILLING: |
| 705 CopyItemsToValues(type, phone_number_, app_locale, values); | 705 CopyItemsToValues(type, phone_number_, app_locale, values); |
| 706 break; | 706 break; |
| 707 default: | 707 default: |
| 708 values->resize(1); | 708 values->resize(1); |
| 709 (*values)[0] = GetFormGroupInfo(*this, type, app_locale); | 709 (*values)[0] = GetFormGroupInfo(*this, type, app_locale); |
| 710 } | 710 } |
| 711 } | 711 } |
| 712 | 712 |
| 713 void AutofillProfile::AddPhoneIfUnique( | 713 void AutofillProfile::AddPhoneIfUnique( |
| 714 const base::string16& phone, | 714 const base::string16& phone, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 } | 838 } |
| 839 | 839 |
| 840 const FormGroup* AutofillProfile::FormGroupForType( | 840 const FormGroup* AutofillProfile::FormGroupForType( |
| 841 AutofillFieldType type) const { | 841 AutofillFieldType type) const { |
| 842 return const_cast<AutofillProfile*>(this)->MutableFormGroupForType(type); | 842 return const_cast<AutofillProfile*>(this)->MutableFormGroupForType(type); |
| 843 } | 843 } |
| 844 | 844 |
| 845 FormGroup* AutofillProfile::MutableFormGroupForType(AutofillFieldType type) { | 845 FormGroup* AutofillProfile::MutableFormGroupForType(AutofillFieldType type) { |
| 846 FormGroup* form_group = NULL; | 846 FormGroup* form_group = NULL; |
| 847 switch (AutofillType(type).group()) { | 847 switch (AutofillType(type).group()) { |
| 848 case AutofillType::NAME: | 848 case NAME: |
| 849 case AutofillType::NAME_BILLING: | 849 case NAME_BILLING: |
| 850 form_group = &name_[0]; | 850 form_group = &name_[0]; |
| 851 break; | 851 break; |
| 852 case AutofillType::EMAIL: | 852 case EMAIL: |
| 853 form_group = &email_[0]; | 853 form_group = &email_[0]; |
| 854 break; | 854 break; |
| 855 case AutofillType::COMPANY: | 855 case COMPANY: |
| 856 form_group = &company_; | 856 form_group = &company_; |
| 857 break; | 857 break; |
| 858 case AutofillType::PHONE_HOME: | 858 case PHONE_HOME: |
| 859 case AutofillType::PHONE_BILLING: | 859 case PHONE_BILLING: |
| 860 form_group = &phone_number_[0]; | 860 form_group = &phone_number_[0]; |
| 861 break; | 861 break; |
| 862 case AutofillType::ADDRESS_HOME: | 862 case ADDRESS_HOME: |
| 863 case AutofillType::ADDRESS_BILLING: | 863 case ADDRESS_BILLING: |
| 864 form_group = &address_; | 864 form_group = &address_; |
| 865 break; | 865 break; |
| 866 default: | 866 default: |
| 867 break; | 867 break; |
| 868 } | 868 } |
| 869 | 869 |
| 870 return form_group; | 870 return form_group; |
| 871 } | 871 } |
| 872 | 872 |
| 873 // So we can compare AutofillProfiles with EXPECT_EQ(). | 873 // So we can compare AutofillProfiles with EXPECT_EQ(). |
| (...skipping 24 matching lines...) Expand all Loading... |
| 898 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE)) | 898 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE)) |
| 899 << " " | 899 << " " |
| 900 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP)) | 900 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP)) |
| 901 << " " | 901 << " " |
| 902 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)) | 902 << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY)) |
| 903 << " " | 903 << " " |
| 904 << UTF16ToUTF8(MultiString(profile, PHONE_HOME_WHOLE_NUMBER)); | 904 << UTF16ToUTF8(MultiString(profile, PHONE_HOME_WHOLE_NUMBER)); |
| 905 } | 905 } |
| 906 | 906 |
| 907 } // namespace autofill | 907 } // namespace autofill |
| OLD | NEW |