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

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

Issue 212873003: Store the language code for the address in autofill profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixups Created 6 years, 8 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 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 689
690 for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 690 for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
691 DialogSection section = static_cast<DialogSection>(i); 691 DialogSection section = static_cast<DialogSection>(i);
692 692
693 std::string country_code; 693 std::string country_code;
694 CountryComboboxModel* model = CountryComboboxModelForSection(section); 694 CountryComboboxModel* model = CountryComboboxModelForSection(section);
695 if (model) 695 if (model)
696 country_code = model->GetDefaultCountryCode(); 696 country_code = model->GetDefaultCountryCode();
697 697
698 DetailInputs* inputs = MutableRequestedFieldsForSection(section); 698 DetailInputs* inputs = MutableRequestedFieldsForSection(section);
699 common::BuildInputsForSection(section, country_code, inputs); 699 common::BuildInputsForSection(
700 section, country_code, inputs,
701 MutableAddressLanguageCodeForSection(section));
700 } 702 }
701 703
702 // Test whether we need to show the shipping section. If filling that section 704 // Test whether we need to show the shipping section. If filling that section
703 // would be a no-op, don't show it. 705 // would be a no-op, don't show it.
704 cares_about_shipping_ = form_structure_.FillFields( 706 cares_about_shipping_ = form_structure_.FillFields(
705 RequestedTypesForSection(SECTION_SHIPPING), 707 RequestedTypesForSection(SECTION_SHIPPING),
706 base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING), 708 base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING),
707 base::Bind(NullGetInfo), 709 base::Bind(NullGetInfo),
708 g_browser_process->GetApplicationLocale()); 710 g_browser_process->GetApplicationLocale());
709 711
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 if (inputs.empty()) 1844 if (inputs.empty())
1843 return messages; 1845 return messages;
1844 1846
1845 AddressValidator::Status status = AddressValidator::SUCCESS; 1847 AddressValidator::Status status = AddressValidator::SUCCESS;
1846 if (section != SECTION_CC) { 1848 if (section != SECTION_CC) {
1847 AutofillProfile profile; 1849 AutofillProfile profile;
1848 FillFormGroupFromOutputs(inputs, &profile); 1850 FillFormGroupFromOutputs(inputs, &profile);
1849 AddressData address_data; 1851 AddressData address_data;
1850 i18ninput::CreateAddressData(base::Bind(&GetInfoFromProfile, profile), 1852 i18ninput::CreateAddressData(base::Bind(&GetInfoFromProfile, profile),
1851 &address_data); 1853 &address_data);
1854 address_data.language_code = AddressLanguageCodeForSection(section);
1852 1855
1853 AddressProblems problems; 1856 AddressProblems problems;
1854 status = GetValidator()->ValidateAddress(address_data, 1857 status = GetValidator()->ValidateAddress(address_data,
1855 AddressProblemFilter(), 1858 AddressProblemFilter(),
1856 &problems); 1859 &problems);
1857 common::AddressType address_type = section == SECTION_SHIPPING ? 1860 common::AddressType address_type = section == SECTION_SHIPPING ?
1858 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; 1861 common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING;
1859 for (size_t i = 0; i < problems.size(); ++i) { 1862 for (size_t i = 0; i < problems.size(); ++i) {
1860 const AddressProblem& problem = problems[i]; 1863 const AddressProblem& problem = problems[i];
1861 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; 1864 bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD;
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after
3039 } 3042 }
3040 3043
3041 void AutofillDialogControllerImpl::FillOutputForSectionWithComparator( 3044 void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
3042 DialogSection section, 3045 DialogSection section,
3043 const FormStructure::InputFieldComparator& compare) { 3046 const FormStructure::InputFieldComparator& compare) {
3044 if (!SectionIsActive(section)) 3047 if (!SectionIsActive(section))
3045 return; 3048 return;
3046 3049
3047 DetailInputs inputs; 3050 DetailInputs inputs;
3048 std::string country_code = CountryCodeForSection(section); 3051 std::string country_code = CountryCodeForSection(section);
3049 common::BuildInputsForSection(section, country_code, &inputs); 3052 common::BuildInputsForSection(section, country_code, &inputs,
3053 MutableAddressLanguageCodeForSection(section));
3050 std::vector<ServerFieldType> types = common::TypesFromInputs(inputs); 3054 std::vector<ServerFieldType> types = common::TypesFromInputs(inputs);
3051 3055
3052 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 3056 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
3053 if (wrapper) { 3057 if (wrapper) {
3054 // Only fill in data that is associated with this section. 3058 // Only fill in data that is associated with this section.
3055 wrapper->FillFormStructure(types, compare, &form_structure_); 3059 wrapper->FillFormStructure(types, compare, &form_structure_);
3056 3060
3057 // CVC needs special-casing because the CreditCard class doesn't store or 3061 // CVC needs special-casing because the CreditCard class doesn't store or
3058 // handle them. This isn't necessary when filling the combined CC and 3062 // handle them. This isn't necessary when filling the combined CC and
3059 // billing section as CVC comes from |full_wallet_| in this case. 3063 // billing section as CVC comes from |full_wallet_| in this case.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3093 AutofillCreditCardWrapper card_wrapper(&card); 3097 AutofillCreditCardWrapper card_wrapper(&card);
3094 card_wrapper.FillFormStructure(types, compare, &form_structure_); 3098 card_wrapper.FillFormStructure(types, compare, &form_structure_);
3095 3099
3096 // Again, CVC needs special-casing. Fill it in directly from |output|. 3100 // Again, CVC needs special-casing. Fill it in directly from |output|.
3097 SetOutputForFieldsOfType( 3101 SetOutputForFieldsOfType(
3098 CREDIT_CARD_VERIFICATION_CODE, 3102 CREDIT_CARD_VERIFICATION_CODE,
3099 output[CREDIT_CARD_VERIFICATION_CODE]); 3103 output[CREDIT_CARD_VERIFICATION_CODE]);
3100 } else { 3104 } else {
3101 AutofillProfile profile; 3105 AutofillProfile profile;
3102 FillFormGroupFromOutputs(output, &profile); 3106 FillFormGroupFromOutputs(output, &profile);
3107 profile.set_language_code(AddressLanguageCodeForSection(section));
3103 3108
3104 if (ShouldSaveDetailsLocally()) { 3109 if (ShouldSaveDetailsLocally()) {
3105 profile.set_origin(RulesAreLoaded(section) ? 3110 profile.set_origin(RulesAreLoaded(section) ?
3106 kAutofillDialogOrigin : source_url_.GetOrigin().spec()); 3111 kAutofillDialogOrigin : source_url_.GetOrigin().spec());
3107 3112
3108 std::string guid = GetManager()->SaveImportedProfile(profile); 3113 std::string guid = GetManager()->SaveImportedProfile(profile);
3109 newly_saved_data_model_guids_[section] = guid; 3114 newly_saved_data_model_guids_[section] = guid;
3110 } 3115 }
3111 3116
3112 AutofillProfileWrapper profile_wrapper(&profile); 3117 AutofillProfileWrapper profile_wrapper(&profile);
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
3241 3246
3242 FieldValueMap inputs; 3247 FieldValueMap inputs;
3243 view_->GetUserInput(section, &inputs); 3248 view_->GetUserInput(section, &inputs);
3244 3249
3245 AutofillProfile profile; 3250 AutofillProfile profile;
3246 FillFormGroupFromOutputs(inputs, &profile); 3251 FillFormGroupFromOutputs(inputs, &profile);
3247 3252
3248 AddressData user_input; 3253 AddressData user_input;
3249 i18ninput::CreateAddressData( 3254 i18ninput::CreateAddressData(
3250 base::Bind(&GetInfoFromProfile, profile), &user_input); 3255 base::Bind(&GetInfoFromProfile, profile), &user_input);
3256 user_input.language_code = AddressLanguageCodeForSection(section);
3251 3257
3252 static const size_t kSuggestionsLimit = 10; 3258 static const size_t kSuggestionsLimit = 10;
3253 AddressValidator::Status status = GetValidator()->GetSuggestions( 3259 AddressValidator::Status status = GetValidator()->GetSuggestions(
3254 user_input, focused_field, kSuggestionsLimit, 3260 user_input, focused_field, kSuggestionsLimit,
3255 &i18n_validator_suggestions_); 3261 &i18n_validator_suggestions_);
3256 3262
3257 if (status != AddressValidator::SUCCESS) 3263 if (status != AddressValidator::SUCCESS)
3258 return; 3264 return;
3259 3265
3260 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) { 3266 for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) {
(...skipping 17 matching lines...) Expand all
3278 } 3284 }
3279 } 3285 }
3280 popup_icons->resize(popup_values->size()); 3286 popup_icons->resize(popup_values->size());
3281 } 3287 }
3282 3288
3283 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( 3289 DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection(
3284 DialogSection section) { 3290 DialogSection section) {
3285 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); 3291 return const_cast<DetailInputs*>(&RequestedFieldsForSection(section));
3286 } 3292 }
3287 3293
3294 std::string* AutofillDialogControllerImpl::MutableAddressLanguageCodeForSection(
3295 DialogSection section) {
3296 switch (section) {
3297 case SECTION_BILLING:
3298 case SECTION_CC_BILLING:
3299 return &billing_address_language_code_;
3300 case SECTION_SHIPPING:
3301 return &shipping_address_language_code_;
3302 case SECTION_CC:
3303 return NULL;
3304 }
3305 NOTREACHED();
3306 return NULL;
3307 }
3308
3309 std::string AutofillDialogControllerImpl::AddressLanguageCodeForSection(
3310 DialogSection section) {
3311 std::string* language_code = MutableAddressLanguageCodeForSection(section);
3312 return language_code != NULL ? *language_code : std::string();
3313 }
3314
3288 std::vector<ServerFieldType> AutofillDialogControllerImpl:: 3315 std::vector<ServerFieldType> AutofillDialogControllerImpl::
3289 RequestedTypesForSection(DialogSection section) const { 3316 RequestedTypesForSection(DialogSection section) const {
3290 return common::TypesFromInputs(RequestedFieldsForSection(section)); 3317 return common::TypesFromInputs(RequestedFieldsForSection(section));
3291 } 3318 }
3292 3319
3293 std::string AutofillDialogControllerImpl::CountryCodeForSection( 3320 std::string AutofillDialogControllerImpl::CountryCodeForSection(
3294 DialogSection section) { 3321 DialogSection section) {
3295 base::string16 country; 3322 base::string16 country;
3296 3323
3297 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 3324 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
(...skipping 25 matching lines...) Expand all
3323 FieldValueMap outputs; 3350 FieldValueMap outputs;
3324 view_->GetUserInput(section, &outputs); 3351 view_->GetUserInput(section, &outputs);
3325 3352
3326 // If |country_name| is the same as the view, no-op and let the caller know. 3353 // If |country_name| is the same as the view, no-op and let the caller know.
3327 if (outputs[CountryTypeForSection(section)] == country_name) 3354 if (outputs[CountryTypeForSection(section)] == country_name)
3328 return false; 3355 return false;
3329 } 3356 }
3330 3357
3331 DetailInputs* inputs = MutableRequestedFieldsForSection(section); 3358 DetailInputs* inputs = MutableRequestedFieldsForSection(section);
3332 inputs->clear(); 3359 inputs->clear();
3333 common::BuildInputsForSection(section, country_code, inputs); 3360 common::BuildInputsForSection(section, country_code, inputs,
3361 MutableAddressLanguageCodeForSection(section));
3334 return true; 3362 return true;
3335 } 3363 }
3336 3364
3337 void AutofillDialogControllerImpl::HidePopup() { 3365 void AutofillDialogControllerImpl::HidePopup() {
3338 if (popup_controller_) 3366 if (popup_controller_)
3339 popup_controller_->Hide(); 3367 popup_controller_->Hide();
3340 popup_input_type_ = UNKNOWN_TYPE; 3368 popup_input_type_ = UNKNOWN_TYPE;
3341 } 3369 }
3342 3370
3343 void AutofillDialogControllerImpl::SetEditingExistingData( 3371 void AutofillDialogControllerImpl::SetEditingExistingData(
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
3581 } 3609 }
3582 3610
3583 scoped_ptr<wallet::Address>AutofillDialogControllerImpl:: 3611 scoped_ptr<wallet::Address>AutofillDialogControllerImpl::
3584 CreateTransientAddress() { 3612 CreateTransientAddress() {
3585 // If not using billing for shipping, just scrape the view. 3613 // If not using billing for shipping, just scrape the view.
3586 FieldValueMap output; 3614 FieldValueMap output;
3587 view_->GetUserInput(SECTION_SHIPPING, &output); 3615 view_->GetUserInput(SECTION_SHIPPING, &output);
3588 3616
3589 AutofillProfile profile; 3617 AutofillProfile profile;
3590 FillFormGroupFromOutputs(output, &profile); 3618 FillFormGroupFromOutputs(output, &profile);
3619 profile.set_language_code(shipping_address_language_code_);
3591 CanonicalizeState(validator_.get(), &profile); 3620 CanonicalizeState(validator_.get(), &profile);
3592 3621
3593 return scoped_ptr<wallet::Address>(new wallet::Address(profile)); 3622 return scoped_ptr<wallet::Address>(new wallet::Address(profile));
3594 } 3623 }
3595 3624
3596 void AutofillDialogControllerImpl::GetFullWallet() { 3625 void AutofillDialogControllerImpl::GetFullWallet() {
3597 DCHECK(is_submitting_); 3626 DCHECK(is_submitting_);
3598 DCHECK(IsPayingWithWallet()); 3627 DCHECK(IsPayingWithWallet());
3599 DCHECK(wallet_items_); 3628 DCHECK(wallet_items_);
3600 DCHECK(!active_instrument_id_.empty()); 3629 DCHECK(!active_instrument_id_.empty());
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
3901 return; 3930 return;
3902 3931
3903 if (newly_saved_card_) { 3932 if (newly_saved_card_) {
3904 scoped_ptr<AutofillProfile> billing_profile; 3933 scoped_ptr<AutofillProfile> billing_profile;
3905 if (IsManuallyEditingSection(SECTION_BILLING)) { 3934 if (IsManuallyEditingSection(SECTION_BILLING)) {
3906 // Scrape the view as the user's entering or updating information. 3935 // Scrape the view as the user's entering or updating information.
3907 FieldValueMap outputs; 3936 FieldValueMap outputs;
3908 view_->GetUserInput(SECTION_BILLING, &outputs); 3937 view_->GetUserInput(SECTION_BILLING, &outputs);
3909 billing_profile.reset(new AutofillProfile); 3938 billing_profile.reset(new AutofillProfile);
3910 FillFormGroupFromOutputs(outputs, billing_profile.get()); 3939 FillFormGroupFromOutputs(outputs, billing_profile.get());
3940 billing_profile->set_language_code(billing_address_language_code_);
3911 } else { 3941 } else {
3912 // Just snag the currently suggested profile. 3942 // Just snag the currently suggested profile.
3913 std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)-> 3943 std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)->
3914 GetItemKeyForCheckedItem(); 3944 GetItemKeyForCheckedItem();
3915 AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 3945 AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
3916 billing_profile.reset(new AutofillProfile(*profile)); 3946 billing_profile.reset(new AutofillProfile(*profile));
3917 } 3947 }
3918 3948
3919 ShowNewCreditCardBubble(newly_saved_card_.Pass(), 3949 ShowNewCreditCardBubble(newly_saved_card_.Pass(),
3920 billing_profile.Pass()); 3950 billing_profile.Pass());
(...skipping 16 matching lines...) Expand all
3937 view_->UpdateButtonStrip(); 3967 view_->UpdateButtonStrip();
3938 } 3968 }
3939 3969
3940 void AutofillDialogControllerImpl::FetchWalletCookie() { 3970 void AutofillDialogControllerImpl::FetchWalletCookie() {
3941 net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 3971 net::URLRequestContextGetter* request_context = profile_->GetRequestContext();
3942 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 3972 signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context));
3943 signin_helper_->StartWalletCookieValueFetch(); 3973 signin_helper_->StartWalletCookieValueFetch();
3944 } 3974 }
3945 3975
3946 } // namespace autofill 3976 } // namespace autofill
OLDNEW
« no previous file with comments | « chrome/browser/ui/autofill/autofill_dialog_controller_impl.h ('k') | chrome/browser/ui/autofill/autofill_dialog_i18n_input.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698