| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 105 |
| 106 // Returns true if |card_type| is supported by Wallet. | 106 // Returns true if |card_type| is supported by Wallet. |
| 107 bool IsWalletSupportedCard(const std::string& card_type) { | 107 bool IsWalletSupportedCard(const std::string& card_type) { |
| 108 return card_type == autofill::kVisaCard || | 108 return card_type == autofill::kVisaCard || |
| 109 card_type == autofill::kMasterCard || | 109 card_type == autofill::kMasterCard || |
| 110 card_type == autofill::kDiscoverCard; | 110 card_type == autofill::kDiscoverCard; |
| 111 } | 111 } |
| 112 | 112 |
| 113 // Returns true if |input| should be shown when |field_type| has been requested. | 113 // Returns true if |input| should be shown when |field_type| has been requested. |
| 114 bool InputTypeMatchesFieldType(const DetailInput& input, | 114 bool InputTypeMatchesFieldType(const DetailInput& input, |
| 115 AutofillFieldType field_type) { | 115 const AutofillType& field_type) { |
| 116 // If any credit card expiration info is asked for, show both month and year | 116 // If any credit card expiration info is asked for, show both month and year |
| 117 // inputs. | 117 // inputs. |
| 118 if (field_type == CREDIT_CARD_EXP_4_DIGIT_YEAR || | 118 if (field_type.server_type() == CREDIT_CARD_EXP_4_DIGIT_YEAR || |
| 119 field_type == CREDIT_CARD_EXP_2_DIGIT_YEAR || | 119 field_type.server_type() == CREDIT_CARD_EXP_2_DIGIT_YEAR || |
| 120 field_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR || | 120 field_type.server_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR || |
| 121 field_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR || | 121 field_type.server_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR || |
| 122 field_type == CREDIT_CARD_EXP_MONTH) { | 122 field_type.server_type() == CREDIT_CARD_EXP_MONTH) { |
| 123 return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR || | 123 return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR || |
| 124 input.type == CREDIT_CARD_EXP_MONTH; | 124 input.type == CREDIT_CARD_EXP_MONTH; |
| 125 } | 125 } |
| 126 | 126 |
| 127 if (field_type == CREDIT_CARD_TYPE) | 127 if (field_type.server_type() == CREDIT_CARD_TYPE) |
| 128 return input.type == CREDIT_CARD_NUMBER; | 128 return input.type == CREDIT_CARD_NUMBER; |
| 129 | 129 |
| 130 return input.type == field_type; | 130 return input.type == field_type.server_type(); |
| 131 } | 131 } |
| 132 | 132 |
| 133 // Returns true if |input| in the given |section| should be used for a | 133 // Returns true if |input| in the given |section| should be used for a |
| 134 // site-requested |field|. | 134 // site-requested |field|. |
| 135 bool DetailInputMatchesField(DialogSection section, | 135 bool DetailInputMatchesField(DialogSection section, |
| 136 const DetailInput& input, | 136 const DetailInput& input, |
| 137 const AutofillField& field) { | 137 const AutofillField& field) { |
| 138 AutofillType field_type = field.Type(); |
| 139 |
| 138 // The credit card name is filled from the billing section's data. | 140 // The credit card name is filled from the billing section's data. |
| 139 if (field.type() == CREDIT_CARD_NAME && | 141 if (field_type.server_type() == CREDIT_CARD_NAME && |
| 140 (section == SECTION_BILLING || section == SECTION_CC_BILLING)) { | 142 (section == SECTION_BILLING || section == SECTION_CC_BILLING)) { |
| 141 return input.type == NAME_BILLING_FULL; | 143 return input.type == NAME_BILLING_FULL; |
| 142 } | 144 } |
| 143 | 145 |
| 144 return InputTypeMatchesFieldType(input, field.type()); | 146 return InputTypeMatchesFieldType(input, field_type); |
| 145 } | 147 } |
| 146 | 148 |
| 147 bool IsCreditCardType(AutofillFieldType type) { | 149 bool IsCreditCardType(ServerFieldType type) { |
| 148 return AutofillType(type).group() == CREDIT_CARD; | 150 return AutofillType(type).group() == CREDIT_CARD; |
| 149 } | 151 } |
| 150 | 152 |
| 151 // Returns true if |input| should be used to fill a site-requested |field| which | 153 // Returns true if |input| should be used to fill a site-requested |field| which |
| 152 // is notated with a "shipping" tag, for use when the user has decided to use | 154 // is notated with a "shipping" tag, for use when the user has decided to use |
| 153 // the billing address as the shipping address. | 155 // the billing address as the shipping address. |
| 154 bool DetailInputMatchesShippingField(const DetailInput& input, | 156 bool DetailInputMatchesShippingField(const DetailInput& input, |
| 155 const AutofillField& field) { | 157 const AutofillField& field) { |
| 156 // Equivalent billing field type is used to support UseBillingAsShipping | 158 // Equivalent billing field type is used to support UseBillingAsShipping |
| 157 // usecase. | 159 // usecase. |
| 158 AutofillFieldType field_type = | 160 ServerFieldType field_type = |
| 159 AutofillType::GetEquivalentBillingFieldType(field.type()); | 161 AutofillType::GetEquivalentBillingFieldType(field.Type().server_type()); |
| 160 | 162 |
| 161 return InputTypeMatchesFieldType(input, field_type); | 163 return InputTypeMatchesFieldType(input, AutofillType(field_type)); |
| 162 } | 164 } |
| 163 | 165 |
| 164 // Constructs |inputs| from template data. | 166 // Constructs |inputs| from template data. |
| 165 void BuildInputs(const DetailInput* input_template, | 167 void BuildInputs(const DetailInput* input_template, |
| 166 size_t template_size, | 168 size_t template_size, |
| 167 DetailInputs* inputs) { | 169 DetailInputs* inputs) { |
| 168 for (size_t i = 0; i < template_size; ++i) { | 170 for (size_t i = 0; i < template_size; ++i) { |
| 169 const DetailInput* input = &input_template[i]; | 171 const DetailInput* input = &input_template[i]; |
| 170 inputs->push_back(*input); | 172 inputs->push_back(*input); |
| 171 } | 173 } |
| 172 } | 174 } |
| 173 | 175 |
| 174 // Initializes |form_group| from user-entered data. | 176 // Initializes |form_group| from user-entered data. |
| 175 void FillFormGroupFromOutputs(const DetailOutputMap& detail_outputs, | 177 void FillFormGroupFromOutputs(const DetailOutputMap& detail_outputs, |
| 176 FormGroup* form_group) { | 178 FormGroup* form_group) { |
| 177 for (DetailOutputMap::const_iterator iter = detail_outputs.begin(); | 179 for (DetailOutputMap::const_iterator iter = detail_outputs.begin(); |
| 178 iter != detail_outputs.end(); ++iter) { | 180 iter != detail_outputs.end(); ++iter) { |
| 181 ServerFieldType type = iter->first->type; |
| 179 if (!iter->second.empty()) { | 182 if (!iter->second.empty()) { |
| 180 AutofillFieldType type = iter->first->type; | |
| 181 if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { | 183 if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { |
| 182 form_group->SetInfo(type, | 184 form_group->SetInfo(AutofillType(type), |
| 183 iter->second, | 185 iter->second, |
| 184 g_browser_process->GetApplicationLocale()); | 186 g_browser_process->GetApplicationLocale()); |
| 185 } else { | 187 } else { |
| 186 form_group->SetRawInfo(iter->first->type, iter->second); | 188 form_group->SetRawInfo(type, iter->second); |
| 187 } | 189 } |
| 188 } | 190 } |
| 189 } | 191 } |
| 190 } | 192 } |
| 191 | 193 |
| 192 // Get billing info from |output| and put it into |card|, |cvc|, and |profile|. | 194 // Get billing info from |output| and put it into |card|, |cvc|, and |profile|. |
| 193 // These outparams are required because |card|/|profile| accept different types | 195 // These outparams are required because |card|/|profile| accept different types |
| 194 // of raw info, and CreditCard doesn't save CVCs. | 196 // of raw info, and CreditCard doesn't save CVCs. |
| 195 void GetBillingInfoFromOutputs(const DetailOutputMap& output, | 197 void GetBillingInfoFromOutputs(const DetailOutputMap& output, |
| 196 CreditCard* card, | 198 CreditCard* card, |
| 197 string16* cvc, | 199 string16* cvc, |
| 198 AutofillProfile* profile) { | 200 AutofillProfile* profile) { |
| 199 for (DetailOutputMap::const_iterator it = output.begin(); | 201 for (DetailOutputMap::const_iterator it = output.begin(); |
| 200 it != output.end(); ++it) { | 202 it != output.end(); ++it) { |
| 201 string16 trimmed; | 203 string16 trimmed; |
| 202 TrimWhitespace(it->second, TRIM_ALL, &trimmed); | 204 TrimWhitespace(it->second, TRIM_ALL, &trimmed); |
| 203 | 205 |
| 204 // Special case CVC as CreditCard just swallows it. | 206 // Special case CVC as CreditCard just swallows it. |
| 205 if (it->first->type == CREDIT_CARD_VERIFICATION_CODE) { | 207 if (it->first->type == CREDIT_CARD_VERIFICATION_CODE) { |
| 206 if (cvc) | 208 if (cvc) |
| 207 cvc->assign(trimmed); | 209 cvc->assign(trimmed); |
| 208 } else if (it->first->type == ADDRESS_HOME_COUNTRY || | 210 } else if (it->first->type == ADDRESS_HOME_COUNTRY || |
| 209 it->first->type == ADDRESS_BILLING_COUNTRY) { | 211 it->first->type == ADDRESS_BILLING_COUNTRY) { |
| 210 if (profile) { | 212 if (profile) { |
| 211 profile->SetInfo(it->first->type, | 213 profile->SetInfo(AutofillType(it->first->type), |
| 212 trimmed, | 214 trimmed, |
| 213 g_browser_process->GetApplicationLocale()); | 215 g_browser_process->GetApplicationLocale()); |
| 214 } | 216 } |
| 215 } else { | 217 } else { |
| 216 // Copy the credit card name to |profile| in addition to |card| as | 218 // Copy the credit card name to |profile| in addition to |card| as |
| 217 // wallet::Instrument requires a recipient name for its billing address. | 219 // wallet::Instrument requires a recipient name for its billing address. |
| 218 if (card && it->first->type == NAME_FULL) | 220 if (card && it->first->type == NAME_FULL) |
| 219 card->SetRawInfo(CREDIT_CARD_NAME, trimmed); | 221 card->SetRawInfo(CREDIT_CARD_NAME, trimmed); |
| 220 | 222 |
| 221 if (IsCreditCardType(it->first->type)) { | 223 if (IsCreditCardType(it->first->type)) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 241 web_contents->GetView()->GetTopLevelNativeWindow(); | 243 web_contents->GetView()->GetTopLevelNativeWindow(); |
| 242 apps::ShellWindow* shell_window = | 244 apps::ShellWindow* shell_window = |
| 243 extensions::ShellWindowRegistry:: | 245 extensions::ShellWindowRegistry:: |
| 244 GetShellWindowForNativeWindowAnyProfile(native_window); | 246 GetShellWindowForNativeWindowAnyProfile(native_window); |
| 245 return shell_window->GetBaseWindow(); | 247 return shell_window->GetBaseWindow(); |
| 246 } | 248 } |
| 247 | 249 |
| 248 // Extracts the string value of a field with |type| from |output|. This is | 250 // Extracts the string value of a field with |type| from |output|. This is |
| 249 // useful when you only need the value of 1 input from a section of view inputs. | 251 // useful when you only need the value of 1 input from a section of view inputs. |
| 250 string16 GetValueForType(const DetailOutputMap& output, | 252 string16 GetValueForType(const DetailOutputMap& output, |
| 251 AutofillFieldType type) { | 253 ServerFieldType type) { |
| 252 for (DetailOutputMap::const_iterator it = output.begin(); | 254 for (DetailOutputMap::const_iterator it = output.begin(); |
| 253 it != output.end(); ++it) { | 255 it != output.end(); ++it) { |
| 254 if (it->first->type == type) | 256 if (it->first->type == type) |
| 255 return it->second; | 257 return it->second; |
| 256 } | 258 } |
| 257 NOTREACHED(); | 259 NOTREACHED(); |
| 258 return string16(); | 260 return string16(); |
| 259 } | 261 } |
| 260 | 262 |
| 261 // Returns a string descriptor for a DialogSection, for use with prefs (do not | 263 // Returns a string descriptor for a DialogSection, for use with prefs (do not |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 } | 309 } |
| 308 | 310 |
| 309 // Returns whether |data_model| is complete, i.e. can fill out all the | 311 // Returns whether |data_model| is complete, i.e. can fill out all the |
| 310 // |requested_fields|, and verified, i.e. not just automatically aggregated. | 312 // |requested_fields|, and verified, i.e. not just automatically aggregated. |
| 311 // Incomplete or unverifed data will not be displayed in the dropdown menu. | 313 // Incomplete or unverifed data will not be displayed in the dropdown menu. |
| 312 bool HasCompleteAndVerifiedData(const AutofillDataModel& data_model, | 314 bool HasCompleteAndVerifiedData(const AutofillDataModel& data_model, |
| 313 const DetailInputs& requested_fields) { | 315 const DetailInputs& requested_fields) { |
| 314 if (!data_model.IsVerified()) | 316 if (!data_model.IsVerified()) |
| 315 return false; | 317 return false; |
| 316 | 318 |
| 317 const std::string app_locale = g_browser_process->GetApplicationLocale(); | |
| 318 for (size_t i = 0; i < requested_fields.size(); ++i) { | 319 for (size_t i = 0; i < requested_fields.size(); ++i) { |
| 319 AutofillFieldType type = requested_fields[i].type; | 320 ServerFieldType type = requested_fields[i].type; |
| 320 if (type != ADDRESS_HOME_LINE2 && | 321 if (type != ADDRESS_HOME_LINE2 && |
| 321 type != CREDIT_CARD_VERIFICATION_CODE && | 322 type != CREDIT_CARD_VERIFICATION_CODE && |
| 322 data_model.GetInfo(type, app_locale).empty()) { | 323 data_model.GetRawInfo(type).empty()) { |
| 323 return false; | 324 return false; |
| 324 } | 325 } |
| 325 } | 326 } |
| 326 | 327 |
| 327 return true; | 328 return true; |
| 328 } | 329 } |
| 329 | 330 |
| 330 // Returns true if |profile| has an invalid address, i.e. an invalid state, zip | 331 // Returns true if |profile| has an invalid address, i.e. an invalid state, zip |
| 331 // code, or phone number. Otherwise returns false. Profiles with invalid | 332 // code, or phone number. Otherwise returns false. Profiles with invalid |
| 332 // addresses are not suggested in the dropdown menu for billing and shipping | 333 // addresses are not suggested in the dropdown menu for billing and shipping |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 | 843 |
| 843 state.strings.push_back(DialogOverlayString()); | 844 state.strings.push_back(DialogOverlayString()); |
| 844 DialogOverlayString& string = state.strings.back(); | 845 DialogOverlayString& string = state.strings.back(); |
| 845 #if !defined(OS_ANDROID) | 846 #if !defined(OS_ANDROID) |
| 846 // gfx::Font isn't implemented on Android; DeriveFont() causes a null deref. | 847 // gfx::Font isn't implemented on Android; DeriveFont() causes a null deref. |
| 847 string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(4); | 848 string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(4); |
| 848 #endif | 849 #endif |
| 849 | 850 |
| 850 // First-run, post-submit, Wallet expository page. | 851 // First-run, post-submit, Wallet expository page. |
| 851 if (full_wallet_ && full_wallet_->required_actions().empty()) { | 852 if (full_wallet_ && full_wallet_->required_actions().empty()) { |
| 852 string16 cc_number = full_wallet_->GetInfo(CREDIT_CARD_NUMBER); | 853 string16 cc_number = |
| 854 full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER)); |
| 853 DCHECK_EQ(16U, cc_number.size()); | 855 DCHECK_EQ(16U, cc_number.size()); |
| 854 state.image = GetGeneratedCardImage( | 856 state.image = GetGeneratedCardImage( |
| 855 ASCIIToUTF16("xxxx xxxx xxxx ") + | 857 ASCIIToUTF16("xxxx xxxx xxxx ") + |
| 856 cc_number.substr(cc_number.size() - 4)); | 858 cc_number.substr(cc_number.size() - 4)); |
| 857 string.text = l10n_util::GetStringUTF16( | 859 string.text = l10n_util::GetStringUTF16( |
| 858 IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); | 860 IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); |
| 859 string.text_color = SK_ColorBLACK; | 861 string.text_color = SK_ColorBLACK; |
| 860 string.alignment = gfx::ALIGN_CENTER; | 862 string.alignment = gfx::ALIGN_CENTER; |
| 861 | 863 |
| 862 state.strings.push_back(DialogOverlayString()); | 864 state.strings.push_back(DialogOverlayString()); |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1190 return requested_cc_billing_fields_; | 1192 return requested_cc_billing_fields_; |
| 1191 case SECTION_SHIPPING: | 1193 case SECTION_SHIPPING: |
| 1192 return requested_shipping_fields_; | 1194 return requested_shipping_fields_; |
| 1193 } | 1195 } |
| 1194 | 1196 |
| 1195 NOTREACHED(); | 1197 NOTREACHED(); |
| 1196 return requested_billing_fields_; | 1198 return requested_billing_fields_; |
| 1197 } | 1199 } |
| 1198 | 1200 |
| 1199 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( | 1201 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( |
| 1200 AutofillFieldType type) { | 1202 ServerFieldType type) { |
| 1201 switch (AutofillType::GetEquivalentFieldType(type)) { | 1203 switch (AutofillType::GetEquivalentFieldType(type)) { |
| 1202 case CREDIT_CARD_EXP_MONTH: | 1204 case CREDIT_CARD_EXP_MONTH: |
| 1203 return &cc_exp_month_combobox_model_; | 1205 return &cc_exp_month_combobox_model_; |
| 1204 | 1206 |
| 1205 case CREDIT_CARD_EXP_4_DIGIT_YEAR: | 1207 case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
| 1206 return &cc_exp_year_combobox_model_; | 1208 return &cc_exp_year_combobox_model_; |
| 1207 | 1209 |
| 1208 case ADDRESS_HOME_COUNTRY: | 1210 case ADDRESS_HOME_COUNTRY: |
| 1209 return &country_combobox_model_; | 1211 return &country_combobox_model_; |
| 1210 | 1212 |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 GetDialogType(), DialogSectionToUiEditEvent(section)); | 1499 GetDialogType(), DialogSectionToUiEditEvent(section)); |
| 1498 } | 1500 } |
| 1499 | 1501 |
| 1500 void AutofillDialogControllerImpl::EditCancelledForSection( | 1502 void AutofillDialogControllerImpl::EditCancelledForSection( |
| 1501 DialogSection section) { | 1503 DialogSection section) { |
| 1502 ResetSectionInput(section); | 1504 ResetSectionInput(section); |
| 1503 UpdateSection(section); | 1505 UpdateSection(section); |
| 1504 } | 1506 } |
| 1505 | 1507 |
| 1506 gfx::Image AutofillDialogControllerImpl::IconForField( | 1508 gfx::Image AutofillDialogControllerImpl::IconForField( |
| 1507 AutofillFieldType type, const string16& user_input) const { | 1509 ServerFieldType type, const string16& user_input) const { |
| 1508 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 1510 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 1509 if (type == CREDIT_CARD_VERIFICATION_CODE) | 1511 if (type == CREDIT_CARD_VERIFICATION_CODE) |
| 1510 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); | 1512 return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); |
| 1511 | 1513 |
| 1512 // For the credit card, we show a few grayscale images, and possibly one | 1514 // For the credit card, we show a few grayscale images, and possibly one |
| 1513 // color image if |user_input| is a valid card number. | 1515 // color image if |user_input| is a valid card number. |
| 1514 if (type == CREDIT_CARD_NUMBER) { | 1516 if (type == CREDIT_CARD_NUMBER) { |
| 1515 const int card_idrs[] = { | 1517 const int card_idrs[] = { |
| 1516 IDR_AUTOFILL_CC_VISA, | 1518 IDR_AUTOFILL_CC_VISA, |
| 1517 IDR_AUTOFILL_CC_MASTERCARD, | 1519 IDR_AUTOFILL_CC_MASTERCARD, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 return gfx::Image(skia); | 1551 return gfx::Image(skia); |
| 1550 } | 1552 } |
| 1551 | 1553 |
| 1552 return gfx::Image(); | 1554 return gfx::Image(); |
| 1553 } | 1555 } |
| 1554 | 1556 |
| 1555 // TODO(estade): Replace all the error messages here with more helpful and | 1557 // TODO(estade): Replace all the error messages here with more helpful and |
| 1556 // translateable ones. TODO(groby): Also add tests. | 1558 // translateable ones. TODO(groby): Also add tests. |
| 1557 string16 AutofillDialogControllerImpl::InputValidityMessage( | 1559 string16 AutofillDialogControllerImpl::InputValidityMessage( |
| 1558 DialogSection section, | 1560 DialogSection section, |
| 1559 AutofillFieldType type, | 1561 ServerFieldType type, |
| 1560 const string16& value) { | 1562 const string16& value) { |
| 1561 // If the field is edited, clear any Wallet errors. | 1563 // If the field is edited, clear any Wallet errors. |
| 1562 if (IsPayingWithWallet()) { | 1564 if (IsPayingWithWallet()) { |
| 1563 WalletValidationErrors::iterator it = wallet_errors_.find(section); | 1565 WalletValidationErrors::iterator it = wallet_errors_.find(section); |
| 1564 if (it != wallet_errors_.end()) { | 1566 if (it != wallet_errors_.end()) { |
| 1565 TypeErrorInputMap::const_iterator iter = it->second.find(type); | 1567 TypeErrorInputMap::const_iterator iter = it->second.find(type); |
| 1566 if (iter != it->second.end()) { | 1568 if (iter != it->second.end()) { |
| 1567 if (iter->second.second == value) | 1569 if (iter->second.second == value) |
| 1568 return iter->second.first; | 1570 return iter->second.first; |
| 1569 it->second.erase(type); | 1571 it->second.erase(type); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1649 base::string16(); | 1651 base::string16(); |
| 1650 } | 1652 } |
| 1651 | 1653 |
| 1652 // TODO(estade): Replace all the error messages here with more helpful and | 1654 // TODO(estade): Replace all the error messages here with more helpful and |
| 1653 // translateable ones. TODO(groby): Also add tests. | 1655 // translateable ones. TODO(groby): Also add tests. |
| 1654 ValidityData AutofillDialogControllerImpl::InputsAreValid( | 1656 ValidityData AutofillDialogControllerImpl::InputsAreValid( |
| 1655 DialogSection section, | 1657 DialogSection section, |
| 1656 const DetailOutputMap& inputs, | 1658 const DetailOutputMap& inputs, |
| 1657 ValidationType validation_type) { | 1659 ValidationType validation_type) { |
| 1658 ValidityData invalid_messages; | 1660 ValidityData invalid_messages; |
| 1659 std::map<AutofillFieldType, string16> field_values; | 1661 std::map<ServerFieldType, string16> field_values; |
| 1660 for (DetailOutputMap::const_iterator iter = inputs.begin(); | 1662 for (DetailOutputMap::const_iterator iter = inputs.begin(); |
| 1661 iter != inputs.end(); ++iter) { | 1663 iter != inputs.end(); ++iter) { |
| 1662 // Skip empty fields in edit mode. | 1664 // Skip empty fields in edit mode. |
| 1663 if (validation_type == VALIDATE_EDIT && iter->second.empty()) | 1665 if (validation_type == VALIDATE_EDIT && iter->second.empty()) |
| 1664 continue; | 1666 continue; |
| 1665 | 1667 |
| 1666 const AutofillFieldType type = iter->first->type; | 1668 const ServerFieldType type = iter->first->type; |
| 1667 string16 message = InputValidityMessage(section, type, iter->second); | 1669 string16 message = InputValidityMessage(section, type, iter->second); |
| 1668 if (!message.empty()) | 1670 if (!message.empty()) |
| 1669 invalid_messages[type] = message; | 1671 invalid_messages[type] = message; |
| 1670 else | 1672 else |
| 1671 field_values[type] = iter->second; | 1673 field_values[type] = iter->second; |
| 1672 } | 1674 } |
| 1673 | 1675 |
| 1674 // Validate the date formed by month and year field. (Autofill dialog is | 1676 // Validate the date formed by month and year field. (Autofill dialog is |
| 1675 // never supposed to have 2-digit years, so not checked). | 1677 // never supposed to have 2-digit years, so not checked). |
| 1676 if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && | 1678 if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1742 | 1744 |
| 1743 // If the user clicks while the popup is already showing, be sure to hide | 1745 // If the user clicks while the popup is already showing, be sure to hide |
| 1744 // it. | 1746 // it. |
| 1745 if (!was_edit && popup_controller_.get()) { | 1747 if (!was_edit && popup_controller_.get()) { |
| 1746 HidePopup(); | 1748 HidePopup(); |
| 1747 return; | 1749 return; |
| 1748 } | 1750 } |
| 1749 | 1751 |
| 1750 std::vector<string16> popup_values, popup_labels, popup_icons; | 1752 std::vector<string16> popup_values, popup_labels, popup_icons; |
| 1751 if (IsCreditCardType(input->type)) { | 1753 if (IsCreditCardType(input->type)) { |
| 1752 GetManager()->GetCreditCardSuggestions(input->type, | 1754 GetManager()->GetCreditCardSuggestions(AutofillType(input->type), |
| 1753 field_contents, | 1755 field_contents, |
| 1754 &popup_values, | 1756 &popup_values, |
| 1755 &popup_labels, | 1757 &popup_labels, |
| 1756 &popup_icons, | 1758 &popup_icons, |
| 1757 &popup_guids_); | 1759 &popup_guids_); |
| 1758 } else { | 1760 } else { |
| 1759 std::vector<AutofillFieldType> field_types; | 1761 std::vector<ServerFieldType> field_types; |
| 1760 field_types.push_back(EMAIL_ADDRESS); | 1762 field_types.push_back(EMAIL_ADDRESS); |
| 1761 for (DetailInputs::const_iterator iter = requested_shipping_fields_.begin(); | 1763 for (DetailInputs::const_iterator iter = requested_shipping_fields_.begin(); |
| 1762 iter != requested_shipping_fields_.end(); ++iter) { | 1764 iter != requested_shipping_fields_.end(); ++iter) { |
| 1763 field_types.push_back(iter->type); | 1765 field_types.push_back(iter->type); |
| 1764 } | 1766 } |
| 1765 GetManager()->GetProfileSuggestions(input->type, | 1767 GetManager()->GetProfileSuggestions(AutofillType(input->type), |
| 1766 field_contents, | 1768 field_contents, |
| 1767 false, | 1769 false, |
| 1768 field_types, | 1770 field_types, |
| 1769 &popup_values, | 1771 &popup_values, |
| 1770 &popup_labels, | 1772 &popup_labels, |
| 1771 &popup_icons, | 1773 &popup_icons, |
| 1772 &popup_guids_); | 1774 &popup_guids_); |
| 1773 } | 1775 } |
| 1774 | 1776 |
| 1775 if (popup_values.empty()) { | 1777 if (popup_values.empty()) { |
| (...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 if (popup_controller_.get()) | 2319 if (popup_controller_.get()) |
| 2318 return popup_controller_->HandleKeyPressEvent(event); | 2320 return popup_controller_->HandleKeyPressEvent(event); |
| 2319 | 2321 |
| 2320 return false; | 2322 return false; |
| 2321 } | 2323 } |
| 2322 | 2324 |
| 2323 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { | 2325 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { |
| 2324 DCHECK_GT(form_structure_.field_count(), 0U); | 2326 DCHECK_GT(form_structure_.field_count(), 0U); |
| 2325 | 2327 |
| 2326 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | 2328 for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
| 2327 if (IsCreditCardType(form_structure_.field(i)->type())) | 2329 if (IsCreditCardType(form_structure_.field(i)->Type().server_type())) |
| 2328 return true; | 2330 return true; |
| 2329 } | 2331 } |
| 2330 | 2332 |
| 2331 return false; | 2333 return false; |
| 2332 } | 2334 } |
| 2333 | 2335 |
| 2334 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { | 2336 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { |
| 2335 return source_url_.SchemeIs(chrome::kHttpsScheme); | 2337 return source_url_.SchemeIs(chrome::kHttpsScheme); |
| 2336 } | 2338 } |
| 2337 | 2339 |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2595 const std::string app_locale = g_browser_process->GetApplicationLocale(); | 2597 const std::string app_locale = g_browser_process->GetApplicationLocale(); |
| 2596 for (size_t i = 0; i < profiles.size(); ++i) { | 2598 for (size_t i = 0; i < profiles.size(); ++i) { |
| 2597 if (!HasCompleteAndVerifiedData(*profiles[i], | 2599 if (!HasCompleteAndVerifiedData(*profiles[i], |
| 2598 requested_shipping_fields_) || | 2600 requested_shipping_fields_) || |
| 2599 HasInvalidAddress(*profiles[i])) { | 2601 HasInvalidAddress(*profiles[i])) { |
| 2600 continue; | 2602 continue; |
| 2601 } | 2603 } |
| 2602 | 2604 |
| 2603 // Add all email addresses. | 2605 // Add all email addresses. |
| 2604 std::vector<string16> values; | 2606 std::vector<string16> values; |
| 2605 profiles[i]->GetMultiInfo(EMAIL_ADDRESS, app_locale, &values); | 2607 profiles[i]->GetMultiInfo( |
| 2608 AutofillType(EMAIL_ADDRESS), app_locale, &values); |
| 2606 for (size_t j = 0; j < values.size(); ++j) { | 2609 for (size_t j = 0; j < values.size(); ++j) { |
| 2607 if (IsValidEmailAddress(values[j])) | 2610 if (IsValidEmailAddress(values[j])) |
| 2608 suggested_email_.AddKeyedItem(profiles[i]->guid(), values[j]); | 2611 suggested_email_.AddKeyedItem(profiles[i]->guid(), values[j]); |
| 2609 } | 2612 } |
| 2610 | 2613 |
| 2611 // Don't add variants for addresses: the email variants are handled above, | 2614 // Don't add variants for addresses: the email variants are handled above, |
| 2612 // name is part of credit card and we'll just ignore phone number | 2615 // name is part of credit card and we'll just ignore phone number |
| 2613 // variants. | 2616 // variants. |
| 2614 suggested_billing_.AddKeyedItem(profiles[i]->guid(), | 2617 suggested_billing_.AddKeyedItem(profiles[i]->guid(), |
| 2615 profiles[i]->Label()); | 2618 profiles[i]->Label()); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 // any of the fields. | 2779 // any of the fields. |
| 2777 if (section == SECTION_SHIPPING) | 2780 if (section == SECTION_SHIPPING) |
| 2778 return cares_about_shipping_; | 2781 return cares_about_shipping_; |
| 2779 | 2782 |
| 2780 return true; | 2783 return true; |
| 2781 } | 2784 } |
| 2782 | 2785 |
| 2783 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) { | 2786 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) { |
| 2784 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | 2787 for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
| 2785 AutofillField* field = form_structure_.field(i); | 2788 AutofillField* field = form_structure_.field(i); |
| 2786 if (field->type() == CREDIT_CARD_VERIFICATION_CODE) { | 2789 if (field->Type().server_type() == CREDIT_CARD_VERIFICATION_CODE) { |
| 2787 field->value = cvc; | 2790 field->value = cvc; |
| 2788 break; | 2791 break; |
| 2789 } | 2792 } |
| 2790 } | 2793 } |
| 2791 } | 2794 } |
| 2792 | 2795 |
| 2793 string16 AutofillDialogControllerImpl::GetValueFromSection( | 2796 string16 AutofillDialogControllerImpl::GetValueFromSection( |
| 2794 DialogSection section, | 2797 DialogSection section, |
| 2795 AutofillFieldType type) { | 2798 ServerFieldType type) { |
| 2796 DCHECK(SectionIsActive(section)); | 2799 DCHECK(SectionIsActive(section)); |
| 2797 | 2800 |
| 2798 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); | 2801 scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); |
| 2799 if (wrapper) | 2802 if (wrapper) |
| 2800 return wrapper->GetInfo(type); | 2803 return wrapper->GetInfo(AutofillType(type)); |
| 2801 | 2804 |
| 2802 DetailOutputMap output; | 2805 DetailOutputMap output; |
| 2803 view_->GetUserInput(section, &output); | 2806 view_->GetUserInput(section, &output); |
| 2804 for (DetailOutputMap::iterator iter = output.begin(); iter != output.end(); | 2807 for (DetailOutputMap::iterator iter = output.begin(); iter != output.end(); |
| 2805 ++iter) { | 2808 ++iter) { |
| 2806 if (iter->first->type == type) | 2809 if (iter->first->type == type) |
| 2807 return iter->second; | 2810 return iter->second; |
| 2808 } | 2811 } |
| 2809 | 2812 |
| 2810 return string16(); | 2813 return string16(); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2967 return false; | 2970 return false; |
| 2968 | 2971 |
| 2969 if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) { | 2972 if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) { |
| 2970 const wallet::WalletItems::MaskedInstrument* instrument = | 2973 const wallet::WalletItems::MaskedInstrument* instrument = |
| 2971 ActiveInstrument(); | 2974 ActiveInstrument(); |
| 2972 const std::string& locale = g_browser_process->GetApplicationLocale(); | 2975 const std::string& locale = g_browser_process->GetApplicationLocale(); |
| 2973 int month_int; | 2976 int month_int; |
| 2974 if (base::StringToInt(month, &month_int) && | 2977 if (base::StringToInt(month, &month_int) && |
| 2975 instrument->status() == | 2978 instrument->status() == |
| 2976 wallet::WalletItems::MaskedInstrument::EXPIRED && | 2979 wallet::WalletItems::MaskedInstrument::EXPIRED && |
| 2977 year == instrument->GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, locale) && | 2980 year == |
| 2981 instrument->GetInfo( |
| 2982 AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) && |
| 2978 month_int == instrument->expiration_month()) { | 2983 month_int == instrument->expiration_month()) { |
| 2979 // Otherwise, if the user is editing an instrument that's deemed expired | 2984 // Otherwise, if the user is editing an instrument that's deemed expired |
| 2980 // by the Online Wallet server, mark it invalid on selection. | 2985 // by the Online Wallet server, mark it invalid on selection. |
| 2981 return false; | 2986 return false; |
| 2982 } | 2987 } |
| 2983 } | 2988 } |
| 2984 | 2989 |
| 2985 return true; | 2990 return true; |
| 2986 } | 2991 } |
| 2987 | 2992 |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3468 view_->GetUserInput(SECTION_CC_BILLING, &output); | 3473 view_->GetUserInput(SECTION_CC_BILLING, &output); |
| 3469 CreditCard card; | 3474 CreditCard card; |
| 3470 GetBillingInfoFromOutputs(output, &card, NULL, NULL); | 3475 GetBillingInfoFromOutputs(output, &card, NULL, NULL); |
| 3471 backing_last_four = card.TypeAndLastFourDigits(); | 3476 backing_last_four = card.TypeAndLastFourDigits(); |
| 3472 } | 3477 } |
| 3473 AutofillCreditCardBubbleController::ShowGeneratedCardUI( | 3478 AutofillCreditCardBubbleController::ShowGeneratedCardUI( |
| 3474 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits()); | 3479 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits()); |
| 3475 } | 3480 } |
| 3476 | 3481 |
| 3477 } // namespace autofill | 3482 } // namespace autofill |
| OLD | NEW |