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

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

Issue 22040002: [Autofill] Add a separate enumeration for HTML field type hints. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add docs Created 7 years, 4 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
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.native_type() == CREDIT_CARD_EXP_4_DIGIT_YEAR || 118 NativeFieldType native_type = field_type.GetEquivalentNativeType();
119 field_type.native_type() == CREDIT_CARD_EXP_2_DIGIT_YEAR || 119 if (native_type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
120 field_type.native_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR || 120 native_type == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
121 field_type.native_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR || 121 native_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
122 field_type.native_type() == CREDIT_CARD_EXP_MONTH) { 122 native_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
123 native_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.native_type() == CREDIT_CARD_TYPE) 128 if (native_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.native_type(); 131 // Check the groups to distinguish billing types from shipping ones.
132 AutofillType input_type = AutofillType(input.type);
133 return input_type.GetEquivalentNativeType() == native_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.native_type() == CREDIT_CARD_NAME && 145 if (field_type.GetEquivalentNativeType() == 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(NativeFieldType type) { 153 bool IsCreditCardType(NativeFieldType 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 NativeFieldType field_type = 164 NativeFieldType field_type =
161 AutofillType::GetEquivalentBillingFieldType(field.Type().native_type()); 165 AutofillType::GetEquivalentBillingFieldType(
166 field.Type().GetEquivalentNativeType());
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 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 if (!invoked_from_same_origin_) { 532 if (!invoked_from_same_origin_) {
528 GetMetricLogger().LogDialogSecurityMetric( 533 GetMetricLogger().LogDialogSecurityMetric(
529 GetDialogType(), 534 GetDialogType(),
530 AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 535 AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
531 } 536 }
532 537
533 // Determine what field types should be included in the dialog. 538 // Determine what field types should be included in the dialog.
534 bool has_types = false; 539 bool has_types = false;
535 bool has_sections = false; 540 bool has_sections = false;
536 form_structure_.ParseFieldTypesFromAutocompleteAttributes( 541 form_structure_.ParseFieldTypesFromAutocompleteAttributes(
537 FormStructure::PARSE_FOR_AUTOFILL_DIALOG, &has_types, &has_sections); 542 &has_types, &has_sections);
538 543
539 // Fail if the author didn't specify autocomplete types. 544 // Fail if the author didn't specify autocomplete types.
540 if (!has_types) { 545 if (!has_types) {
541 callback_.Run(NULL, std::string()); 546 callback_.Run(NULL, std::string());
542 delete this; 547 delete this;
543 return; 548 return;
544 } 549 }
545 550
546 const DetailInput kEmailInputs[] = { 551 const DetailInput kEmailInputs[] = {
547 { 1, EMAIL_ADDRESS, IDS_AUTOFILL_DIALOG_PLACEHOLDER_EMAIL }, 552 { 1, EMAIL_ADDRESS, IDS_AUTOFILL_DIALOG_PLACEHOLDER_EMAIL },
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 case SECTION_SHIPPING: 1196 case SECTION_SHIPPING:
1192 return requested_shipping_fields_; 1197 return requested_shipping_fields_;
1193 } 1198 }
1194 1199
1195 NOTREACHED(); 1200 NOTREACHED();
1196 return requested_billing_fields_; 1201 return requested_billing_fields_;
1197 } 1202 }
1198 1203
1199 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( 1204 ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType(
1200 NativeFieldType type) { 1205 NativeFieldType type) {
1201 switch (AutofillType::GetEquivalentFieldType(type)) { 1206 switch (type) {
1202 case CREDIT_CARD_EXP_MONTH: 1207 case CREDIT_CARD_EXP_MONTH:
1203 return &cc_exp_month_combobox_model_; 1208 return &cc_exp_month_combobox_model_;
1204 1209
1205 case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1210 case CREDIT_CARD_EXP_4_DIGIT_YEAR:
1206 return &cc_exp_year_combobox_model_; 1211 return &cc_exp_year_combobox_model_;
1207 1212
1208 case ADDRESS_HOME_COUNTRY: 1213 case ADDRESS_HOME_COUNTRY:
1214 case ADDRESS_BILLING_COUNTRY:
1209 return &country_combobox_model_; 1215 return &country_combobox_model_;
1210 1216
1211 default: 1217 default:
1212 return NULL; 1218 return NULL;
1213 } 1219 }
1214 } 1220 }
1215 1221
1216 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( 1222 ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection(
1217 DialogSection section) { 1223 DialogSection section) {
1218 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1224 SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 if (it != wallet_errors_.end()) { 1568 if (it != wallet_errors_.end()) {
1563 TypeErrorInputMap::const_iterator iter = it->second.find(type); 1569 TypeErrorInputMap::const_iterator iter = it->second.find(type);
1564 if (iter != it->second.end()) { 1570 if (iter != it->second.end()) {
1565 if (iter->second.second == value) 1571 if (iter->second.second == value)
1566 return iter->second.first; 1572 return iter->second.first;
1567 it->second.erase(type); 1573 it->second.erase(type);
1568 } 1574 }
1569 } 1575 }
1570 } 1576 }
1571 1577
1572 switch (AutofillType::GetEquivalentFieldType(type)) { 1578 switch (AutofillType(type).GetEquivalentNativeType()) {
1573 case EMAIL_ADDRESS: 1579 case EMAIL_ADDRESS:
1574 if (!value.empty() && !IsValidEmailAddress(value)) { 1580 if (!value.empty() && !IsValidEmailAddress(value)) {
1575 return l10n_util::GetStringUTF16( 1581 return l10n_util::GetStringUTF16(
1576 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); 1582 IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS);
1577 } 1583 }
1578 break; 1584 break;
1579 1585
1580 case CREDIT_CARD_NUMBER: { 1586 case CREDIT_CARD_NUMBER: {
1581 if (!value.empty()) { 1587 if (!value.empty()) {
1582 base::string16 message = CreditCardNumberValidityMessage(value); 1588 base::string16 message = CreditCardNumberValidityMessage(value);
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 if (popup_controller_.get()) 2321 if (popup_controller_.get())
2316 return popup_controller_->HandleKeyPressEvent(event); 2322 return popup_controller_->HandleKeyPressEvent(event);
2317 2323
2318 return false; 2324 return false;
2319 } 2325 }
2320 2326
2321 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { 2327 bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const {
2322 DCHECK_GT(form_structure_.field_count(), 0U); 2328 DCHECK_GT(form_structure_.field_count(), 0U);
2323 2329
2324 for (size_t i = 0; i < form_structure_.field_count(); ++i) { 2330 for (size_t i = 0; i < form_structure_.field_count(); ++i) {
2325 if (IsCreditCardType(form_structure_.field(i)->Type().native_type())) 2331 AutofillType type = form_structure_.field(i)->Type();
2332 if (IsCreditCardType(type.GetEquivalentNativeType()))
2326 return true; 2333 return true;
2327 } 2334 }
2328 2335
2329 return false; 2336 return false;
2330 } 2337 }
2331 2338
2332 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { 2339 bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const {
2333 return source_url_.SchemeIs(chrome::kHttpsScheme); 2340 return source_url_.SchemeIs(chrome::kHttpsScheme);
2334 } 2341 }
2335 2342
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 // any of the fields. 2787 // any of the fields.
2781 if (section == SECTION_SHIPPING) 2788 if (section == SECTION_SHIPPING)
2782 return cares_about_shipping_; 2789 return cares_about_shipping_;
2783 2790
2784 return true; 2791 return true;
2785 } 2792 }
2786 2793
2787 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) { 2794 void AutofillDialogControllerImpl::SetCvcResult(const string16& cvc) {
2788 for (size_t i = 0; i < form_structure_.field_count(); ++i) { 2795 for (size_t i = 0; i < form_structure_.field_count(); ++i) {
2789 AutofillField* field = form_structure_.field(i); 2796 AutofillField* field = form_structure_.field(i);
2790 if (field->Type().native_type() == CREDIT_CARD_VERIFICATION_CODE) { 2797 if (field->Type().GetEquivalentNativeType() ==
2798 CREDIT_CARD_VERIFICATION_CODE) {
2791 field->value = cvc; 2799 field->value = cvc;
2792 break; 2800 break;
2793 } 2801 }
2794 } 2802 }
2795 } 2803 }
2796 2804
2797 string16 AutofillDialogControllerImpl::GetValueFromSection( 2805 string16 AutofillDialogControllerImpl::GetValueFromSection(
2798 DialogSection section, 2806 DialogSection section,
2799 NativeFieldType type) { 2807 NativeFieldType type) {
2800 DCHECK(SectionIsActive(section)); 2808 DCHECK(SectionIsActive(section));
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
3474 view_->GetUserInput(SECTION_CC_BILLING, &output); 3482 view_->GetUserInput(SECTION_CC_BILLING, &output);
3475 CreditCard card; 3483 CreditCard card;
3476 GetBillingInfoFromOutputs(output, &card, NULL, NULL); 3484 GetBillingInfoFromOutputs(output, &card, NULL, NULL);
3477 backing_last_four = card.TypeAndLastFourDigits(); 3485 backing_last_four = card.TypeAndLastFourDigits();
3478 } 3486 }
3479 AutofillCreditCardBubbleController::ShowGeneratedCardUI( 3487 AutofillCreditCardBubbleController::ShowGeneratedCardUI(
3480 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits()); 3488 web_contents(), backing_last_four, full_wallet_->TypeAndLastFourDigits());
3481 } 3489 }
3482 3490
3483 } // namespace autofill 3491 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698