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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 const AutofillType& 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.server_type() == CREDIT_CARD_EXP_4_DIGIT_YEAR || | 118 ServerFieldType server_type = field_type.GetStorableType(); |
119 field_type.server_type() == CREDIT_CARD_EXP_2_DIGIT_YEAR || | 119 if (server_type == CREDIT_CARD_EXP_4_DIGIT_YEAR || |
120 field_type.server_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR || | 120 server_type == CREDIT_CARD_EXP_2_DIGIT_YEAR || |
121 field_type.server_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR || | 121 server_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR || |
122 field_type.server_type() == CREDIT_CARD_EXP_MONTH) { | 122 server_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR || |
| 123 server_type == CREDIT_CARD_EXP_MONTH) { |
123 return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR || | 124 return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR || |
124 input.type == CREDIT_CARD_EXP_MONTH; | 125 input.type == CREDIT_CARD_EXP_MONTH; |
125 } | 126 } |
126 | 127 |
127 if (field_type.server_type() == CREDIT_CARD_TYPE) | 128 if (server_type == CREDIT_CARD_TYPE) |
128 return input.type == CREDIT_CARD_NUMBER; | 129 return input.type == CREDIT_CARD_NUMBER; |
129 | 130 |
130 return input.type == field_type.server_type(); | 131 // Check the groups to distinguish billing types from shipping ones. |
| 132 AutofillType input_type = AutofillType(input.type); |
| 133 return input_type.GetStorableType() == server_type && |
| 134 input_type.group() == field_type.group(); |
131 } | 135 } |
132 | 136 |
133 // Returns true if |input| in the given |section| should be used for a | 137 // Returns true if |input| in the given |section| should be used for a |
134 // site-requested |field|. | 138 // site-requested |field|. |
135 bool DetailInputMatchesField(DialogSection section, | 139 bool DetailInputMatchesField(DialogSection section, |
136 const DetailInput& input, | 140 const DetailInput& input, |
137 const AutofillField& field) { | 141 const AutofillField& field) { |
138 AutofillType field_type = field.Type(); | 142 AutofillType field_type = field.Type(); |
139 | 143 |
140 // The credit card name is filled from the billing section's data. | 144 // The credit card name is filled from the billing section's data. |
141 if (field_type.server_type() == CREDIT_CARD_NAME && | 145 if (field_type.GetStorableType() == CREDIT_CARD_NAME && |
142 (section == SECTION_BILLING || section == SECTION_CC_BILLING)) { | 146 (section == SECTION_BILLING || section == SECTION_CC_BILLING)) { |
143 return input.type == NAME_BILLING_FULL; | 147 return input.type == NAME_BILLING_FULL; |
144 } | 148 } |
145 | 149 |
146 return InputTypeMatchesFieldType(input, field_type); | 150 return InputTypeMatchesFieldType(input, field_type); |
147 } | 151 } |
148 | 152 |
149 bool IsCreditCardType(ServerFieldType type) { | 153 bool IsCreditCardType(ServerFieldType type) { |
150 return AutofillType(type).group() == CREDIT_CARD; | 154 return AutofillType(type).group() == CREDIT_CARD; |
151 } | 155 } |
152 | 156 |
153 // Returns true if |input| should be used to fill a site-requested |field| which | 157 // Returns true if |input| should be used to fill a site-requested |field| which |
154 // is notated with a "shipping" tag, for use when the user has decided to use | 158 // is notated with a "shipping" tag, for use when the user has decided to use |
155 // the billing address as the shipping address. | 159 // the billing address as the shipping address. |
156 bool DetailInputMatchesShippingField(const DetailInput& input, | 160 bool DetailInputMatchesShippingField(const DetailInput& input, |
157 const AutofillField& field) { | 161 const AutofillField& field) { |
158 // Equivalent billing field type is used to support UseBillingAsShipping | 162 // Equivalent billing field type is used to support UseBillingAsShipping |
159 // usecase. | 163 // usecase. |
160 ServerFieldType field_type = | 164 ServerFieldType field_type = |
161 AutofillType::GetEquivalentBillingFieldType(field.Type().server_type()); | 165 AutofillType::GetEquivalentBillingFieldType( |
| 166 field.Type().GetStorableType()); |
162 | 167 |
163 return InputTypeMatchesFieldType(input, AutofillType(field_type)); | 168 return InputTypeMatchesFieldType(input, AutofillType(field_type)); |
164 } | 169 } |
165 | 170 |
166 // Constructs |inputs| from template data. | 171 // Constructs |inputs| from template data. |
167 void BuildInputs(const DetailInput* input_template, | 172 void BuildInputs(const DetailInput* input_template, |
168 size_t template_size, | 173 size_t template_size, |
169 DetailInputs* inputs) { | 174 DetailInputs* inputs) { |
170 for (size_t i = 0; i < template_size; ++i) { | 175 for (size_t i = 0; i < template_size; ++i) { |
171 const DetailInput* input = &input_template[i]; | 176 const DetailInput* input = &input_template[i]; |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 if (!invoked_from_same_origin_) { | 534 if (!invoked_from_same_origin_) { |
530 GetMetricLogger().LogDialogSecurityMetric( | 535 GetMetricLogger().LogDialogSecurityMetric( |
531 GetDialogType(), | 536 GetDialogType(), |
532 AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); | 537 AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); |
533 } | 538 } |
534 | 539 |
535 // Determine what field types should be included in the dialog. | 540 // Determine what field types should be included in the dialog. |
536 bool has_types = false; | 541 bool has_types = false; |
537 bool has_sections = false; | 542 bool has_sections = false; |
538 form_structure_.ParseFieldTypesFromAutocompleteAttributes( | 543 form_structure_.ParseFieldTypesFromAutocompleteAttributes( |
539 FormStructure::PARSE_FOR_AUTOFILL_DIALOG, &has_types, &has_sections); | 544 &has_types, &has_sections); |
540 | 545 |
541 // Fail if the author didn't specify autocomplete types. | 546 // Fail if the author didn't specify autocomplete types. |
542 if (!has_types) { | 547 if (!has_types) { |
543 callback_.Run(NULL, std::string()); | 548 callback_.Run(NULL, std::string()); |
544 delete this; | 549 delete this; |
545 return; | 550 return; |
546 } | 551 } |
547 | 552 |
548 const DetailInput kEmailInputs[] = { | 553 const DetailInput kEmailInputs[] = { |
549 { 1, EMAIL_ADDRESS, IDS_AUTOFILL_DIALOG_PLACEHOLDER_EMAIL }, | 554 { 1, EMAIL_ADDRESS, IDS_AUTOFILL_DIALOG_PLACEHOLDER_EMAIL }, |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 case SECTION_SHIPPING: | 1198 case SECTION_SHIPPING: |
1194 return requested_shipping_fields_; | 1199 return requested_shipping_fields_; |
1195 } | 1200 } |
1196 | 1201 |
1197 NOTREACHED(); | 1202 NOTREACHED(); |
1198 return requested_billing_fields_; | 1203 return requested_billing_fields_; |
1199 } | 1204 } |
1200 | 1205 |
1201 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( | 1206 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( |
1202 ServerFieldType type) { | 1207 ServerFieldType type) { |
1203 switch (AutofillType::GetEquivalentFieldType(type)) { | 1208 switch (type) { |
1204 case CREDIT_CARD_EXP_MONTH: | 1209 case CREDIT_CARD_EXP_MONTH: |
1205 return &cc_exp_month_combobox_model_; | 1210 return &cc_exp_month_combobox_model_; |
1206 | 1211 |
1207 case CREDIT_CARD_EXP_4_DIGIT_YEAR: | 1212 case CREDIT_CARD_EXP_4_DIGIT_YEAR: |
1208 return &cc_exp_year_combobox_model_; | 1213 return &cc_exp_year_combobox_model_; |
1209 | 1214 |
1210 case ADDRESS_HOME_COUNTRY: | 1215 case ADDRESS_HOME_COUNTRY: |
| 1216 case ADDRESS_BILLING_COUNTRY: |
1211 return &country_combobox_model_; | 1217 return &country_combobox_model_; |
1212 | 1218 |
1213 default: | 1219 default: |
1214 return NULL; | 1220 return NULL; |
1215 } | 1221 } |
1216 } | 1222 } |
1217 | 1223 |
1218 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( | 1224 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( |
1219 DialogSection section) { | 1225 DialogSection section) { |
1220 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); | 1226 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1566 if (it != wallet_errors_.end()) { | 1572 if (it != wallet_errors_.end()) { |
1567 TypeErrorInputMap::const_iterator iter = it->second.find(type); | 1573 TypeErrorInputMap::const_iterator iter = it->second.find(type); |
1568 if (iter != it->second.end()) { | 1574 if (iter != it->second.end()) { |
1569 if (iter->second.second == value) | 1575 if (iter->second.second == value) |
1570 return iter->second.first; | 1576 return iter->second.first; |
1571 it->second.erase(type); | 1577 it->second.erase(type); |
1572 } | 1578 } |
1573 } | 1579 } |
1574 } | 1580 } |
1575 | 1581 |
1576 switch (AutofillType::GetEquivalentFieldType(type)) { | 1582 switch (AutofillType(type).GetStorableType()) { |
1577 case EMAIL_ADDRESS: | 1583 case EMAIL_ADDRESS: |
1578 if (!value.empty() && !IsValidEmailAddress(value)) { | 1584 if (!value.empty() && !IsValidEmailAddress(value)) { |
1579 return l10n_util::GetStringUTF16( | 1585 return l10n_util::GetStringUTF16( |
1580 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); | 1586 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); |
1581 } | 1587 } |
1582 break; | 1588 break; |
1583 | 1589 |
1584 case CREDIT_CARD_NUMBER: { | 1590 case CREDIT_CARD_NUMBER: { |
1585 if (!value.empty()) { | 1591 if (!value.empty()) { |
1586 base::string16 message = CreditCardNumberValidityMessage(value); | 1592 base::string16 message = CreditCardNumberValidityMessage(value); |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2319 if (popup_controller_.get()) | 2325 if (popup_controller_.get()) |
2320 return popup_controller_->HandleKeyPressEvent(event); | 2326 return popup_controller_->HandleKeyPressEvent(event); |
2321 | 2327 |
2322 return false; | 2328 return false; |
2323 } | 2329 } |
2324 | 2330 |
2325 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { | 2331 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { |
2326 DCHECK_GT(form_structure_.field_count(), 0U); | 2332 DCHECK_GT(form_structure_.field_count(), 0U); |
2327 | 2333 |
2328 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | 2334 for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
2329 if (IsCreditCardType(form_structure_.field(i)->Type().server_type())) | 2335 AutofillType type = form_structure_.field(i)->Type(); |
| 2336 if (IsCreditCardType(type.GetStorableType())) |
2330 return true; | 2337 return true; |
2331 } | 2338 } |
2332 | 2339 |
2333 return false; | 2340 return false; |
2334 } | 2341 } |
2335 | 2342 |
2336 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { | 2343 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { |
2337 return source_url_.SchemeIs(chrome::kHttpsScheme); | 2344 return source_url_.SchemeIs(chrome::kHttpsScheme); |
2338 } | 2345 } |
2339 | 2346 |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2779 // any of the fields. | 2786 // any of the fields. |
2780 if (section == SECTION_SHIPPING) | 2787 if (section == SECTION_SHIPPING) |
2781 return cares_about_shipping_; | 2788 return cares_about_shipping_; |
2782 | 2789 |
2783 return true; | 2790 return true; |
2784 } | 2791 } |
2785 | 2792 |
2786 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) { | 2793 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) { |
2787 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | 2794 for (size_t i = 0; i < form_structure_.field_count(); ++i) { |
2788 AutofillField* field = form_structure_.field(i); | 2795 AutofillField* field = form_structure_.field(i); |
2789 if (field->Type().server_type() == CREDIT_CARD_VERIFICATION_CODE) { | 2796 if (field->Type().GetStorableType() == CREDIT_CARD_VERIFICATION_CODE) { |
2790 field->value = cvc; | 2797 field->value = cvc; |
2791 break; | 2798 break; |
2792 } | 2799 } |
2793 } | 2800 } |
2794 } | 2801 } |
2795 | 2802 |
2796 string16 AutofillDialogControllerImpl::GetValueFromSection( | 2803 string16 AutofillDialogControllerImpl::GetValueFromSection( |
2797 DialogSection section, | 2804 DialogSection section, |
2798 ServerFieldType type) { | 2805 ServerFieldType type) { |
2799 DCHECK(SectionIsActive(section)); | 2806 DCHECK(SectionIsActive(section)); |
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3473 view_->GetUserInput(SECTION_CC_BILLING, &output); | 3480 view_->GetUserInput(SECTION_CC_BILLING, &output); |
3474 CreditCard card; | 3481 CreditCard card; |
3475 GetBillingInfoFromOutputs(output, &card, NULL, NULL); | 3482 GetBillingInfoFromOutputs(output, &card, NULL, NULL); |
3476 backing_last_four = card.TypeAndLastFourDigits(); | 3483 backing_last_four = card.TypeAndLastFourDigits(); |
3477 } | 3484 } |
3478 AutofillCreditCardBubbleController::ShowGeneratedCardUI( | 3485 AutofillCreditCardBubbleController::ShowGeneratedCardUI( |
3479 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits()); | 3486 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits()); |
3480 } | 3487 } |
3481 | 3488 |
3482 } // namespace autofill | 3489 } // namespace autofill |
OLD | NEW |