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 "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 Loading... |
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 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
814 | 820 |
815 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE); | 821 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE); |
816 // Wallet generates MC virtual cards, so we have to disable it if MC is not | 822 // Wallet generates MC virtual cards, so we have to disable it if MC is not |
817 // allowed. | 823 // allowed. |
818 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard))) | 824 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard))) |
819 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT); | 825 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT); |
820 | 826 |
821 if (account_chooser_model_->WalletIsSelected()) | 827 if (account_chooser_model_->WalletIsSelected()) |
822 FetchWalletCookie(); | 828 FetchWalletCookie(); |
823 | 829 |
824 scoped_ptr< ::i18n::addressinput::Downloader> downloader( | 830 validator_.reset(new AddressValidator( |
825 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())); | 831 I18N_ADDRESS_VALIDATION_DATA_URL, |
826 validator_ = AddressValidator::Build( | 832 scoped_ptr<Downloader>( |
827 downloader.Pass(), | 833 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())), |
828 ValidationRulesStorageFactory::CreateStorage(), | 834 ValidationRulesStorageFactory::CreateStorage(), |
829 this); | 835 this)); |
830 | 836 |
831 SuggestionsUpdated(); | 837 SuggestionsUpdated(); |
832 SubmitButtonDelayBegin(); | 838 SubmitButtonDelayBegin(); |
833 view_.reset(CreateView()); | 839 view_.reset(CreateView()); |
834 view_->Show(); | 840 view_->Show(); |
835 GetManager()->AddObserver(this); | 841 GetManager()->AddObserver(this); |
836 | 842 |
837 if (!account_chooser_model_->WalletIsSelected()) | 843 if (!account_chooser_model_->WalletIsSelected()) |
838 LogDialogLatencyToShow(); | 844 LogDialogLatencyToShow(); |
839 } | 845 } |
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 base::string16 message = CreditCardNumberValidityMessage(value); | 1897 base::string16 message = CreditCardNumberValidityMessage(value); |
1892 if (!message.empty()) | 1898 if (!message.empty()) |
1893 return message; | 1899 return message; |
1894 } | 1900 } |
1895 break; | 1901 break; |
1896 } | 1902 } |
1897 | 1903 |
1898 case CREDIT_CARD_EXP_MONTH: | 1904 case CREDIT_CARD_EXP_MONTH: |
1899 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { | 1905 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { |
1900 return l10n_util::GetStringUTF16( | 1906 return l10n_util::GetStringUTF16( |
1901 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); | 1907 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD); |
1902 } | 1908 } |
1903 break; | 1909 break; |
1904 | 1910 |
1905 case CREDIT_CARD_EXP_4_DIGIT_YEAR: | 1911 case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
1906 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { | 1912 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { |
1907 return l10n_util::GetStringUTF16( | 1913 return l10n_util::GetStringUTF16( |
1908 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); | 1914 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD); |
1909 } | 1915 } |
1910 break; | 1916 break; |
1911 | 1917 |
1912 case CREDIT_CARD_VERIFICATION_CODE: | 1918 case CREDIT_CARD_VERIFICATION_CODE: |
1913 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { | 1919 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { |
1914 return l10n_util::GetStringUTF16( | 1920 return l10n_util::GetStringUTF16( |
1915 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); | 1921 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); |
1916 } | 1922 } |
1917 break; | 1923 break; |
1918 | 1924 |
(...skipping 11 matching lines...) Expand all Loading... |
1930 | 1936 |
1931 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. | 1937 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. |
1932 break; | 1938 break; |
1933 | 1939 |
1934 default: | 1940 default: |
1935 NOTREACHED(); // Trying to validate unknown field. | 1941 NOTREACHED(); // Trying to validate unknown field. |
1936 break; | 1942 break; |
1937 } | 1943 } |
1938 | 1944 |
1939 return value.empty() ? l10n_util::GetStringUTF16( | 1945 return value.empty() ? l10n_util::GetStringUTF16( |
1940 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD) : | 1946 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD) : |
1941 base::string16(); | 1947 base::string16(); |
1942 } | 1948 } |
1943 | 1949 |
1944 // TODO(groby): Also add tests. | 1950 // TODO(groby): Also add tests. |
1945 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( | 1951 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( |
1946 DialogSection section, | 1952 DialogSection section, |
1947 const FieldValueMap& inputs) { | 1953 const FieldValueMap& inputs) { |
1948 ValidityMessages messages; | 1954 ValidityMessages messages; |
1949 if (inputs.empty()) | 1955 if (inputs.empty()) |
1950 return messages; | 1956 return messages; |
1951 | 1957 |
1952 AddressValidator::Status status = AddressValidator::SUCCESS; | 1958 AddressValidator::Status status = AddressValidator::SUCCESS; |
1953 if (section != SECTION_CC) { | 1959 if (section != SECTION_CC) { |
1954 AutofillProfile profile; | 1960 AutofillProfile profile; |
1955 FillFormGroupFromOutputs(inputs, &profile); | 1961 FillFormGroupFromOutputs(inputs, &profile); |
1956 scoped_ptr<AddressData> address_data = | 1962 scoped_ptr<AddressData> address_data = |
1957 i18n::CreateAddressDataFromAutofillProfile( | 1963 i18n::CreateAddressDataFromAutofillProfile( |
1958 profile, g_browser_process->GetApplicationLocale()); | 1964 profile, g_browser_process->GetApplicationLocale()); |
1959 address_data->language_code = AddressLanguageCodeForSection(section); | 1965 address_data->language_code = AddressLanguageCodeForSection(section); |
1960 | 1966 |
1961 AddressProblems problems; | 1967 Localization localization; |
1962 status = GetValidator()->ValidateAddress(*address_data, | 1968 localization.SetGetter(l10n_util::GetStringUTF8); |
1963 AddressProblemFilter(), | 1969 FieldProblemMap problems; |
1964 &problems); | 1970 status = GetValidator()->ValidateAddress(*address_data, NULL, &problems); |
1965 common::AddressType address_type = section == SECTION_SHIPPING ? | 1971 common::AddressType address_type = section == SECTION_SHIPPING ? |
1966 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; | 1972 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; |
1967 for (size_t i = 0; i < problems.size(); ++i) { | 1973 |
1968 const AddressProblem& problem = problems[i]; | 1974 for (FieldProblemMap::const_iterator iter = problems.begin(); |
1969 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; | 1975 iter != problems.end(); ++iter) { |
1970 base::string16 text = l10n_util::GetStringUTF16(problem.description_id); | 1976 bool sure = iter->second != MISSING_REQUIRED_FIELD; |
1971 messages.Set(i18ninput::TypeForField(problem.field, address_type), | 1977 base::string16 text = base::UTF8ToUTF16( |
| 1978 localization.GetErrorMessage(*address_data, |
| 1979 iter->first, |
| 1980 iter->second, |
| 1981 true, // Enable examples. |
| 1982 false)); // Disable links. |
| 1983 messages.Set(i18ninput::TypeForField(iter->first, address_type), |
1972 ValidityMessage(text, sure)); | 1984 ValidityMessage(text, sure)); |
1973 } | 1985 } |
1974 } | 1986 } |
1975 | 1987 |
1976 for (FieldValueMap::const_iterator iter = inputs.begin(); | 1988 for (FieldValueMap::const_iterator iter = inputs.begin(); |
1977 iter != inputs.end(); ++iter) { | 1989 iter != inputs.end(); ++iter) { |
1978 const ServerFieldType type = iter->first; | 1990 const ServerFieldType type = iter->first; |
1979 base::string16 text = InputValidityMessage(section, type, iter->second); | 1991 base::string16 text = InputValidityMessage(section, type, iter->second); |
1980 | 1992 |
1981 // Skip empty/unchanged fields in edit mode. If the individual field does | 1993 // Skip empty/unchanged fields in edit mode. If the individual field does |
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3361 return; | 3373 return; |
3362 | 3374 |
3363 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { | 3375 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { |
3364 popup_values->push_back(base::UTF8ToUTF16( | 3376 popup_values->push_back(base::UTF8ToUTF16( |
3365 i18n_validator_suggestions_[i].GetFieldValue(focused_field))); | 3377 i18n_validator_suggestions_[i].GetFieldValue(focused_field))); |
3366 | 3378 |
3367 // Disambiguate the suggestion by showing the smallest administrative | 3379 // Disambiguate the suggestion by showing the smallest administrative |
3368 // region of the suggested address: | 3380 // region of the suggested address: |
3369 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY | 3381 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY |
3370 popup_labels->push_back(base::string16()); | 3382 popup_labels->push_back(base::string16()); |
3371 for (int field = ::i18n::addressinput::DEPENDENT_LOCALITY; | 3383 for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) { |
3372 field >= ::i18n::addressinput::ADMIN_AREA; | |
3373 --field) { | |
3374 const std::string& field_value = | 3384 const std::string& field_value = |
3375 i18n_validator_suggestions_[i].GetFieldValue( | 3385 i18n_validator_suggestions_[i].GetFieldValue( |
3376 static_cast<AddressField>(field)); | 3386 static_cast<AddressField>(field)); |
3377 if (focused_field != field && !field_value.empty()) { | 3387 if (focused_field != field && !field_value.empty()) { |
3378 popup_labels->back().assign(base::UTF8ToUTF16(field_value)); | 3388 popup_labels->back().assign(base::UTF8ToUTF16(field_value)); |
3379 break; | 3389 break; |
3380 } | 3390 } |
3381 } | 3391 } |
3382 } | 3392 } |
3383 popup_icons->resize(popup_values->size()); | 3393 popup_icons->resize(popup_values->size()); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3534 if (!IsManuallyEditingSection(section)) | 3544 if (!IsManuallyEditingSection(section)) |
3535 return true; | 3545 return true; |
3536 | 3546 |
3537 FieldValueMap detail_outputs; | 3547 FieldValueMap detail_outputs; |
3538 view_->GetUserInput(section, &detail_outputs); | 3548 view_->GetUserInput(section, &detail_outputs); |
3539 return !InputsAreValid(section, detail_outputs).HasSureErrors(); | 3549 return !InputsAreValid(section, detail_outputs).HasSureErrors(); |
3540 } | 3550 } |
3541 | 3551 |
3542 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) { | 3552 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) { |
3543 AddressData address_data; | 3553 AddressData address_data; |
3544 address_data.country_code = CountryCodeForSection(section); | 3554 address_data.region_code = CountryCodeForSection(section); |
3545 AddressValidator::Status status = GetValidator()->ValidateAddress( | 3555 AddressValidator::Status status = GetValidator()->ValidateAddress( |
3546 address_data, AddressProblemFilter(), NULL); | 3556 address_data, NULL, NULL); |
3547 return status == AddressValidator::SUCCESS; | 3557 return status == AddressValidator::SUCCESS; |
3548 } | 3558 } |
3549 | 3559 |
3550 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( | 3560 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( |
3551 const base::string16& year, | 3561 const base::string16& year, |
3552 const base::string16& month) const { | 3562 const base::string16& month) const { |
3553 // If the expiration is in the past as per the local clock, it's invalid. | 3563 // If the expiration is in the past as per the local clock, it's invalid. |
3554 base::Time now = base::Time::Now(); | 3564 base::Time now = base::Time::Now(); |
3555 if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) | 3565 if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) |
3556 return false; | 3566 return false; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3588 | 3598 |
3589 return false; | 3599 return false; |
3590 } | 3600 } |
3591 | 3601 |
3592 bool AutofillDialogControllerImpl::HasInvalidAddress( | 3602 bool AutofillDialogControllerImpl::HasInvalidAddress( |
3593 const AutofillProfile& profile) { | 3603 const AutofillProfile& profile) { |
3594 scoped_ptr<AddressData> address_data = | 3604 scoped_ptr<AddressData> address_data = |
3595 i18n::CreateAddressDataFromAutofillProfile( | 3605 i18n::CreateAddressDataFromAutofillProfile( |
3596 profile, g_browser_process->GetApplicationLocale()); | 3606 profile, g_browser_process->GetApplicationLocale()); |
3597 | 3607 |
3598 AddressProblems problems; | 3608 FieldProblemMap problems; |
3599 GetValidator()->ValidateAddress(*address_data, | 3609 GetValidator()->ValidateAddress(*address_data, NULL, &problems); |
3600 AddressProblemFilter(), | |
3601 &problems); | |
3602 return !problems.empty(); | 3610 return !problems.empty(); |
3603 } | 3611 } |
3604 | 3612 |
3605 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { | 3613 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { |
3606 return SectionIsActive(SECTION_SHIPPING) && | 3614 return SectionIsActive(SECTION_SHIPPING) && |
3607 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; | 3615 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; |
3608 } | 3616 } |
3609 | 3617 |
3610 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { | 3618 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { |
3611 // It's possible that the user checked [X] Save details locally before | 3619 // It's possible that the user checked [X] Save details locally before |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4090 view_->UpdateButtonStrip(); | 4098 view_->UpdateButtonStrip(); |
4091 } | 4099 } |
4092 | 4100 |
4093 void AutofillDialogControllerImpl::FetchWalletCookie() { | 4101 void AutofillDialogControllerImpl::FetchWalletCookie() { |
4094 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); | 4102 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); |
4095 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); | 4103 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); |
4096 signin_helper_->StartWalletCookieValueFetch(); | 4104 signin_helper_->StartWalletCookieValueFetch(); |
4097 } | 4105 } |
4098 | 4106 |
4099 } // namespace autofill | 4107 } // namespace autofill |
OLD | NEW |