OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/autofill/autofill_manager.h" | 5 #include "chrome/browser/autofill/autofill_manager.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 std::vector<int> unique_ids; | 324 std::vector<int> unique_ids; |
325 | 325 |
326 RenderViewHost* host = NULL; | 326 RenderViewHost* host = NULL; |
327 FormStructure* form_structure = NULL; | 327 FormStructure* form_structure = NULL; |
328 AutofillField* autofill_field = NULL; | 328 AutofillField* autofill_field = NULL; |
329 if (GetHost( | 329 if (GetHost( |
330 personal_data_->profiles(), personal_data_->credit_cards(), &host) && | 330 personal_data_->profiles(), personal_data_->credit_cards(), &host) && |
331 FindCachedFormAndField(form, field, &form_structure, &autofill_field) && | 331 FindCachedFormAndField(form, field, &form_structure, &autofill_field) && |
332 // Don't send suggestions for forms that aren't auto-fillable. | 332 // Don't send suggestions for forms that aren't auto-fillable. |
333 form_structure->IsAutoFillable(false)) { | 333 form_structure->IsAutoFillable(false)) { |
334 AutofillType type(autofill_field->type()); | 334 AutofillFieldType type = autofill_field->type(); |
335 bool is_filling_credit_card = (type.group() == AutofillType::CREDIT_CARD); | 335 bool is_filling_credit_card = |
| 336 (AutofillType(type).group() == AutofillType::CREDIT_CARD); |
336 if (is_filling_credit_card) { | 337 if (is_filling_credit_card) { |
337 GetCreditCardSuggestions( | 338 GetCreditCardSuggestions( |
338 form_structure, field, type, &values, &labels, &icons, &unique_ids); | 339 form_structure, field, type, &values, &labels, &icons, &unique_ids); |
339 } else { | 340 } else { |
340 GetProfileSuggestions( | 341 GetProfileSuggestions( |
341 form_structure, field, type, &values, &labels, &icons, &unique_ids); | 342 form_structure, field, type, &values, &labels, &icons, &unique_ids); |
342 } | 343 } |
343 | 344 |
344 DCHECK_EQ(values.size(), labels.size()); | 345 DCHECK_EQ(values.size(), labels.size()); |
345 DCHECK_EQ(values.size(), icons.size()); | 346 DCHECK_EQ(values.size(), icons.size()); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 §ion_start, §ion_end); | 444 §ion_start, §ion_end); |
444 | 445 |
445 FormData result = form; | 446 FormData result = form; |
446 | 447 |
447 // If the relevant section is auto-filled, we should fill |field| but not the | 448 // If the relevant section is auto-filled, we should fill |field| but not the |
448 // rest of the form. | 449 // rest of the form. |
449 if (SectionIsAutoFilled(form_structure, form, section_start, section_end)) { | 450 if (SectionIsAutoFilled(form_structure, form, section_start, section_end)) { |
450 for (std::vector<FormField>::iterator iter = result.fields.begin(); | 451 for (std::vector<FormField>::iterator iter = result.fields.begin(); |
451 iter != result.fields.end(); ++iter) { | 452 iter != result.fields.end(); ++iter) { |
452 if ((*iter) == field) { | 453 if ((*iter) == field) { |
453 AutofillType autofill_type(autofill_field->type()); | 454 AutofillFieldType field_type = autofill_field->type(); |
454 if (profile) { | 455 if (profile) { |
455 DCHECK_NE(AutofillType::CREDIT_CARD, autofill_type.group()); | 456 DCHECK_NE(AutofillType::CREDIT_CARD, |
456 FillFormField(profile, autofill_type, &(*iter)); | 457 AutofillType(field_type).group()); |
| 458 FillFormField(profile, field_type, &(*iter)); |
457 } else { | 459 } else { |
458 DCHECK_EQ(AutofillType::CREDIT_CARD, autofill_type.group()); | 460 DCHECK_EQ(AutofillType::CREDIT_CARD, |
459 FillCreditCardFormField(credit_card, autofill_type, &(*iter)); | 461 AutofillType(field_type).group()); |
| 462 FillCreditCardFormField(credit_card, field_type, &(*iter)); |
460 } | 463 } |
461 break; | 464 break; |
462 } | 465 } |
463 } | 466 } |
464 | 467 |
465 host->Send(new AutoFillMsg_FormDataFilled(host->routing_id(), query_id, | 468 host->Send(new AutoFillMsg_FormDataFilled(host->routing_id(), query_id, |
466 result)); | 469 result)); |
467 return; | 470 return; |
468 } | 471 } |
469 | 472 |
(...skipping 11 matching lines...) Expand all Loading... |
481 // Search forward in the |form_structure| for a corresponding field. | 484 // Search forward in the |form_structure| for a corresponding field. |
482 while (k < section_end && *form_structure->field(k) != result.fields[j]) { | 485 while (k < section_end && *form_structure->field(k) != result.fields[j]) { |
483 k++; | 486 k++; |
484 } | 487 } |
485 | 488 |
486 // If we've found a match then fill the |result| field with the found | 489 // If we've found a match then fill the |result| field with the found |
487 // field in the |form_structure|. | 490 // field in the |form_structure|. |
488 if (k >= section_end) | 491 if (k >= section_end) |
489 continue; | 492 continue; |
490 | 493 |
491 AutofillType autofill_type(form_structure->field(k)->type()); | 494 AutofillFieldType field_type = form_structure->field(k)->type(); |
492 if (autofill_type.group() != AutofillType::NO_GROUP) { | 495 FieldTypeGroup field_group_type = AutofillType(field_type).group(); |
| 496 if (field_group_type != AutofillType::NO_GROUP) { |
493 if (profile) { | 497 if (profile) { |
494 DCHECK_NE(AutofillType::CREDIT_CARD, autofill_type.group()); | 498 DCHECK_NE(AutofillType::CREDIT_CARD, field_group_type); |
495 FillFormField(profile, autofill_type, &result.fields[j]); | 499 FillFormField(profile, field_type, &result.fields[j]); |
496 } else { | 500 } else { |
497 DCHECK_EQ(AutofillType::CREDIT_CARD, autofill_type.group()); | 501 DCHECK_EQ(AutofillType::CREDIT_CARD, field_group_type); |
498 FillCreditCardFormField(credit_card, autofill_type, &result.fields[j]); | 502 FillCreditCardFormField(credit_card, field_type, &result.fields[j]); |
499 } | 503 } |
500 } | 504 } |
501 | 505 |
502 // We found a matching field in the |form_structure| so we | 506 // We found a matching field in the |form_structure| so we |
503 // proceed to the next |result| field, and the next |form_structure|. | 507 // proceed to the next |result| field, and the next |form_structure|. |
504 ++i; | 508 ++i; |
505 } | 509 } |
506 autofilled_forms_signatures_.push_front(form_structure->FormSignature()); | 510 autofilled_forms_signatures_.push_front(form_structure->FormSignature()); |
507 | 511 |
508 host->Send(new AutoFillMsg_FormDataFilled( | 512 host->Send(new AutoFillMsg_FormDataFilled( |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 } | 721 } |
718 | 722 |
719 if (!(*autofill_field)) | 723 if (!(*autofill_field)) |
720 return false; | 724 return false; |
721 | 725 |
722 return true; | 726 return true; |
723 } | 727 } |
724 | 728 |
725 void AutofillManager::GetProfileSuggestions(FormStructure* form, | 729 void AutofillManager::GetProfileSuggestions(FormStructure* form, |
726 const FormField& field, | 730 const FormField& field, |
727 AutofillType type, | 731 AutofillFieldType type, |
728 std::vector<string16>* values, | 732 std::vector<string16>* values, |
729 std::vector<string16>* labels, | 733 std::vector<string16>* labels, |
730 std::vector<string16>* icons, | 734 std::vector<string16>* icons, |
731 std::vector<int>* unique_ids) { | 735 std::vector<int>* unique_ids) { |
732 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles(); | 736 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles(); |
733 std::vector<AutofillProfile*> matched_profiles; | 737 std::vector<AutofillProfile*> matched_profiles; |
734 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); | 738 for (std::vector<AutofillProfile*>::const_iterator iter = profiles.begin(); |
735 iter != profiles.end(); ++iter) { | 739 iter != profiles.end(); ++iter) { |
736 AutofillProfile* profile = *iter; | 740 AutofillProfile* profile = *iter; |
737 | 741 |
(...skipping 13 matching lines...) Expand all Loading... |
751 for (std::vector<AutofillField*>::const_iterator iter = form->begin(); | 755 for (std::vector<AutofillField*>::const_iterator iter = form->begin(); |
752 iter != form->end(); ++iter) { | 756 iter != form->end(); ++iter) { |
753 // The field list is terminated with a NULL AutofillField, so don't try to | 757 // The field list is terminated with a NULL AutofillField, so don't try to |
754 // dereference it. | 758 // dereference it. |
755 if (!*iter) | 759 if (!*iter) |
756 break; | 760 break; |
757 form_fields.push_back((*iter)->type()); | 761 form_fields.push_back((*iter)->type()); |
758 } | 762 } |
759 | 763 |
760 AutofillProfile::CreateInferredLabels(&matched_profiles, &form_fields, | 764 AutofillProfile::CreateInferredLabels(&matched_profiles, &form_fields, |
761 type.field_type(), 1, labels); | 765 type, 1, labels); |
762 | 766 |
763 // No icons for profile suggestions. | 767 // No icons for profile suggestions. |
764 icons->resize(values->size()); | 768 icons->resize(values->size()); |
765 } | 769 } |
766 | 770 |
767 void AutofillManager::GetCreditCardSuggestions(FormStructure* form, | 771 void AutofillManager::GetCreditCardSuggestions(FormStructure* form, |
768 const FormField& field, | 772 const FormField& field, |
769 AutofillType type, | 773 AutofillFieldType type, |
770 std::vector<string16>* values, | 774 std::vector<string16>* values, |
771 std::vector<string16>* labels, | 775 std::vector<string16>* labels, |
772 std::vector<string16>* icons, | 776 std::vector<string16>* icons, |
773 std::vector<int>* unique_ids) { | 777 std::vector<int>* unique_ids) { |
774 for (std::vector<CreditCard*>::const_iterator iter = | 778 for (std::vector<CreditCard*>::const_iterator iter = |
775 personal_data_->credit_cards().begin(); | 779 personal_data_->credit_cards().begin(); |
776 iter != personal_data_->credit_cards().end(); ++iter) { | 780 iter != personal_data_->credit_cards().end(); ++iter) { |
777 CreditCard* credit_card = *iter; | 781 CreditCard* credit_card = *iter; |
778 | 782 |
779 // The value of the stored data for this field type in the |credit_card|. | 783 // The value of the stored data for this field type in the |credit_card|. |
780 string16 creditcard_field_value = credit_card->GetFieldText(type); | 784 string16 creditcard_field_value = credit_card->GetFieldText(type); |
781 if (!creditcard_field_value.empty() && | 785 if (!creditcard_field_value.empty() && |
782 StartsWith(creditcard_field_value, field.value, false)) { | 786 StartsWith(creditcard_field_value, field.value, false)) { |
783 if (type.field_type() == CREDIT_CARD_NUMBER) | 787 if (type == CREDIT_CARD_NUMBER) |
784 creditcard_field_value = credit_card->ObfuscatedNumber(); | 788 creditcard_field_value = credit_card->ObfuscatedNumber(); |
785 | 789 |
786 string16 label; | 790 string16 label; |
787 if (credit_card->number().empty()) { | 791 if (credit_card->number().empty()) { |
788 // If there is no CC number, return name to show something. | 792 // If there is no CC number, return name to show something. |
789 label = credit_card->GetFieldText(AutofillType(CREDIT_CARD_NAME)); | 793 label = credit_card->GetFieldText(CREDIT_CARD_NAME); |
790 } else { | 794 } else { |
791 label = kCreditCardPrefix; | 795 label = kCreditCardPrefix; |
792 label.append(credit_card->LastFourDigits()); | 796 label.append(credit_card->LastFourDigits()); |
793 } | 797 } |
794 | 798 |
795 values->push_back(creditcard_field_value); | 799 values->push_back(creditcard_field_value); |
796 labels->push_back(label); | 800 labels->push_back(label); |
797 icons->push_back(credit_card->type()); | 801 icons->push_back(credit_card->type()); |
798 unique_ids->push_back(PackGUIDs(credit_card->guid(), std::string())); | 802 unique_ids->push_back(PackGUIDs(credit_card->guid(), std::string())); |
799 } | 803 } |
800 } | 804 } |
801 } | 805 } |
802 | 806 |
803 void AutofillManager::FillCreditCardFormField(const CreditCard* credit_card, | 807 void AutofillManager::FillCreditCardFormField(const CreditCard* credit_card, |
804 AutofillType type, | 808 AutofillFieldType type, |
805 webkit_glue::FormField* field) { | 809 webkit_glue::FormField* field) { |
806 DCHECK(credit_card); | 810 DCHECK(credit_card); |
807 DCHECK_EQ(AutofillType::CREDIT_CARD, type.group()); | 811 DCHECK_EQ(AutofillType::CREDIT_CARD, AutofillType(type).group()); |
808 DCHECK(field); | 812 DCHECK(field); |
809 | 813 |
810 if (field->form_control_type == ASCIIToUTF16("select-one")) { | 814 if (field->form_control_type == ASCIIToUTF16("select-one")) { |
811 autofill::FillSelectControl(*credit_card, type, field); | 815 autofill::FillSelectControl(*credit_card, type, field); |
812 } else if (field->form_control_type == ASCIIToUTF16("month")) { | 816 } else if (field->form_control_type == ASCIIToUTF16("month")) { |
813 // HTML5 input="month" consists of year-month. | 817 // HTML5 input="month" consists of year-month. |
814 string16 year = credit_card->GetFieldText( | 818 string16 year = credit_card->GetFieldText(CREDIT_CARD_EXP_4_DIGIT_YEAR); |
815 AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 819 string16 month = credit_card->GetFieldText(CREDIT_CARD_EXP_MONTH); |
816 string16 month = credit_card->GetFieldText( | |
817 AutofillType(CREDIT_CARD_EXP_MONTH)); | |
818 if (!year.empty() && !month.empty()) { | 820 if (!year.empty() && !month.empty()) { |
819 // Fill the value only if |credit_card| includes both year and month | 821 // Fill the value only if |credit_card| includes both year and month |
820 // information. | 822 // information. |
821 field->value = year + ASCIIToUTF16("-") + month; | 823 field->value = year + ASCIIToUTF16("-") + month; |
822 } | 824 } |
823 } else { | 825 } else { |
824 field->value = credit_card->GetFieldText(type); | 826 field->value = credit_card->GetFieldText(type); |
825 } | 827 } |
826 } | 828 } |
827 | 829 |
828 void AutofillManager::FillFormField(const AutofillProfile* profile, | 830 void AutofillManager::FillFormField(const AutofillProfile* profile, |
829 AutofillType type, | 831 AutofillFieldType type, |
830 webkit_glue::FormField* field) { | 832 webkit_glue::FormField* field) { |
831 DCHECK(profile); | 833 DCHECK(profile); |
832 DCHECK_NE(AutofillType::CREDIT_CARD, type.group()); | 834 DCHECK_NE(AutofillType::CREDIT_CARD, AutofillType(type).group()); |
833 DCHECK(field); | 835 DCHECK(field); |
834 | 836 |
835 if (type.subgroup() == AutofillType::PHONE_NUMBER) { | 837 if (AutofillType(type).subgroup() == AutofillType::PHONE_NUMBER) { |
836 FillPhoneNumberField(profile, type, field); | 838 FillPhoneNumberField(profile, type, field); |
837 } else { | 839 } else { |
838 if (field->form_control_type == ASCIIToUTF16("select-one")) | 840 if (field->form_control_type == ASCIIToUTF16("select-one")) |
839 autofill::FillSelectControl(*profile, type, field); | 841 autofill::FillSelectControl(*profile, type, field); |
840 else | 842 else |
841 field->value = profile->GetFieldText(type); | 843 field->value = profile->GetFieldText(type); |
842 } | 844 } |
843 } | 845 } |
844 | 846 |
845 void AutofillManager::FillPhoneNumberField(const AutofillProfile* profile, | 847 void AutofillManager::FillPhoneNumberField(const AutofillProfile* profile, |
846 AutofillType type, | 848 AutofillFieldType type, |
847 webkit_glue::FormField* field) { | 849 webkit_glue::FormField* field) { |
848 // If we are filling a phone number, check to see if the size field | 850 // If we are filling a phone number, check to see if the size field |
849 // matches the "prefix" or "suffix" sizes and fill accordingly. | 851 // matches the "prefix" or "suffix" sizes and fill accordingly. |
850 string16 number = profile->GetFieldText(AutofillType(type)); | 852 string16 number = profile->GetFieldText(type); |
851 bool has_valid_suffix_and_prefix = (number.length() == | 853 bool has_valid_suffix_and_prefix = (number.length() == |
852 static_cast<size_t>(PhoneNumber::kPrefixLength + | 854 static_cast<size_t>(PhoneNumber::kPrefixLength + |
853 PhoneNumber::kSuffixLength)); | 855 PhoneNumber::kSuffixLength)); |
854 if (has_valid_suffix_and_prefix && | 856 if (has_valid_suffix_and_prefix && |
855 field->max_length == PhoneNumber::kPrefixLength) { | 857 field->max_length == PhoneNumber::kPrefixLength) { |
856 number = number.substr(PhoneNumber::kPrefixOffset, | 858 number = number.substr(PhoneNumber::kPrefixOffset, |
857 PhoneNumber::kPrefixLength); | 859 PhoneNumber::kPrefixLength); |
858 field->value = number; | 860 field->value = number; |
859 } else if (has_valid_suffix_and_prefix && | 861 } else if (has_valid_suffix_and_prefix && |
860 field->max_length == PhoneNumber::kSuffixLength) { | 862 field->max_length == PhoneNumber::kSuffixLength) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 return std::string(); | 946 return std::string(); |
945 | 947 |
946 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); | 948 std::map<int, std::string>::const_iterator iter = id_guid_map_.find(id); |
947 if (iter == id_guid_map_.end()) { | 949 if (iter == id_guid_map_.end()) { |
948 NOTREACHED(); | 950 NOTREACHED(); |
949 return std::string(); | 951 return std::string(); |
950 } | 952 } |
951 | 953 |
952 return iter->second; | 954 return iter->second; |
953 } | 955 } |
OLD | NEW |