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

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

Issue 11428071: support CC expiration dates in imperative autocomplete dialog. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: self review Created 8 years 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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.h" 5 #include "chrome/browser/ui/autofill/autofill_dialog_controller.h"
6 6
7 #include "base/string_util.h" 7 #include "base/string_util.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/autofill/autofill_manager.h" 9 #include "chrome/browser/autofill/autofill_manager.h"
10 #include "chrome/browser/autofill/personal_data_manager.h" 10 #include "chrome/browser/autofill/personal_data_manager.h"
11 #include "chrome/browser/autofill/personal_data_manager_factory.h" 11 #include "chrome/browser/autofill/personal_data_manager_factory.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/autofill/autofill_dialog_view.h" 13 #include "chrome/browser/ui/autofill/autofill_dialog_view.h"
14 #include "chrome/common/form_data.h" 14 #include "chrome/common/form_data.h"
15 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
16 16
17 namespace autofill { 17 namespace autofill {
18 18
19 namespace { 19 namespace {
20 20
21 // Returns true if |input| should be shown when |field| has been requeted.
22 bool InputMatchesField(const DetailInput& input,
23 const AutofillField& field) {
24 // If any credit card expiration info is asked for, show both month and year
25 // inputs.
26 if (field.type() == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
27 field.type() == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
28 field.type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
29 field.type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
30 field.type() == CREDIT_CARD_EXP_MONTH) {
31 return input.type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
32 input.type == CREDIT_CARD_EXP_MONTH;
33 }
34
35 return input.type == field.type();
36 }
37
21 // Returns true if |input| should be used for a site-requested |field|. If 38 // Returns true if |input| should be used for a site-requested |field|. If
22 // non-empty, |section_suffix| overrides the section specified by |input|. 39 // non-empty, |section_suffix| overrides the section specified by |input|.
23 bool DetailInputMatchesFieldWithSection(const std::string& section_suffix, 40 bool DetailInputMatchesFieldWithSection(const std::string& section_suffix,
24 const DetailInput& input, 41 const DetailInput& input,
25 const AutofillField& field) { 42 const AutofillField& field) {
26 bool right_section = section_suffix.empty() || 43 bool right_section = section_suffix.empty() ||
27 EndsWith(field.section(), section_suffix, false); 44 EndsWith(field.section(), section_suffix, false);
28 return input.type == field.type() && right_section; 45 return InputMatchesField(input, field) && right_section;
29 } 46 }
30 47
31 // Returns true if |input| should be used for a site-requested |field|. 48 // Returns true if |input| should be used for a site-requested |field|.
32 bool DetailInputMatchesField(const DetailInput& input, 49 bool DetailInputMatchesField(const DetailInput& input,
33 const AutofillField& field) { 50 const AutofillField& field) {
34 std::string section_suffix = input.section_suffix ? input.section_suffix : ""; 51 std::string section_suffix = input.section_suffix ? input.section_suffix : "";
35 return DetailInputMatchesFieldWithSection(section_suffix, input, field); 52 return DetailInputMatchesFieldWithSection(section_suffix, input, field);
36 } 53 }
37 54
38 // Looks through |input_template| for the types in |requested_data|. Appends 55 // Looks through |input_template| for the types in |requested_data|. Appends
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 } 142 }
126 143
127 int row_id = 0; 144 int row_id = 0;
128 145
129 const DetailInput kEmailInputs[] = { 146 const DetailInput kEmailInputs[] = {
130 { ++row_id, EMAIL_ADDRESS, "Email address" }, 147 { ++row_id, EMAIL_ADDRESS, "Email address" },
131 }; 148 };
132 149
133 const DetailInput kCCInputs[] = { 150 const DetailInput kCCInputs[] = {
134 { ++row_id, CREDIT_CARD_NUMBER, "Card number" }, 151 { ++row_id, CREDIT_CARD_NUMBER, "Card number" },
135 { ++row_id, CREDIT_CARD_EXP_2_DIGIT_YEAR, "Expiration MM/YY" }, 152 { ++row_id, CREDIT_CARD_EXP_MONTH },
153 { row_id, CREDIT_CARD_EXP_4_DIGIT_YEAR },
136 { row_id, CREDIT_CARD_VERIFICATION_CODE, "CVC" }, 154 { row_id, CREDIT_CARD_VERIFICATION_CODE, "CVC" },
137 { ++row_id, CREDIT_CARD_NAME, "Cardholder name" }, 155 { ++row_id, CREDIT_CARD_NAME, "Cardholder name" },
138 }; 156 };
139 157
140 const DetailInput kBillingInputs[] = { 158 const DetailInput kBillingInputs[] = {
141 { ++row_id, ADDRESS_HOME_LINE1, "Street address", "billing" }, 159 { ++row_id, ADDRESS_HOME_LINE1, "Street address", "billing" },
142 { ++row_id, ADDRESS_HOME_LINE2, "Street address (optional)", "billing" }, 160 { ++row_id, ADDRESS_HOME_LINE2, "Street address (optional)", "billing" },
143 { ++row_id, ADDRESS_HOME_CITY, "City", "billing" }, 161 { ++row_id, ADDRESS_HOME_CITY, "City", "billing" },
144 { ++row_id, ADDRESS_HOME_STATE, "State", "billing" }, 162 { ++row_id, ADDRESS_HOME_STATE, "State", "billing" },
145 { row_id, ADDRESS_HOME_ZIP, "ZIP code", "billing", 0.5 }, 163 { row_id, ADDRESS_HOME_ZIP, "ZIP code", "billing", 0.5 },
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 case SECTION_BILLING: 272 case SECTION_BILLING:
255 return requested_billing_fields_; 273 return requested_billing_fields_;
256 case SECTION_SHIPPING: 274 case SECTION_SHIPPING:
257 return requested_shipping_fields_; 275 return requested_shipping_fields_;
258 } 276 }
259 277
260 NOTREACHED(); 278 NOTREACHED();
261 return requested_shipping_fields_; 279 return requested_shipping_fields_;
262 } 280 }
263 281
282 ui::ComboboxModel* AutofillDialogController::ComboboxModelForAutofillType(
283 AutofillFieldType type) {
284 switch (type) {
285 case CREDIT_CARD_EXP_MONTH:
286 if (!cc_exp_month_combobox_model_.get())
287 cc_exp_month_combobox_model_.reset(new MonthComboboxModel());
288 return cc_exp_month_combobox_model_.get();
289
290 case CREDIT_CARD_EXP_4_DIGIT_YEAR:
291 if (!cc_exp_year_combobox_model_.get())
292 cc_exp_year_combobox_model_.reset(new YearComboboxModel());
293 return cc_exp_year_combobox_model_.get();
294
295 default:
296 return NULL;
297 }
298 }
299
264 ui::ComboboxModel* AutofillDialogController::ComboboxModelForSection( 300 ui::ComboboxModel* AutofillDialogController::ComboboxModelForSection(
265 DialogSection section) { 301 DialogSection section) {
266 return SuggestionsModelForSection(section); 302 return SuggestionsModelForSection(section);
267 } 303 }
268 304
269 void AutofillDialogController::ViewClosed(DialogAction action) { 305 void AutofillDialogController::ViewClosed(DialogAction action) {
270 if (action == ACTION_SUBMIT) { 306 if (action == ACTION_SUBMIT) {
271 FillOutputForSection(SECTION_EMAIL); 307 FillOutputForSection(SECTION_EMAIL);
272 FillOutputForSection(SECTION_CC); 308 FillOutputForSection(SECTION_CC);
273 FillOutputForSection(SECTION_BILLING); 309 FillOutputForSection(SECTION_BILLING);
274 if (view_->UseBillingForShipping()) { 310 if (view_->UseBillingForShipping()) {
275 FillOutputForSectionWithComparator( 311 FillOutputForSectionWithComparator(
276 SECTION_BILLING, 312 SECTION_BILLING,
277 base::Bind(DetailInputMatchesFieldWithSection, "shipping")); 313 base::Bind(DetailInputMatchesFieldWithSection, "shipping"));
278 } else { 314 } else {
279 FillOutputForSection(SECTION_SHIPPING); 315 FillOutputForSection(SECTION_SHIPPING);
280 } 316 }
281 // TODO(estade): pass the result along to the page. 317 // TODO(estade): pass the result along to the page.
282 } 318 }
283 319
284 callback_.Run(&form_structure_); 320 callback_.Run(&form_structure_);
285 delete this; 321 delete this;
286 } 322 }
287 323
288 void AutofillDialogController::GenerateComboboxModels() { 324 void AutofillDialogController::GenerateComboboxModels() {
289 PersonalDataManager* manager = 325 PersonalDataManager* manager =
290 PersonalDataManagerFactory::GetForProfile(profile_); 326 PersonalDataManagerFactory::GetForProfile(profile_);
291 const std::vector<CreditCard*>& cards = manager->credit_cards(); 327 const std::vector<CreditCard*>& cards = manager->credit_cards();
292 for (size_t i = 0; i < cards.size(); ++i) { 328 for (size_t i = 0; i < cards.size(); ++i) {
293 suggested_cc_.AddItem(cards[i]->Label(), cards[i]->guid()); 329 suggested_cc_.AddItem(cards[i]->guid(), cards[i]->Label());
294 } 330 }
295 suggested_cc_.AddItem(ASCIIToUTF16("Enter new card"), ""); 331 suggested_cc_.AddItem("", ASCIIToUTF16("Enter new card"));
296 332
297 const std::vector<AutofillProfile*>& profiles = manager->profiles(); 333 const std::vector<AutofillProfile*>& profiles = manager->profiles();
298 for (size_t i = 0; i < profiles.size(); ++i) { 334 for (size_t i = 0; i < profiles.size(); ++i) {
299 string16 email = profiles[i]->GetCanonicalizedInfo(EMAIL_ADDRESS); 335 string16 email = profiles[i]->GetCanonicalizedInfo(EMAIL_ADDRESS);
300 if (!email.empty()) 336 if (!email.empty())
301 suggested_email_.AddItem(email, profiles[i]->guid()); 337 suggested_email_.AddItem(profiles[i]->guid(), email);
302 suggested_billing_.AddItem(profiles[i]->Label(), profiles[i]->guid()); 338 suggested_billing_.AddItem(profiles[i]->guid(), profiles[i]->Label());
303 suggested_shipping_.AddItem(profiles[i]->Label(), profiles[i]->guid()); 339 suggested_shipping_.AddItem(profiles[i]->guid(), profiles[i]->Label());
304 } 340 }
305 suggested_billing_.AddItem(ASCIIToUTF16("Enter new billing"), ""); 341 suggested_billing_.AddItem("", ASCIIToUTF16("Enter new billing"));
306 suggested_email_.AddItem(ASCIIToUTF16("Enter new email"), ""); 342 suggested_email_.AddItem("", ASCIIToUTF16("Enter new email"));
307 suggested_shipping_.AddItem(ASCIIToUTF16("Enter new shipping"), ""); 343 suggested_shipping_.AddItem("", ASCIIToUTF16("Enter new shipping"));
308 } 344 }
309 345
310 void AutofillDialogController::PopulateInputsWithGuesses() { 346 void AutofillDialogController::PopulateInputsWithGuesses() {
311 PersonalDataManager* manager = 347 PersonalDataManager* manager =
312 PersonalDataManagerFactory::GetForProfile(profile_); 348 PersonalDataManagerFactory::GetForProfile(profile_);
313 349
314 DetailInputs* profile_inputs[] = { &requested_email_fields_, 350 DetailInputs* profile_inputs[] = { &requested_email_fields_,
315 &requested_billing_fields_ }; 351 &requested_billing_fields_ };
316 const std::vector<AutofillProfile*>& profiles = manager->profiles(); 352 const std::vector<AutofillProfile*>& profiles = manager->profiles();
317 FormGroup* best_profile = 353 FormGroup* best_profile =
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 } 410 }
375 } 411 }
376 } 412 }
377 } 413 }
378 414
379 void AutofillDialogController::FillOutputForSection(DialogSection section) { 415 void AutofillDialogController::FillOutputForSection(DialogSection section) {
380 FillOutputForSectionWithComparator(section, 416 FillOutputForSectionWithComparator(section,
381 base::Bind(DetailInputMatchesField)); 417 base::Bind(DetailInputMatchesField));
382 } 418 }
383 419
384 AutofillDialogController::SuggestionsComboboxModel* AutofillDialogController:: 420 SuggestionsComboboxModel* AutofillDialogController::SuggestionsModelForSection(
385 SuggestionsModelForSection(DialogSection section) { 421 DialogSection section) {
386 switch (section) { 422 switch (section) {
387 case SECTION_EMAIL: 423 case SECTION_EMAIL:
388 return &suggested_email_; 424 return &suggested_email_;
389 case SECTION_CC: 425 case SECTION_CC:
390 return &suggested_cc_; 426 return &suggested_cc_;
391 case SECTION_BILLING: 427 case SECTION_BILLING:
392 return &suggested_billing_; 428 return &suggested_billing_;
393 case SECTION_SHIPPING: 429 case SECTION_SHIPPING:
394 return &suggested_shipping_; 430 return &suggested_shipping_;
395 } 431 }
396 432
397 NOTREACHED(); 433 NOTREACHED();
398 return NULL; 434 return NULL;
399 } 435 }
400 436
401 // SuggestionsComboboxModel ----------------------------------------------------
402
403 AutofillDialogController::SuggestionsComboboxModel::SuggestionsComboboxModel() {
404 }
405
406 AutofillDialogController::SuggestionsComboboxModel::
407 ~SuggestionsComboboxModel() {}
408
409 void AutofillDialogController::SuggestionsComboboxModel::AddItem(
410 const string16& item, const std::string& key) {
411 items_.push_back(std::make_pair(key, item));
412 }
413
414 std::string AutofillDialogController::SuggestionsComboboxModel::GetItemKeyAt(
415 int index) {
416 return items_[index].first;
417 }
418
419 int AutofillDialogController::SuggestionsComboboxModel::GetItemCount() const {
420 return items_.size();
421 }
422
423 string16 AutofillDialogController::SuggestionsComboboxModel::GetItemAt(
424 int index) {
425 return items_[index].second;
426 }
427
428 } // namespace autofill 437 } // namespace autofill
429
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698