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

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

Issue 386873002: Reland "Use upstream libaddressinput in Chrome." (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix iOS compile. Created 6 years, 5 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 #include "content/public/browser/navigation_entry.h" 73 #include "content/public/browser/navigation_entry.h"
74 #include "content/public/browser/notification_service.h" 74 #include "content/public/browser/notification_service.h"
75 #include "content/public/browser/notification_types.h" 75 #include "content/public/browser/notification_types.h"
76 #include "content/public/browser/render_view_host.h" 76 #include "content/public/browser/render_view_host.h"
77 #include "content/public/browser/web_contents.h" 77 #include "content/public/browser/web_contents.h"
78 #include "content/public/common/url_constants.h" 78 #include "content/public/common/url_constants.h"
79 #include "grit/chromium_strings.h" 79 #include "grit/chromium_strings.h"
80 #include "grit/component_scaled_resources.h" 80 #include "grit/component_scaled_resources.h"
81 #include "grit/components_strings.h" 81 #include "grit/components_strings.h"
82 #include "grit/generated_resources.h" 82 #include "grit/generated_resources.h"
83 #include "grit/libaddressinput_strings.h"
84 #include "grit/platform_locale_settings.h" 83 #include "grit/platform_locale_settings.h"
85 #include "grit/theme_resources.h" 84 #include "grit/theme_resources.h"
86 #include "net/cert/cert_status_flags.h" 85 #include "net/cert/cert_status_flags.h"
87 #include "third_party/libaddressinput/chromium/chrome_downloader_impl.h" 86 #include "third_party/libaddressinput/chromium/chrome_downloader_impl.h"
88 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" 87 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
89 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_data.h" 88 #include "third_party/libaddressinput/messages.h"
90 #include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/addre ss_problem.h" 89 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.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"
91 #include "ui/base/base_window.h" 93 #include "ui/base/base_window.h"
92 #include "ui/base/l10n/l10n_util.h" 94 #include "ui/base/l10n/l10n_util.h"
93 #include "ui/base/models/combobox_model.h" 95 #include "ui/base/models/combobox_model.h"
94 #include "ui/base/resource/resource_bundle.h" 96 #include "ui/base/resource/resource_bundle.h"
95 #include "ui/gfx/canvas.h" 97 #include "ui/gfx/canvas.h"
96 #include "ui/gfx/image/image_skia_operations.h" 98 #include "ui/gfx/image/image_skia_operations.h"
97 #include "ui/gfx/skia_util.h" 99 #include "ui/gfx/skia_util.h"
98 100
99 using ::i18n::addressinput::AddressData; 101 using ::i18n::addressinput::AddressData;
100 using ::i18n::addressinput::AddressField; 102 using ::i18n::addressinput::AddressField;
101 using ::i18n::addressinput::AddressProblem; 103 using ::i18n::addressinput::AddressProblem;
102 using ::i18n::addressinput::AddressProblemFilter; 104 using ::i18n::addressinput::ADMIN_AREA;
103 using ::i18n::addressinput::AddressProblems; 105 using ::i18n::addressinput::DEPENDENT_LOCALITY;
104 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;
105 110
106 namespace autofill { 111 namespace autofill {
107 112
108 namespace { 113 namespace {
109 114
110 const char kAddNewItemKey[] = "add-new-item"; 115 const char kAddNewItemKey[] = "add-new-item";
111 const char kManageItemsKey[] = "manage-items"; 116 const char kManageItemsKey[] = "manage-items";
112 const char kSameAsBillingKey[] = "same-as-billing"; 117 const char kSameAsBillingKey[] = "same-as-billing";
113 118
114 // URLs for Wallet error messages. 119 // URLs for Wallet error messages.
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 865
861 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE); 866 acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE);
862 // Wallet generates MC virtual cards, so we have to disable it if MC is not 867 // Wallet generates MC virtual cards, so we have to disable it if MC is not
863 // allowed. 868 // allowed.
864 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard))) 869 if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard)))
865 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT); 870 DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT);
866 871
867 if (account_chooser_model_->WalletIsSelected()) 872 if (account_chooser_model_->WalletIsSelected())
868 FetchWalletCookie(); 873 FetchWalletCookie();
869 874
870 scoped_ptr< ::i18n::addressinput::Downloader> downloader( 875 validator_.reset(new AddressValidator(
871 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())); 876 I18N_ADDRESS_VALIDATION_DATA_URL,
872 validator_ = AddressValidator::Build( 877 scoped_ptr<Downloader>(
873 downloader.Pass(), 878 new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())),
874 ValidationRulesStorageFactory::CreateStorage(), 879 ValidationRulesStorageFactory::CreateStorage(),
875 this); 880 this));
876 881
877 SuggestionsUpdated(); 882 SuggestionsUpdated();
878 SubmitButtonDelayBegin(); 883 SubmitButtonDelayBegin();
879 view_.reset(CreateView()); 884 view_.reset(CreateView());
880 view_->Show(); 885 view_->Show();
881 GetManager()->AddObserver(this); 886 GetManager()->AddObserver(this);
882 887
883 if (!account_chooser_model_->WalletIsSelected()) 888 if (!account_chooser_model_->WalletIsSelected())
884 LogDialogLatencyToShow(); 889 LogDialogLatencyToShow();
885 } 890 }
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1937 base::string16 message = CreditCardNumberValidityMessage(value); 1942 base::string16 message = CreditCardNumberValidityMessage(value);
1938 if (!message.empty()) 1943 if (!message.empty())
1939 return message; 1944 return message;
1940 } 1945 }
1941 break; 1946 break;
1942 } 1947 }
1943 1948
1944 case CREDIT_CARD_EXP_MONTH: 1949 case CREDIT_CARD_EXP_MONTH:
1945 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { 1950 if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) {
1946 return l10n_util::GetStringUTF16( 1951 return l10n_util::GetStringUTF16(
1947 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1952 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1948 } 1953 }
1949 break; 1954 break;
1950 1955
1951 case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1956 case CREDIT_CARD_EXP_4_DIGIT_YEAR:
1952 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { 1957 if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) {
1953 return l10n_util::GetStringUTF16( 1958 return l10n_util::GetStringUTF16(
1954 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1959 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1955 } 1960 }
1956 break; 1961 break;
1957 1962
1958 case CREDIT_CARD_VERIFICATION_CODE: 1963 case CREDIT_CARD_VERIFICATION_CODE:
1959 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { 1964 if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) {
1960 return l10n_util::GetStringUTF16( 1965 return l10n_util::GetStringUTF16(
1961 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 1966 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
1962 } 1967 }
1963 break; 1968 break;
1964 1969
(...skipping 11 matching lines...) Expand all
1976 1981
1977 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. 1982 case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section.
1978 break; 1983 break;
1979 1984
1980 default: 1985 default:
1981 NOTREACHED(); // Trying to validate unknown field. 1986 NOTREACHED(); // Trying to validate unknown field.
1982 break; 1987 break;
1983 } 1988 }
1984 1989
1985 return value.empty() ? l10n_util::GetStringUTF16( 1990 return value.empty() ? l10n_util::GetStringUTF16(
1986 IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD) : 1991 IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD) :
1987 base::string16(); 1992 base::string16();
1988 } 1993 }
1989 1994
1990 // TODO(groby): Also add tests. 1995 // TODO(groby): Also add tests.
1991 ValidityMessages AutofillDialogControllerImpl::InputsAreValid( 1996 ValidityMessages AutofillDialogControllerImpl::InputsAreValid(
1992 DialogSection section, 1997 DialogSection section,
1993 const FieldValueMap& inputs) { 1998 const FieldValueMap& inputs) {
1994 ValidityMessages messages; 1999 ValidityMessages messages;
1995 if (inputs.empty()) 2000 if (inputs.empty())
1996 return messages; 2001 return messages;
1997 2002
1998 AddressValidator::Status status = AddressValidator::SUCCESS; 2003 AddressValidator::Status status = AddressValidator::SUCCESS;
1999 if (section != SECTION_CC) { 2004 if (section != SECTION_CC) {
2000 AutofillProfile profile; 2005 AutofillProfile profile;
2001 FillFormGroupFromOutputs(inputs, &profile); 2006 FillFormGroupFromOutputs(inputs, &profile);
2002 scoped_ptr<AddressData> address_data = 2007 scoped_ptr<AddressData> address_data =
2003 i18n::CreateAddressDataFromAutofillProfile( 2008 i18n::CreateAddressDataFromAutofillProfile(
2004 profile, g_browser_process->GetApplicationLocale()); 2009 profile, g_browser_process->GetApplicationLocale());
2005 address_data->language_code = AddressLanguageCodeForSection(section); 2010 address_data->language_code = AddressLanguageCodeForSection(section);
2006 2011
2007 AddressProblems problems; 2012 Localization localization;
2008 status = GetValidator()->ValidateAddress(*address_data, 2013 localization.SetGetter(l10n_util::GetStringUTF8);
2009 AddressProblemFilter(), 2014 FieldProblemMap problems;
2010 &problems); 2015 status = GetValidator()->ValidateAddress(*address_data, NULL, &problems);
2011 common::AddressType address_type = section == SECTION_SHIPPING ? 2016 common::AddressType address_type = section == SECTION_SHIPPING ?
2012 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; 2017 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING;
2013 for (size_t i = 0; i < problems.size(); ++i) { 2018
2014 const AddressProblem& problem = problems[i]; 2019 for (FieldProblemMap::const_iterator iter = problems.begin();
2015 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; 2020 iter != problems.end(); ++iter) {
2016 base::string16 text = l10n_util::GetStringUTF16(problem.description_id); 2021 bool sure = iter->second != MISSING_REQUIRED_FIELD;
2017 messages.Set(i18ninput::TypeForField(problem.field, address_type), 2022 base::string16 text = base::UTF8ToUTF16(localization.GetErrorMessage(
2023 *address_data, iter->first, iter->second, true, false));
2024 messages.Set(i18ninput::TypeForField(iter->first, address_type),
2018 ValidityMessage(text, sure)); 2025 ValidityMessage(text, sure));
2019 } 2026 }
2020 } 2027 }
2021 2028
2022 for (FieldValueMap::const_iterator iter = inputs.begin(); 2029 for (FieldValueMap::const_iterator iter = inputs.begin();
2023 iter != inputs.end(); ++iter) { 2030 iter != inputs.end(); ++iter) {
2024 const ServerFieldType type = iter->first; 2031 const ServerFieldType type = iter->first;
2025 base::string16 text = InputValidityMessage(section, type, iter->second); 2032 base::string16 text = InputValidityMessage(section, type, iter->second);
2026 2033
2027 // Skip empty/unchanged fields in edit mode. If the individual field does 2034 // Skip empty/unchanged fields in edit mode. If the individual field does
(...skipping 1396 matching lines...) Expand 10 before | Expand all | Expand 10 after
3424 return; 3431 return;
3425 3432
3426 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { 3433 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) {
3427 popup_values->push_back(base::UTF8ToUTF16( 3434 popup_values->push_back(base::UTF8ToUTF16(
3428 i18n_validator_suggestions_[i].GetFieldValue(focused_field))); 3435 i18n_validator_suggestions_[i].GetFieldValue(focused_field)));
3429 3436
3430 // Disambiguate the suggestion by showing the smallest administrative 3437 // Disambiguate the suggestion by showing the smallest administrative
3431 // region of the suggested address: 3438 // region of the suggested address:
3432 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY 3439 // ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY
3433 popup_labels->push_back(base::string16()); 3440 popup_labels->push_back(base::string16());
3434 for (int field = ::i18n::addressinput::DEPENDENT_LOCALITY; 3441 for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) {
3435 field >= ::i18n::addressinput::ADMIN_AREA;
3436 --field) {
3437 const std::string& field_value = 3442 const std::string& field_value =
3438 i18n_validator_suggestions_[i].GetFieldValue( 3443 i18n_validator_suggestions_[i].GetFieldValue(
3439 static_cast<AddressField>(field)); 3444 static_cast<AddressField>(field));
3440 if (focused_field != field && !field_value.empty()) { 3445 if (focused_field != field && !field_value.empty()) {
3441 popup_labels->back().assign(base::UTF8ToUTF16(field_value)); 3446 popup_labels->back().assign(base::UTF8ToUTF16(field_value));
3442 break; 3447 break;
3443 } 3448 }
3444 } 3449 }
3445 } 3450 }
3446 popup_icons->resize(popup_values->size()); 3451 popup_icons->resize(popup_values->size());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
3609 3614
3610 FieldValueMap detail_outputs; 3615 FieldValueMap detail_outputs;
3611 view_->GetUserInput(section, &detail_outputs); 3616 view_->GetUserInput(section, &detail_outputs);
3612 return !InputsAreValid(section, detail_outputs).HasSureErrors(); 3617 return !InputsAreValid(section, detail_outputs).HasSureErrors();
3613 } 3618 }
3614 3619
3615 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) { 3620 bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) {
3616 AddressData address_data; 3621 AddressData address_data;
3617 address_data.region_code = CountryCodeForSection(section); 3622 address_data.region_code = CountryCodeForSection(section);
3618 AddressValidator::Status status = GetValidator()->ValidateAddress( 3623 AddressValidator::Status status = GetValidator()->ValidateAddress(
3619 address_data, AddressProblemFilter(), NULL); 3624 address_data, NULL, NULL);
3620 return status == AddressValidator::SUCCESS; 3625 return status == AddressValidator::SUCCESS;
3621 } 3626 }
3622 3627
3623 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( 3628 bool AutofillDialogControllerImpl::IsCreditCardExpirationValid(
3624 const base::string16& year, 3629 const base::string16& year,
3625 const base::string16& month) const { 3630 const base::string16& month) const {
3626 // If the expiration is in the past as per the local clock, it's invalid. 3631 // If the expiration is in the past as per the local clock, it's invalid.
3627 base::Time now = base::Time::Now(); 3632 base::Time now = base::Time::Now();
3628 if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) 3633 if (!autofill::IsValidCreditCardExpirationDate(year, month, now))
3629 return false; 3634 return false;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3661 3666
3662 return false; 3667 return false;
3663 } 3668 }
3664 3669
3665 bool AutofillDialogControllerImpl::HasInvalidAddress( 3670 bool AutofillDialogControllerImpl::HasInvalidAddress(
3666 const AutofillProfile& profile) { 3671 const AutofillProfile& profile) {
3667 scoped_ptr<AddressData> address_data = 3672 scoped_ptr<AddressData> address_data =
3668 i18n::CreateAddressDataFromAutofillProfile( 3673 i18n::CreateAddressDataFromAutofillProfile(
3669 profile, g_browser_process->GetApplicationLocale()); 3674 profile, g_browser_process->GetApplicationLocale());
3670 3675
3671 AddressProblems problems; 3676 FieldProblemMap problems;
3672 GetValidator()->ValidateAddress(*address_data, 3677 GetValidator()->ValidateAddress(*address_data, NULL, &problems);
3673 AddressProblemFilter(),
3674 &problems);
3675 return !problems.empty(); 3678 return !problems.empty();
3676 } 3679 }
3677 3680
3678 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { 3681 bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() {
3679 return SectionIsActive(SECTION_SHIPPING) && 3682 return SectionIsActive(SECTION_SHIPPING) &&
3680 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; 3683 suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey;
3681 } 3684 }
3682 3685
3683 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { 3686 bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() {
3684 // It's possible that the user checked [X] Save details locally before 3687 // It's possible that the user checked [X] Save details locally before
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
4163 view_->UpdateButtonStrip(); 4166 view_->UpdateButtonStrip();
4164 } 4167 }
4165 4168
4166 void AutofillDialogControllerImpl::FetchWalletCookie() { 4169 void AutofillDialogControllerImpl::FetchWalletCookie() {
4167 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 4170 net::URLRequestContextGetter* request_context = profile_->GetRequestContext();
4168 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 4171 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context));
4169 signin_helper_->StartWalletCookieValueFetch(); 4172 signin_helper_->StartWalletCookieValueFetch();
4170 } 4173 }
4171 4174
4172 } // namespace autofill 4175 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698