Chromium Code Reviews| OLD | NEW |
|---|---|
| 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" |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 313 FillOutputForSection(SECTION_EMAIL); | 313 FillOutputForSection(SECTION_EMAIL); |
| 314 FillOutputForSection(SECTION_CC); | 314 FillOutputForSection(SECTION_CC); |
| 315 FillOutputForSection(SECTION_BILLING); | 315 FillOutputForSection(SECTION_BILLING); |
| 316 if (view_->UseBillingForShipping()) { | 316 if (view_->UseBillingForShipping()) { |
| 317 FillOutputForSectionWithComparator( | 317 FillOutputForSectionWithComparator( |
| 318 SECTION_BILLING, | 318 SECTION_BILLING, |
| 319 base::Bind(DetailInputMatchesFieldWithSection, "shipping")); | 319 base::Bind(DetailInputMatchesFieldWithSection, "shipping")); |
| 320 } else { | 320 } else { |
| 321 FillOutputForSection(SECTION_SHIPPING); | 321 FillOutputForSection(SECTION_SHIPPING); |
| 322 } | 322 } |
| 323 callback_.Run(&form_structure_); | |
| 324 } else { | |
| 325 callback_.Run(NULL); | |
|
Dan Beam
2012/12/04 03:31:51
this part lgtm :)
| |
| 323 } | 326 } |
| 324 | 327 |
| 325 callback_.Run(&form_structure_); | |
| 326 delete this; | 328 delete this; |
| 327 } | 329 } |
| 328 | 330 |
| 329 void AutofillDialogController::GenerateComboboxModels() { | 331 void AutofillDialogController::GenerateComboboxModels() { |
| 330 PersonalDataManager* manager = | 332 PersonalDataManager* manager = |
| 331 PersonalDataManagerFactory::GetForProfile(profile_); | 333 PersonalDataManagerFactory::GetForProfile(profile_); |
| 332 const std::vector<CreditCard*>& cards = manager->credit_cards(); | 334 const std::vector<CreditCard*>& cards = manager->credit_cards(); |
| 333 for (size_t i = 0; i < cards.size(); ++i) { | 335 for (size_t i = 0; i < cards.size(); ++i) { |
| 334 suggested_cc_.AddItem(cards[i]->guid(), cards[i]->Label()); | 336 suggested_cc_.AddItem(cards[i]->guid(), cards[i]->Label()); |
| 335 } | 337 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 std::string guid = model->GetItemKeyAt(suggestion_selection); | 384 std::string guid = model->GetItemKeyAt(suggestion_selection); |
| 383 PersonalDataManager* manager = | 385 PersonalDataManager* manager = |
| 384 PersonalDataManagerFactory::GetForProfile(profile_); | 386 PersonalDataManagerFactory::GetForProfile(profile_); |
| 385 FormGroup* form_group = section == SECTION_CC ? | 387 FormGroup* form_group = section == SECTION_CC ? |
| 386 static_cast<FormGroup*>(manager->GetCreditCardByGUID(guid)) : | 388 static_cast<FormGroup*>(manager->GetCreditCardByGUID(guid)) : |
| 387 static_cast<FormGroup*>(manager->GetProfileByGUID(guid)); | 389 static_cast<FormGroup*>(manager->GetProfileByGUID(guid)); |
| 388 // TODO(estade): we shouldn't let this happen. | 390 // TODO(estade): we shouldn't let this happen. |
| 389 if (!form_group) | 391 if (!form_group) |
| 390 return; | 392 return; |
| 391 | 393 |
| 392 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | 394 FillFormStructureForSection(*form_group, section, compare); |
| 393 AutofillField* field = form_structure_.field(i); | |
| 394 // Only fill in data that is associated with this section. | |
| 395 const DetailInputs& inputs = RequestedFieldsForSection(section); | |
| 396 for (size_t j = 0; j < inputs.size(); ++j) { | |
| 397 if (compare.Run(inputs[j], *field)) { | |
| 398 form_group->FillFormField(*field, 0, field); | |
| 399 break; | |
| 400 } | |
| 401 } | |
| 402 } | |
| 403 } else { | 395 } else { |
| 404 // The user manually input data. | 396 // The user manually input data. |
| 405 DetailOutputMap output; | 397 DetailOutputMap output; |
| 406 view_->GetUserInput(section, &output); | 398 view_->GetUserInput(section, &output); |
| 407 | 399 |
| 408 // First fill in |form_structure_| to return to the page. | 400 // Save the info as new or edited data, then fill it into |form_structure_|. |
| 409 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | |
| 410 AutofillField* field = form_structure_.field(i); | |
| 411 for (DetailOutputMap::iterator iter = output.begin(); | |
| 412 iter != output.end(); ++iter) { | |
| 413 if (!iter->second.empty() && compare.Run(*iter->first, *field)) { | |
| 414 // TODO(estade): handle select controls and such. Also, canonicalize | |
| 415 // the entered data. | |
| 416 field->value = iter->second; | |
| 417 break; | |
| 418 } | |
| 419 } | |
| 420 } | |
| 421 | |
| 422 // Next, save the info as new or edited data. | |
| 423 PersonalDataManager* manager = | 401 PersonalDataManager* manager = |
| 424 PersonalDataManagerFactory::GetForProfile(profile_); | 402 PersonalDataManagerFactory::GetForProfile(profile_); |
| 425 if (section == SECTION_CC) { | 403 if (section == SECTION_CC) { |
| 426 CreditCard card; | 404 CreditCard card; |
| 427 FillFormGroupFromOutputs(output, &card); | 405 FillFormGroupFromOutputs(output, &card); |
| 428 manager->SaveImportedCreditCard(card); | 406 manager->SaveImportedCreditCard(card); |
| 407 FillFormStructureForSection(card, section, compare); | |
| 408 | |
| 409 // CVC needs special-casing because the CreditCard class doesn't store | |
| 410 // or handle them. Fill it in directly from |output|. | |
| 411 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | |
| 412 AutofillField* field = form_structure_.field(i); | |
| 413 if (field->type() != CREDIT_CARD_VERIFICATION_CODE) | |
| 414 continue; | |
| 415 | |
| 416 for (DetailOutputMap::iterator iter = output.begin(); | |
| 417 iter != output.end(); ++iter) { | |
| 418 if (!iter->second.empty() && compare.Run(*iter->first, *field)) { | |
| 419 field->value = iter->second; | |
| 420 break; | |
| 421 } | |
| 422 } | |
| 423 } | |
| 429 } else { | 424 } else { |
| 430 AutofillProfile profile; | 425 AutofillProfile profile; |
| 431 FillFormGroupFromOutputs(output, &profile); | 426 FillFormGroupFromOutputs(output, &profile); |
| 432 manager->SaveImportedProfile(profile); | 427 manager->SaveImportedProfile(profile); |
| 428 FillFormStructureForSection(profile, section, compare); | |
| 433 } | 429 } |
| 434 } | 430 } |
| 435 } | 431 } |
| 436 | 432 |
| 437 void AutofillDialogController::FillOutputForSection(DialogSection section) { | 433 void AutofillDialogController::FillOutputForSection(DialogSection section) { |
| 438 FillOutputForSectionWithComparator(section, | 434 FillOutputForSectionWithComparator(section, |
| 439 base::Bind(DetailInputMatchesField)); | 435 base::Bind(DetailInputMatchesField)); |
| 440 } | 436 } |
| 441 | 437 |
| 438 void AutofillDialogController::FillFormStructureForSection( | |
| 439 const FormGroup& form_group, | |
| 440 DialogSection section, | |
| 441 const InputFieldComparator& compare) { | |
| 442 for (size_t i = 0; i < form_structure_.field_count(); ++i) { | |
| 443 AutofillField* field = form_structure_.field(i); | |
| 444 // Only fill in data that is associated with this section. | |
| 445 const DetailInputs& inputs = RequestedFieldsForSection(section); | |
| 446 for (size_t j = 0; j < inputs.size(); ++j) { | |
| 447 if (compare.Run(inputs[j], *field)) { | |
| 448 form_group.FillFormField(*field, 0, field); | |
| 449 break; | |
| 450 } | |
| 451 } | |
| 452 } | |
| 453 } | |
| 454 | |
| 442 SuggestionsComboboxModel* AutofillDialogController::SuggestionsModelForSection( | 455 SuggestionsComboboxModel* AutofillDialogController::SuggestionsModelForSection( |
| 443 DialogSection section) { | 456 DialogSection section) { |
| 444 switch (section) { | 457 switch (section) { |
| 445 case SECTION_EMAIL: | 458 case SECTION_EMAIL: |
| 446 return &suggested_email_; | 459 return &suggested_email_; |
| 447 case SECTION_CC: | 460 case SECTION_CC: |
| 448 return &suggested_cc_; | 461 return &suggested_cc_; |
| 449 case SECTION_BILLING: | 462 case SECTION_BILLING: |
| 450 return &suggested_billing_; | 463 return &suggested_billing_; |
| 451 case SECTION_SHIPPING: | 464 case SECTION_SHIPPING: |
| 452 return &suggested_shipping_; | 465 return &suggested_shipping_; |
| 453 } | 466 } |
| 454 | 467 |
| 455 NOTREACHED(); | 468 NOTREACHED(); |
| 456 return NULL; | 469 return NULL; |
| 457 } | 470 } |
| 458 | 471 |
| 459 } // namespace autofill | 472 } // namespace autofill |
| OLD | NEW |