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

Unified Diff: components/autofill/core/browser/autofill_manager.cc

Issue 622773002: [Autofill] Autofill fails to show suggestions for credit card split across fields. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added unit-tests. Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: components/autofill/core/browser/autofill_manager.cc
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 48cd5974c206b50c064630dace3cb85731b24497..7aceb1d0fe7f97c04a41f2c97c862f387e6ea458 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -156,6 +156,48 @@ void DeterminePossibleFieldTypesForUpload(
}
}
+// Helper function to get the suggetions for |user_input| matching to
+// |card_number_filed| split.
+void GetCredtCardSuggetionsForNumberSplit(
+ const base::string16& user_input,
+ const AutofillField& card_number_filed,
+ PersonalDataManager* personal_data,
+ std::vector<base::string16>* values,
+ std::vector<base::string16>* labels,
+ std::vector<base::string16>* icons,
+ std::vector<GUIDPair>* guid_pairs) {
+ const std::vector<CreditCard*>& credit_cards =
+ personal_data->GetCreditCards();
+ for (std::vector<CreditCard*>::const_iterator iter = credit_cards.begin();
+ iter != credit_cards.end();
+ ++iter) {
+ CreditCard* credit_card = *iter;
+ base::string16 stored_card_number =
+ CreditCard::StripSeparators(credit_card->number());
+
+ // Exclude first split, as it would have already included in the
+ // suggestions.
+ if (!stored_card_number.empty() &&
+ !StartsWith(stored_card_number, user_input, false)) {
+
+ // Make sure the suggetions get include for rest of the
+ // |card_number_filed|s.
+ stored_card_number = AutofillField::GetCreditCardNumberValue(
+ card_number_filed, stored_card_number);
+ if (StartsWith(stored_card_number, user_input, false)) {
+ personal_data->AppendCreditCardSuggetions(
+ credit_card,
+ AutofillType(CREDIT_CARD_NUMBER),
+ user_input,
+ values,
+ labels,
+ icons,
+ guid_pairs);
+ }
+ }
+ }
+}
Ilya Sherman 2014/10/07 21:49:10 Can all of this logic be moved into the PersonalDa
Pritam Nikam 2014/10/08 05:17:17 In my opinion, we *cannot* move this logic to Pers
Ilya Sherman 2014/10/08 21:04:38 Phone numbers are also handled within the Personal
Pritam Nikam 2014/10/09 06:11:11 Acknowledged. I'll align my changes along these l
Ilya Sherman 2014/10/09 21:35:12 That's true. It's such an edge case that I'm hone
Pritam Nikam 2014/10/13 04:33:52 Currently, *current field value* (i.e. const base:
+
} // namespace
AutofillManager::AutofillManager(
@@ -473,7 +515,7 @@ void AutofillManager::OnQueryFormFieldAutofill(int query_id,
bool is_filling_credit_card = (type.group() == CREDIT_CARD);
if (is_filling_credit_card) {
GetCreditCardSuggestions(
- field, type, &values, &labels, &icons, &unique_ids);
+ field, *autofill_field, &values, &labels, &icons, &unique_ids);
} else {
GetProfileSuggestions(*form_structure,
field,
@@ -1117,15 +1159,27 @@ void AutofillManager::GetProfileSuggestions(
void AutofillManager::GetCreditCardSuggestions(
const FormFieldData& field,
- const AutofillType& type,
+ const AutofillField& autofill_field,
std::vector<base::string16>* values,
std::vector<base::string16>* labels,
std::vector<base::string16>* icons,
std::vector<int>* unique_ids) const {
std::vector<GUIDPair> guid_pairs;
+ AutofillType type = autofill_field.Type();
personal_data_->GetCreditCardSuggestions(
type, field.value, values, labels, icons, &guid_pairs);
+ // Populate suggetions for number split case (http://crbug.com/420323).
+ if (!field.value.empty() &&
+ autofill_field.Type().GetStorableType() == CREDIT_CARD_NUMBER)
+ GetCredtCardSuggetionsForNumberSplit(field.value,
+ autofill_field,
+ personal_data_,
+ values,
+ labels,
+ icons,
+ &guid_pairs);
Ilya Sherman 2014/10/07 21:49:10 nit: Please add curly braces, since the body spans
Pritam Nikam 2014/10/08 05:17:17 Done.
+
for (size_t i = 0; i < guid_pairs.size(); ++i) {
unique_ids->push_back(PackGUIDs(guid_pairs[i], GUIDPair(std::string(), 0)));
}

Powered by Google App Engine
This is Rietveld 408576698