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

Side by Side Diff: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc

Issue 298863012: Use upstream libaddressinput in Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix AutofillProfileSyncableServiceTest. Created 6 years, 6 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 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 "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" 5 #include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 10
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 #include "content/public/browser/navigation_entry.h" 72 #include "content/public/browser/navigation_entry.h"
73 #include "content/public/browser/notification_service.h" 73 #include "content/public/browser/notification_service.h"
74 #include "content/public/browser/notification_types.h" 74 #include "content/public/browser/notification_types.h"
75 #include "content/public/browser/render_view_host.h" 75 #include "content/public/browser/render_view_host.h"
76 #include "content/public/browser/web_contents.h" 76 #include "content/public/browser/web_contents.h"
77 #include "content/public/common/url_constants.h" 77 #include "content/public/common/url_constants.h"
78 #include "grit/chromium_strings.h" 78 #include "grit/chromium_strings.h"
79 #include "grit/component_scaled_resources.h" 79 #include "grit/component_scaled_resources.h"
80 #include "grit/components_strings.h" 80 #include "grit/components_strings.h"
81 #include "grit/generated_resources.h" 81 #include "grit/generated_resources.h"
82 #include "grit/libaddressinput_strings.h" 82 #include "grit/libaddressinput/messages.h"
83 #include "grit/platform_locale_settings.h" 83 #include "grit/platform_locale_settings.h"
84 #include "grit/theme_resources.h" 84 #include "grit/theme_resources.h"
85 #include "net/cert/cert_status_flags.h" 85 #include "net/cert/cert_status_flags.h"
86 #include "third_party/libaddressinput/chromium/chrome_address_validator.h"
86 #include "third_party/libaddressinput/chromium/chrome_downloader_impl.h" 87 #include "third_party/libaddressinput/chromium/chrome_downloader_impl.h"
87 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" 88 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
88 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_data.h" 89 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h"
89 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_problem.h" 90 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_fi eld.h"
91 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_pr oblem.h"
92 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/localizati on.h"
90 #include "ui/base/base_window.h" 93 #include "ui/base/base_window.h"
91 #include "ui/base/l10n/l10n_util.h" 94 #include "ui/base/l10n/l10n_util.h"
92 #include "ui/base/models/combobox_model.h" 95 #include "ui/base/models/combobox_model.h"
93 #include "ui/base/resource/resource_bundle.h" 96 #include "ui/base/resource/resource_bundle.h"
94 #include "ui/gfx/canvas.h" 97 #include "ui/gfx/canvas.h"
95 #include "ui/gfx/image/image_skia_operations.h" 98 #include "ui/gfx/image/image_skia_operations.h"
96 #include "ui/gfx/skia_util.h" 99 #include "ui/gfx/skia_util.h"
97 100
98 using ::i18n::addressinput::AddressData; 101 using ::i18n::addressinput::AddressData;
99 using ::i18n::addressinput::AddressField; 102 using ::i18n::addressinput::AddressField;
100 using ::i18n::addressinput::AddressProblem; 103 using ::i18n::addressinput::AddressProblem;
101 using ::i18n::addressinput::AddressProblemFilter; 104 using ::i18n::addressinput::ADMIN_AREA;
102 using ::i18n::addressinput::AddressProblems; 105 using ::i18n::addressinput::DEPENDENT_LOCALITY;
103 using ::i18n::addressinput::AddressValidator; 106 using ::i18n::addressinput::Downloader;
107 using ::i18n::addressinput::FieldProblemMap;
108 using ::i18n::addressinput::Localization;
109 using ::i18n::addressinput::MISSING_REQUIRED_FIELD;
104 110
105 namespace autofill { 111 namespace autofill {
106 112
107 namespace { 113 namespace {
108 114
109 const char kAddNewItemKey[] = "add-new-item"; 115 const char kAddNewItemKey[] = "add-new-item";
110 const char kManageItemsKey[] = "manage-items"; 116 const char kManageItemsKey[] = "manage-items";
111 const char kSameAsBillingKey[] = "same-as-billing"; 117 const char kSameAsBillingKey[] = "same-as-billing";
112 118
113 // URLs for Wallet error messages. 119 // URLs for Wallet error messages.
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 831
826 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE); 832 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE);
827 // Wallet generates MC virtual cards, so we have to disable it if MC is not 833 // Wallet generates MC virtual cards, so we have to disable it if MC is not
828 // allowed. 834 // allowed.
829 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard))) 835 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard)))
830 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT); 836 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT);
831 837
832 if (account_chooser_model_->WalletIsSelected()) 838 if (account_chooser_model_->WalletIsSelected())
833 FetchWalletCookie(); 839 FetchWalletCookie();
834 840
835 scoped_ptr< ::i18n::addressinput::Downloader> downloader( 841 validator_.reset(new AddressValidator(
836 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())); 842 I18N_ADDRESS_VALIDATION_DATA_URL,
837 validator_ = AddressValidator::Build( 843 scoped_ptr<Downloader>(
838 downloader.Pass(), 844 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())),
839 ValidationRulesStorageFactory::CreateStorage(), 845 ValidationRulesStorageFactory::CreateStorage(),
840 this); 846 this));
841 847
842 SuggestionsUpdated(); 848 SuggestionsUpdated();
843 SubmitButtonDelayBegin(); 849 SubmitButtonDelayBegin();
844 view_.reset(CreateView()); 850 view_.reset(CreateView());
845 view_->Show(); 851 view_->Show();
846 GetManager()->AddObserver(this); 852 GetManager()->AddObserver(this);
847 853
848 if (!account_chooser_model_->WalletIsSelected()) 854 if (!account_chooser_model_->WalletIsSelected())
849 LogDialogLatencyToShow(); 855 LogDialogLatencyToShow();
850 } 856 }
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 base::string16 message = CreditCardNumberValidityMessage(value); 1908 base::string16 message = CreditCardNumberValidityMessage(value);
1903 if (!message.empty()) 1909 if (!message.empty())
1904 return message; 1910 return message;
1905 } 1911 }
1906 break; 1912 break;
1907 } 1913 }
1908 1914
1909 case CREDIT_CARD_EXP_MONTH: 1915 case CREDIT_CARD_EXP_MONTH:
1910 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { 1916 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) {
1911 return l10n_util::GetStringUTF16( 1917 return l10n_util::GetStringUTF16(
1912 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1918 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1913 } 1919 }
1914 break; 1920 break;
1915 1921
1916 case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1922 case CREDIT_CARD_EXP_4_DIGIT_YEAR:
1917 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { 1923 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) {
1918 return l10n_util::GetStringUTF16( 1924 return l10n_util::GetStringUTF16(
1919 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1925 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1920 } 1926 }
1921 break; 1927 break;
1922 1928
1923 case CREDIT_CARD_VERIFICATION_CODE: 1929 case CREDIT_CARD_VERIFICATION_CODE:
1924 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { 1930 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) {
1925 return l10n_util::GetStringUTF16( 1931 return l10n_util::GetStringUTF16(
1926 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 1932 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
1927 } 1933 }
1928 break; 1934 break;
1929 1935
(...skipping 11 matching lines...) Expand all
1941 1947
1942 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. 1948 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section.
1943 break; 1949 break;
1944 1950
1945 default: 1951 default:
1946 NOTREACHED(); // Trying to validate unknown field. 1952 NOTREACHED(); // Trying to validate unknown field.
1947 break; 1953 break;
1948 } 1954 }
1949 1955
1950 return value.empty() ? l10n_util::GetStringUTF16( 1956 return value.empty() ? l10n_util::GetStringUTF16(
1951 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD) : 1957 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD) :
1952 base::string16(); 1958 base::string16();
1953 } 1959 }
1954 1960
1955 // TODO(groby): Also add tests. 1961 // TODO(groby): Also add tests.
1956 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( 1962 ValidityMessages AutofillDialogControllerImpl::InputsAreValid(
1957 DialogSection section, 1963 DialogSection section,
1958 const FieldValueMap& inputs) { 1964 const FieldValueMap& inputs) {
1959 ValidityMessages messages; 1965 ValidityMessages messages;
1960 if (inputs.empty()) 1966 if (inputs.empty())
1961 return messages; 1967 return messages;
1962 1968
1963 AddressValidator::Status status = AddressValidator::SUCCESS; 1969 AddressValidator::Status status = AddressValidator::SUCCESS;
1964 if (section != SECTION_CC) { 1970 if (section != SECTION_CC) {
1965 AutofillProfile profile; 1971 AutofillProfile profile;
1966 FillFormGroupFromOutputs(inputs, &profile); 1972 FillFormGroupFromOutputs(inputs, &profile);
1967 scoped_ptr<AddressData> address_data = 1973 scoped_ptr<AddressData> address_data =
1968 i18n::CreateAddressDataFromAutofillProfile( 1974 i18n::CreateAddressDataFromAutofillProfile(
1969 profile, g_browser_process->GetApplicationLocale()); 1975 profile, g_browser_process->GetApplicationLocale());
1970 address_data->language_code = AddressLanguageCodeForSection(section); 1976 address_data->language_code = AddressLanguageCodeForSection(section);
1971 1977
1972 AddressProblems problems; 1978 Localization localization;
1973 status = GetValidator()->ValidateAddress(*address_data, 1979 localization.SetGetter(l10n_util::GetStringUTF8);
1974 AddressProblemFilter(), 1980 FieldProblemMap problems;
1975 &problems); 1981 status = GetValidator()->ValidateAddress(*address_data, NULL, &problems);
1976 common::AddressType address_type = section == SECTION_SHIPPING ? 1982 common::AddressType address_type = section == SECTION_SHIPPING ?
1977 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; 1983 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING;
1978 for (size_t i = 0; i < problems.size(); ++i) { 1984
1979 const AddressProblem& problem = problems[i]; 1985 for (FieldProblemMap::const_iterator iter = problems.begin();
1980 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; 1986 iter != problems.end(); ++iter) {
1981 base::string16 text = l10n_util::GetStringUTF16(problem.description_id); 1987 bool sure = iter->second != MISSING_REQUIRED_FIELD;
1982 messages.Set(i18ninput::TypeForField(problem.field, address_type), 1988 base::string16 text = base::UTF8ToUTF16(
1989 localization.GetErrorMessage(*address_data,
1990 iter->first,
1991 iter->second,
1992 true, // Enable examples.
1993 false)); // Disable links.
1994 messages.Set(i18ninput::TypeForField(iter->first, address_type),
1983 ValidityMessage(text, sure)); 1995 ValidityMessage(text, sure));
1984 } 1996 }
1985 } 1997 }
1986 1998
1987 for (FieldValueMap::const_iterator iter = inputs.begin(); 1999 for (FieldValueMap::const_iterator iter = inputs.begin();
1988 iter != inputs.end(); ++iter) { 2000 iter != inputs.end(); ++iter) {
1989 const ServerFieldType type = iter->first; 2001 const ServerFieldType type = iter->first;
1990 base::string16 text = InputValidityMessage(section, type, iter->second); 2002 base::string16 text = InputValidityMessage(section, type, iter->second);
1991 2003
1992 // Skip empty/unchanged fields in edit mode. If the individual field does 2004 // Skip empty/unchanged fields in edit mode. If the individual field does
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after
3372 return; 3384 return;
3373 3385
3374 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { 3386 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) {
3375 popup_values->push_back(base::UTF8ToUTF16( 3387 popup_values->push_back(base::UTF8ToUTF16(
3376 i18n_validator_suggestions_[i].GetFieldValue(focused_field))); 3388 i18n_validator_suggestions_[i].GetFieldValue(focused_field)));
3377 3389
3378 // Disambiguate the suggestion by showing the smallest administrative 3390 // Disambiguate the suggestion by showing the smallest administrative
3379 // region of the suggested address: 3391 // region of the suggested address:
3380 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY 3392 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY
3381 popup_labels->push_back(base::string16()); 3393 popup_labels->push_back(base::string16());
3382 for (int field = ::i18n::addressinput::DEPENDENT_LOCALITY; 3394 for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) {
3383 field >= ::i18n::addressinput::ADMIN_AREA;
3384 --field) {
3385 const std::string& field_value = 3395 const std::string& field_value =
3386 i18n_validator_suggestions_[i].GetFieldValue( 3396 i18n_validator_suggestions_[i].GetFieldValue(
3387 static_cast<AddressField>(field)); 3397 static_cast<AddressField>(field));
3388 if (focused_field != field && !field_value.empty()) { 3398 if (focused_field != field && !field_value.empty()) {
3389 popup_labels->back().assign(base::UTF8ToUTF16(field_value)); 3399 popup_labels->back().assign(base::UTF8ToUTF16(field_value));
3390 break; 3400 break;
3391 } 3401 }
3392 } 3402 }
3393 } 3403 }
3394 popup_icons->resize(popup_values->size()); 3404 popup_icons->resize(popup_values->size());
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
3555 if (!IsManuallyEditingSection(section)) 3565 if (!IsManuallyEditingSection(section))
3556 return true; 3566 return true;
3557 3567
3558 FieldValueMap detail_outputs; 3568 FieldValueMap detail_outputs;
3559 view_->GetUserInput(section, &detail_outputs); 3569 view_->GetUserInput(section, &detail_outputs);
3560 return !InputsAreValid(section, detail_outputs).HasSureErrors(); 3570 return !InputsAreValid(section, detail_outputs).HasSureErrors();
3561 } 3571 }
3562 3572
3563 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) { 3573 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) {
3564 AddressData address_data; 3574 AddressData address_data;
3565 address_data.country_code = CountryCodeForSection(section); 3575 address_data.region_code = CountryCodeForSection(section);
3566 AddressValidator::Status status = GetValidator()->ValidateAddress( 3576 AddressValidator::Status status = GetValidator()->ValidateAddress(
3567 address_data, AddressProblemFilter(), NULL); 3577 address_data, NULL, NULL);
3568 return status == AddressValidator::SUCCESS; 3578 return status == AddressValidator::SUCCESS;
3569 } 3579 }
3570 3580
3571 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( 3581 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid(
3572 const base::string16& year, 3582 const base::string16& year,
3573 const base::string16& month) const { 3583 const base::string16& month) const {
3574 // If the expiration is in the past as per the local clock, it's invalid. 3584 // If the expiration is in the past as per the local clock, it's invalid.
3575 base::Time now = base::Time::Now(); 3585 base::Time now = base::Time::Now();
3576 if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) 3586 if (!autofill::IsValidCreditCardExpirationDate(year, month, now))
3577 return false; 3587 return false;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3609 3619
3610 return false; 3620 return false;
3611 } 3621 }
3612 3622
3613 bool AutofillDialogControllerImpl::HasInvalidAddress( 3623 bool AutofillDialogControllerImpl::HasInvalidAddress(
3614 const AutofillProfile& profile) { 3624 const AutofillProfile& profile) {
3615 scoped_ptr<AddressData> address_data = 3625 scoped_ptr<AddressData> address_data =
3616 i18n::CreateAddressDataFromAutofillProfile( 3626 i18n::CreateAddressDataFromAutofillProfile(
3617 profile, g_browser_process->GetApplicationLocale()); 3627 profile, g_browser_process->GetApplicationLocale());
3618 3628
3619 AddressProblems problems; 3629 FieldProblemMap problems;
3620 GetValidator()->ValidateAddress(*address_data, 3630 GetValidator()->ValidateAddress(*address_data, NULL, &problems);
3621 AddressProblemFilter(),
3622 &problems);
3623 return !problems.empty(); 3631 return !problems.empty();
3624 } 3632 }
3625 3633
3626 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { 3634 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() {
3627 return SectionIsActive(SECTION_SHIPPING) && 3635 return SectionIsActive(SECTION_SHIPPING) &&
3628 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; 3636 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey;
3629 } 3637 }
3630 3638
3631 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { 3639 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() {
3632 // It's possible that the user checked [X] Save details locally before 3640 // It's possible that the user checked [X] Save details locally before
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
4111 view_->UpdateButtonStrip(); 4119 view_->UpdateButtonStrip();
4112 } 4120 }
4113 4121
4114 void AutofillDialogControllerImpl::FetchWalletCookie() { 4122 void AutofillDialogControllerImpl::FetchWalletCookie() {
4115 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 4123 net::URLRequestContextGetter* request_context = profile_->GetRequestContext();
4116 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 4124 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context));
4117 signin_helper_->StartWalletCookieValueFetch(); 4125 signin_helper_->StartWalletCookieValueFetch();
4118 } 4126 }
4119 4127
4120 } // namespace autofill 4128 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698