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

Side by Side Diff: chrome/browser/autofill/autofill_manager.cc

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

Powered by Google App Engine
This is Rietveld 408576698