| Index: chrome/browser/autofill/form_field.cc
|
| diff --git a/chrome/browser/autofill/form_field.cc b/chrome/browser/autofill/form_field.cc
|
| index 4560b4063ac13cc1529a9dba951e52e6b9dca29b..8e628d3cffe2c3513c03aebea05319b474de69ab 100644
|
| --- a/chrome/browser/autofill/form_field.cc
|
| +++ b/chrome/browser/autofill/form_field.cc
|
| @@ -81,6 +81,26 @@ FormField* ParseFormField(AutofillScanner* scanner, bool is_ecml) {
|
| return NameField::Parse(scanner, is_ecml);
|
| }
|
|
|
| +bool IsTextField(const string16& type) {
|
| + return type == ASCIIToUTF16("text");
|
| +}
|
| +
|
| +bool IsEmailField(const string16& type) {
|
| + return type == ASCIIToUTF16("email");
|
| +}
|
| +
|
| +bool IsMonthField(const string16& type) {
|
| + return type == ASCIIToUTF16("month");
|
| +}
|
| +
|
| +bool IsTelephoneField(const string16& type) {
|
| + return type == ASCIIToUTF16("tel");
|
| +}
|
| +
|
| +bool IsSelectField(const string16& type) {
|
| + return type == ASCIIToUTF16("select-one");
|
| +}
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -109,7 +129,7 @@ void FormField::ParseFormFields(const std::vector<AutofillField*>& fields,
|
| bool FormField::ParseField(AutofillScanner* scanner,
|
| const string16& pattern,
|
| const AutofillField** match) {
|
| - return ParseFieldSpecifics(scanner, pattern, MATCH_ALL, match);
|
| + return ParseFieldSpecifics(scanner, pattern, MATCH_DEFAULT, match);
|
| }
|
|
|
| // static
|
| @@ -121,20 +141,31 @@ bool FormField::ParseFieldSpecifics(AutofillScanner* scanner,
|
| return false;
|
|
|
| const AutofillField* field = scanner->Cursor();
|
| - if (Match(field, pattern, match_type)) {
|
| - if (match)
|
| - *match = field;
|
| - scanner->Advance();
|
| - return true;
|
| +
|
| + if ((match_type & MATCH_TEXT) && IsTextField(field->form_control_type))
|
| + return MatchAndAdvance(scanner, pattern, match_type, match);
|
| +
|
| + if ((match_type & MATCH_EMAIL) && IsEmailField(field->form_control_type))
|
| + return MatchAndAdvance(scanner, pattern, match_type, match);
|
| +
|
| + if ((match_type & MATCH_TELEPHONE) &&
|
| + IsTelephoneField(field->form_control_type)) {
|
| + return MatchAndAdvance(scanner, pattern, match_type, match);
|
| }
|
|
|
| + if ((match_type & MATCH_SELECT) && IsSelectField(field->form_control_type))
|
| + return MatchAndAdvance(scanner, pattern, match_type, match);
|
| +
|
| return false;
|
| }
|
|
|
| // static
|
| bool FormField::ParseEmptyLabel(AutofillScanner* scanner,
|
| const AutofillField** match) {
|
| - return ParseFieldSpecifics(scanner, ASCIIToUTF16("^$"), MATCH_LABEL, match);
|
| + return ParseFieldSpecifics(scanner,
|
| + ASCIIToUTF16("^$"),
|
| + MATCH_LABEL | MATCH_ALL_INPUTS,
|
| + match);
|
| }
|
|
|
| // static
|
| @@ -148,6 +179,22 @@ bool FormField::AddClassification(const AutofillField* field,
|
| return map->insert(make_pair(field->unique_name(), type)).second;
|
| }
|
|
|
| +// static.
|
| +bool FormField::MatchAndAdvance(AutofillScanner* scanner,
|
| + const string16& pattern,
|
| + int match_type,
|
| + const AutofillField** match) {
|
| + const AutofillField* field = scanner->Cursor();
|
| + if (FormField::Match(field, pattern, match_type)) {
|
| + if (match)
|
| + *match = field;
|
| + scanner->Advance();
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| // static
|
| bool FormField::Match(const AutofillField* field,
|
| const string16& pattern,
|
|
|