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

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

Issue 3071003: AutoFill: Display a right-aligned generic CC icon in the suggestions popup for (Closed)
Patch Set: Rebase. Created 10 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <string> 8 #include <string>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 21 matching lines...) Expand all
32 // The rate for positive/negative matches potentially could be different. 32 // The rate for positive/negative matches potentially could be different.
33 const double kAutoFillPositiveUploadRateDefaultValue = 0.01; 33 const double kAutoFillPositiveUploadRateDefaultValue = 0.01;
34 const double kAutoFillNegativeUploadRateDefaultValue = 0.01; 34 const double kAutoFillNegativeUploadRateDefaultValue = 0.01;
35 35
36 // Size and offset of the prefix and suffix portions of phone numbers. 36 // Size and offset of the prefix and suffix portions of phone numbers.
37 const int kAutoFillPhoneNumberPrefixOffset = 0; 37 const int kAutoFillPhoneNumberPrefixOffset = 0;
38 const int kAutoFillPhoneNumberPrefixCount = 3; 38 const int kAutoFillPhoneNumberPrefixCount = 3;
39 const int kAutoFillPhoneNumberSuffixOffset = 3; 39 const int kAutoFillPhoneNumberSuffixOffset = 3;
40 const int kAutoFillPhoneNumberSuffixCount = 4; 40 const int kAutoFillPhoneNumberSuffixCount = 4;
41 41
42
42 const string16::value_type kCreditCardLabelPrefix[] = {'*', 0}; 43 const string16::value_type kCreditCardLabelPrefix[] = {'*', 0};
43 const string16::value_type kLabelSeparator[] = {';',' ', '*', 0}; 44 const string16::value_type kLabelSeparator[] = {';',' ', '*', 0};
44 45
46 // The name of the generic credit card icon, which maps to the image resource ID
47 // in webkit/glue:WebKitClientImpl.
48 // TODO(jhawkins): Move the images to chrome/common and implement the resource
49 // handling in RendererWebKitClientImpl.
50 const char kGenericCC[] = "genericCC";
51
45 // Removes duplicate elements whilst preserving original order of |elements| and 52 // Removes duplicate elements whilst preserving original order of |elements| and
46 // |unique_ids|. 53 // |unique_ids|.
47 void RemoveDuplicateElements( 54 void RemoveDuplicateElements(
48 std::vector<string16>* elements, std::vector<int>* unique_ids) { 55 std::vector<string16>* elements, std::vector<int>* unique_ids) {
49 DCHECK_EQ(elements->size(), unique_ids->size()); 56 DCHECK_EQ(elements->size(), unique_ids->size());
50 57
51 std::vector<string16> elements_copy; 58 std::vector<string16> elements_copy;
52 std::vector<int> unique_ids_copy; 59 std::vector<int> unique_ids_copy;
53 for (size_t i = 0; i < elements->size(); ++i) { 60 for (size_t i = 0; i < elements->size(); ++i) {
54 const string16& element = (*elements)[i]; 61 const string16& element = (*elements)[i];
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 break; 199 break;
193 } 200 }
194 } 201 }
195 } 202 }
196 203
197 if (autofill_field == NULL) 204 if (autofill_field == NULL)
198 return false; 205 return false;
199 206
200 std::vector<string16> values; 207 std::vector<string16> values;
201 std::vector<string16> labels; 208 std::vector<string16> labels;
209 std::vector<string16> icons;
202 std::vector<int> unique_ids; 210 std::vector<int> unique_ids;
203 AutoFillType type(autofill_field->type()); 211 AutoFillType type(autofill_field->type());
204 212
205 // If this form is non-HTTPS, treat billing address fields as regular address 213 // If this form is non-HTTPS, treat billing address fields as regular address
206 // fields. 214 // fields.
207 bool handle_billing = FormIsHTTPS(form); 215 bool handle_billing = FormIsHTTPS(form);
208 216
209 if (type.group() == AutoFillType::CREDIT_CARD) 217 if (type.group() == AutoFillType::CREDIT_CARD)
210 GetCreditCardSuggestions(form, field, type, &values, &labels, &unique_ids); 218 GetCreditCardSuggestions(
219 form, field, type, &values, &labels, &icons, &unique_ids);
211 else if (type.group() == AutoFillType::ADDRESS_BILLING) 220 else if (type.group() == AutoFillType::ADDRESS_BILLING)
212 GetBillingProfileSuggestions( 221 GetBillingProfileSuggestions(
213 form, field, type, &values, &labels, &unique_ids); 222 form, field, type, &values, &labels, &icons, &unique_ids);
214 else 223 else
215 GetProfileSuggestions( 224 GetProfileSuggestions(form, field, type, handle_billing,
216 form, field, type, handle_billing, &values, &labels, &unique_ids); 225 &values, &labels, &icons, &unique_ids);
217 226
218 DCHECK_EQ(values.size(), labels.size()); 227 DCHECK_EQ(values.size(), labels.size());
228 DCHECK_EQ(values.size(), icons.size());
219 DCHECK_EQ(values.size(), unique_ids.size()); 229 DCHECK_EQ(values.size(), unique_ids.size());
220 230
221 // No suggestions. 231 // No suggestions.
222 if (values.empty()) 232 if (values.empty())
223 return false; 233 return false;
224 234
225 // If the form is auto-filled and the renderer is querying for suggestions, 235 // If the form is auto-filled and the renderer is querying for suggestions,
226 // then the user is editing the value of a field. In this case, don't display 236 // then the user is editing the value of a field. In this case, don't display
227 // labels, as that information is redundant. In addition, remove duplicate 237 // labels, as that information is redundant. In addition, remove duplicate
228 // values. 238 // values.
229 if (form_autofilled) { 239 if (form_autofilled) {
230 RemoveDuplicateElements(&values, &unique_ids); 240 RemoveDuplicateElements(&values, &unique_ids);
231 labels.resize(values.size()); 241 labels.resize(values.size());
242 icons.resize(values.size());
232 243
233 for (size_t i = 0; i < labels.size(); ++i) 244 for (size_t i = 0; i < labels.size(); ++i) {
234 labels[i] = string16(); 245 labels[i] = string16();
246 icons[i] = string16();
247 }
235 } 248 }
236 249
237 host->AutoFillSuggestionsReturned(query_id, values, labels, unique_ids); 250 host->AutoFillSuggestionsReturned(
251 query_id, values, labels, icons, unique_ids);
238 return true; 252 return true;
239 } 253 }
240 254
241 // TODO(jhawkins): Remove the |value| parameter. 255 // TODO(jhawkins): Remove the |value| parameter.
242 bool AutoFillManager::FillAutoFillFormData(int query_id, 256 bool AutoFillManager::FillAutoFillFormData(int query_id,
243 const FormData& form, 257 const FormData& form,
244 const string16& value, 258 const string16& value,
245 const string16& label, 259 const string16& label,
246 int unique_id) { 260 int unique_id) {
247 if (!IsAutoFillEnabled()) 261 if (!IsAutoFillEnabled())
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 download_manager_(NULL) { 468 download_manager_(NULL) {
455 DCHECK(tab_contents); 469 DCHECK(tab_contents);
456 } 470 }
457 471
458 void AutoFillManager::GetProfileSuggestions(FormStructure* form, 472 void AutoFillManager::GetProfileSuggestions(FormStructure* form,
459 const FormField& field, 473 const FormField& field,
460 AutoFillType type, 474 AutoFillType type,
461 bool include_cc_labels, 475 bool include_cc_labels,
462 std::vector<string16>* values, 476 std::vector<string16>* values,
463 std::vector<string16>* labels, 477 std::vector<string16>* labels,
478 std::vector<string16>* icons,
464 std::vector<int>* unique_ids) { 479 std::vector<int>* unique_ids) {
465 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles(); 480 const std::vector<AutoFillProfile*>& profiles = personal_data_->profiles();
466 std::vector<AutoFillProfile*> matched_profiles; 481 std::vector<AutoFillProfile*> matched_profiles;
467 for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin(); 482 for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin();
468 iter != profiles.end(); ++iter) { 483 iter != profiles.end(); ++iter) {
469 AutoFillProfile* profile = *iter; 484 AutoFillProfile* profile = *iter;
470 485
471 // The value of the stored data for this field type in the |profile|. 486 // The value of the stored data for this field type in the |profile|.
472 string16 profile_field_value = profile->GetFieldText(type); 487 string16 profile_field_value = profile->GetFieldText(type);
473 488
474 if (!profile_field_value.empty() && 489 if (!profile_field_value.empty() &&
475 StartsWith(profile_field_value, field.value(), false)) { 490 StartsWith(profile_field_value, field.value(), false)) {
476 matched_profiles.push_back(profile); 491 matched_profiles.push_back(profile);
477 values->push_back(profile_field_value); 492 values->push_back(profile_field_value);
478 unique_ids->push_back(PackIDs(0, profile->unique_id())); 493 unique_ids->push_back(PackIDs(0, profile->unique_id()));
479 } 494 }
480 } 495 }
481 496
497 // No CC, so no icons.
498 icons->resize(values->size());
499
482 AutoFillProfile::CreateInferredLabels(&matched_profiles, labels, 0, 500 AutoFillProfile::CreateInferredLabels(&matched_profiles, labels, 0,
483 type.field_type()); 501 type.field_type());
484 502
485 if (!include_cc_labels || !form->HasBillingFields() || !FormIsHTTPS(form)) 503 if (!include_cc_labels || !form->HasBillingFields() || !FormIsHTTPS(form))
486 return; 504 return;
487 505
488 size_t i = 0; 506 size_t i = 0;
489 std::vector<string16> expanded_values; 507 std::vector<string16> expanded_values;
490 std::vector<string16> expanded_labels; 508 std::vector<string16> expanded_labels;
491 std::vector<int> expanded_ids; 509 std::vector<int> expanded_ids;
(...skipping 14 matching lines...) Expand all
506 expanded_values.swap(*values); 524 expanded_values.swap(*values);
507 expanded_ids.swap(*unique_ids); 525 expanded_ids.swap(*unique_ids);
508 } 526 }
509 527
510 void AutoFillManager::GetBillingProfileSuggestions( 528 void AutoFillManager::GetBillingProfileSuggestions(
511 FormStructure* form, 529 FormStructure* form,
512 const FormField& field, 530 const FormField& field,
513 AutoFillType type, 531 AutoFillType type,
514 std::vector<string16>* values, 532 std::vector<string16>* values,
515 std::vector<string16>* labels, 533 std::vector<string16>* labels,
534 std::vector<string16>* icons,
516 std::vector<int>* unique_ids) { 535 std::vector<int>* unique_ids) {
517 std::vector<CreditCard*> matching_creditcards; 536 std::vector<CreditCard*> matching_creditcards;
518 std::vector<AutoFillProfile*> matching_profiles; 537 std::vector<AutoFillProfile*> matching_profiles;
519 std::vector<string16> cc_values; 538 std::vector<string16> cc_values;
520 std::vector<string16> cc_labels; 539 std::vector<string16> cc_labels;
521 540
522 // If the form is non-HTTPS, no CC suggestions are provided; however, give the 541 // If the form is non-HTTPS, no CC suggestions are provided; however, give the
523 // user the option of filling the billing address fields with regular address 542 // user the option of filling the billing address fields with regular address
524 // data. 543 // data.
525 if (!FormIsHTTPS(form)) { 544 if (!FormIsHTTPS(form)) {
526 GetProfileSuggestions(form, field, type, false, values, labels, unique_ids); 545 GetProfileSuggestions(
546 form, field, type, false, values, icons, labels, unique_ids);
527 return; 547 return;
528 } 548 }
529 549
530 for (std::vector<CreditCard*>::const_iterator cc = 550 for (std::vector<CreditCard*>::const_iterator cc =
531 personal_data_->credit_cards().begin(); 551 personal_data_->credit_cards().begin();
532 cc != personal_data_->credit_cards().end(); ++cc) { 552 cc != personal_data_->credit_cards().end(); ++cc) {
533 string16 label = (*cc)->billing_address(); 553 string16 label = (*cc)->billing_address();
534 AutoFillProfile* billing_profile = NULL; 554 AutoFillProfile* billing_profile = NULL;
535 555
536 // The value of the stored data for this field type in the |profile|. 556 // The value of the stored data for this field type in the |profile|.
(...skipping 17 matching lines...) Expand all
554 continue; 574 continue;
555 575
556 for (std::vector<AutoFillProfile*>::const_iterator iter = 576 for (std::vector<AutoFillProfile*>::const_iterator iter =
557 personal_data_->profiles().begin(); 577 personal_data_->profiles().begin();
558 iter != personal_data_->profiles().end(); ++iter) { 578 iter != personal_data_->profiles().end(); ++iter) {
559 values->push_back(billing_profile->GetFieldText(type)); 579 values->push_back(billing_profile->GetFieldText(type));
560 580
561 string16 label = (*iter)->Label() + kLabelSeparator + 581 string16 label = (*iter)->Label() + kLabelSeparator +
562 (*cc)->LastFourDigits(); 582 (*cc)->LastFourDigits();
563 labels->push_back(label); 583 labels->push_back(label);
584 icons->push_back(ASCIIToUTF16(kGenericCC));
564 unique_ids->push_back( 585 unique_ids->push_back(
565 PackIDs((*cc)->unique_id(), (*iter)->unique_id())); 586 PackIDs((*cc)->unique_id(), (*iter)->unique_id()));
566 } 587 }
567 } 588 }
568 } 589 }
569 590
570 void AutoFillManager::GetCreditCardSuggestions(FormStructure* form, 591 void AutoFillManager::GetCreditCardSuggestions(FormStructure* form,
571 const FormField& field, 592 const FormField& field,
572 AutoFillType type, 593 AutoFillType type,
573 std::vector<string16>* values, 594 std::vector<string16>* values,
574 std::vector<string16>* labels, 595 std::vector<string16>* labels,
596 std::vector<string16>* icons,
575 std::vector<int>* unique_ids) { 597 std::vector<int>* unique_ids) {
576 // Don't return CC suggestions for non-HTTPS pages. 598 // Don't return CC suggestions for non-HTTPS pages.
577 if (!FormIsHTTPS(form)) 599 if (!FormIsHTTPS(form))
578 return; 600 return;
579 601
580 for (std::vector<CreditCard*>::const_iterator iter = 602 for (std::vector<CreditCard*>::const_iterator iter =
581 personal_data_->credit_cards().begin(); 603 personal_data_->credit_cards().begin();
582 iter != personal_data_->credit_cards().end(); ++iter) { 604 iter != personal_data_->credit_cards().end(); ++iter) {
583 CreditCard* credit_card = *iter; 605 CreditCard* credit_card = *iter;
584 606
(...skipping 11 matching lines...) Expand all
596 unique_ids->push_back(PackIDs(credit_card->unique_id(), 0)); 618 unique_ids->push_back(PackIDs(credit_card->unique_id(), 0));
597 } else { 619 } else {
598 for (std::vector<AutoFillProfile*>::const_iterator iter = 620 for (std::vector<AutoFillProfile*>::const_iterator iter =
599 personal_data_->profiles().begin(); 621 personal_data_->profiles().begin();
600 iter != personal_data_->profiles().end(); ++iter) { 622 iter != personal_data_->profiles().end(); ++iter) {
601 values->push_back(creditcard_field_value); 623 values->push_back(creditcard_field_value);
602 624
603 string16 label = (*iter)->Label() + kLabelSeparator + 625 string16 label = (*iter)->Label() + kLabelSeparator +
604 credit_card->LastFourDigits(); 626 credit_card->LastFourDigits();
605 labels->push_back(label); 627 labels->push_back(label);
628 icons->push_back(ASCIIToUTF16(kGenericCC));
606 unique_ids->push_back( 629 unique_ids->push_back(
607 PackIDs(credit_card->unique_id(), (*iter)->unique_id())); 630 PackIDs(credit_card->unique_id(), (*iter)->unique_id()));
608 } 631 }
609 } 632 }
610 } 633 }
611 } 634 }
612 } 635 }
613 636
614 void AutoFillManager::FillBillingFormField(const CreditCard* credit_card, 637 void AutoFillManager::FillBillingFormField(const CreditCard* credit_card,
615 AutoFillType type, 638 AutoFillType type,
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 765
743 // When receiving IDs (across processes) from the renderer we unpack credit card 766 // When receiving IDs (across processes) from the renderer we unpack credit card
744 // and profile IDs from a single integer. Credit card IDs are stored in the 767 // and profile IDs from a single integer. Credit card IDs are stored in the
745 // high word and profile IDs are stored in the low word. 768 // high word and profile IDs are stored in the low word.
746 // static 769 // static
747 void AutoFillManager::UnpackIDs(int id, int* cc_id, int* profile_id) { 770 void AutoFillManager::UnpackIDs(int id, int* cc_id, int* profile_id) {
748 *cc_id = id >> std::numeric_limits<unsigned short>::digits & 771 *cc_id = id >> std::numeric_limits<unsigned short>::digits &
749 std::numeric_limits<unsigned short>::max(); 772 std::numeric_limits<unsigned short>::max();
750 *profile_id = id & std::numeric_limits<unsigned short>::max(); 773 *profile_id = id & std::numeric_limits<unsigned short>::max();
751 } 774 }
OLDNEW
« no previous file with comments | « chrome/browser/autofill/autofill_manager.h ('k') | chrome/browser/autofill/autofill_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698