Commit fd529d6f authored by dhollowa@chromium.org's avatar dhollowa@chromium.org

AutoFill address profile not seen in dropdown for name and address field on dell.com

Modifies AutoFill heuristics to match middle initial at end of string instead of strict match of whole string.  Also, adds form_field_unittest.cc with specific unit tests for pattern matching.

BUG=45123
TEST=FormFieldTest.Match, NameFieldTest.MiddleInitialAtEnd

Review URL: http://codereview.chromium.org/3127030

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57246 0039d316-1c4b-4281-b951-d872f2087c98
parent 29f55a47
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/utf_string_conversions.h"
#include "chrome/browser/autofill/form_field.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
TEST(FormFieldTest, Match) {
AutoFillField field;
// Empty strings match.
EXPECT_TRUE(FormField::Match(&field, string16(), true));
// Empty pattern matches non-empty string.
field.set_label(ASCIIToUTF16("a"));
EXPECT_TRUE(FormField::Match(&field, string16(), true));
// Non-empty pattern doesn't match empty string.
field.set_label(string16());
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("a"), true));
// Beginning of line.
field.set_label(ASCIIToUTF16("head_tail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head"), true));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail"), true));
// End of line.
field.set_label(ASCIIToUTF16("head_tail"));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head$"), true));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail$"), true));
// Exact.
field.set_label(ASCIIToUTF16("head_tail"));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^head$"), true));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail$"), true));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head_tail$"), true));
// Escaped dots.
field.set_label(ASCIIToUTF16("m.i."));
// Note: This pattern is misleading as the "." characters are wild cards.
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."), true));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."), true));
field.set_label(ASCIIToUTF16("mXiX"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."), true));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."), true));
// Repetition.
field.set_label(ASCIIToUTF16("headtail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), true));
field.set_label(ASCIIToUTF16("headXtail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), true));
field.set_label(ASCIIToUTF16("headXXXtail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), true));
field.set_label(ASCIIToUTF16("headtail"));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), true));
field.set_label(ASCIIToUTF16("headXtail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), true));
field.set_label(ASCIIToUTF16("headXXXtail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), true));
// Alternation.
field.set_label(ASCIIToUTF16("head_tail"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head|other"), true));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail|other"), true));
EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("bad|good"), true));
// Case sensitivity.
field.set_label(ASCIIToUTF16("xxxHeAd_tAiLxxx"));
EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head_tail"), true));
}
} // namespace
......@@ -378,9 +378,7 @@ void FormStructure::GetHeuristicAutoFillTypes() {
for (size_t index = 0; index < field_count(); index++) {
AutoFillField* field = fields_[index];
// TODO(dhollowa): Defensive check for crash happening in the field.
// See http://crbug.com/42211
CHECK(field);
DCHECK(field);
FieldTypeMap::iterator iter = field_type_map.find(field->unique_name());
AutoFillFieldType heuristic_auto_fill_type;
......
......@@ -77,7 +77,7 @@ FirstLastNameField* FirstLastNameField::Parse2(
// American-style).
// The ".*first$" matches fields ending in "first" (example in sample8.html).
string16 match =
ASCIIToUTF16("first *name|first_name|initials|fname|.*first$");
ASCIIToUTF16("first *name|first_name|initials|fname|first$");
if (!ParseText(&q, match, &v->first_name_))
return NULL;
......@@ -86,16 +86,16 @@ FirstLastNameField* FirstLastNameField::Parse2(
// as both (the label text is "MI" and the element name is
// "txtmiddlename"); such a field probably actually represents a
// middle initial.
match = ASCIIToUTF16("^mi$|middle initial|middleinitial|m.i.");
match = ASCIIToUTF16("middle *initial|middle_initial|m\\.i\\.|mi$");
if (ParseText(&q, match, &v->middle_name_)) {
v->middle_initial_ = true;
} else {
match = ASCIIToUTF16("middle *name|mname");
match = ASCIIToUTF16("middle *name|middle_name|mname|middle$");
ParseText(&q, match, &v->middle_name_);
}
// The ".*last$" matches fields ending in "last" (example in sample8.html).
match = ASCIIToUTF16("last *name|last_name|lname|surname|.*last$");
match = ASCIIToUTF16("last *name|last_name|lname|surname|last$");
if (!ParseText(&q, match, &v->last_name_))
return NULL;
......
......@@ -321,6 +321,46 @@ TEST_F(NameFieldTest, MiddleInitialNoLastName) {
ASSERT_EQ(static_cast<NameField*>(NULL), field_.get());
}
// This case is from the dell.com checkout page. The middle initial "mi" string
// came at the end following other descriptive text. http://crbug.com/45123.
TEST_F(NameFieldTest, MiddleInitialAtEnd) {
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("XXXnameXXXfirst"),
string16(),
ASCIIToUTF16("text"),
0),
ASCIIToUTF16("name1")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("XXXnameXXXmi"),
string16(),
ASCIIToUTF16("text"),
0),
ASCIIToUTF16("name2")));
list_.push_back(
new AutoFillField(webkit_glue::FormField(string16(),
ASCIIToUTF16("XXXnameXXXlast"),
string16(),
ASCIIToUTF16("text"),
0),
ASCIIToUTF16("name3")));
list_.push_back(NULL);
iter_ = list_.begin();
field_.reset(NameField::Parse(&iter_, false));
ASSERT_NE(static_cast<NameField*>(NULL), field_.get());
ASSERT_TRUE(field_->GetFieldInfo(&field_type_map_));
ASSERT_TRUE(
field_type_map_.find(ASCIIToUTF16("name1")) != field_type_map_.end());
EXPECT_EQ(NAME_FIRST, field_type_map_[ASCIIToUTF16("name1")]);
ASSERT_TRUE(
field_type_map_.find(ASCIIToUTF16("name2")) != field_type_map_.end());
EXPECT_EQ(NAME_MIDDLE_INITIAL, field_type_map_[ASCIIToUTF16("name2")]);
ASSERT_TRUE(
field_type_map_.find(ASCIIToUTF16("name3")) != field_type_map_.end());
EXPECT_EQ(NAME_LAST, field_type_map_[ASCIIToUTF16("name3")]);
}
TEST_F(NameFieldTest, ECMLNoName) {
list_.push_back(new AutoFillField(
webkit_glue::FormField(ASCIIToUTF16("Company"),
......
......@@ -821,6 +821,7 @@
'browser/autofill/credit_card_field_unittest.cc',
'browser/autofill/credit_card_unittest.cc',
'browser/autofill/fax_field_unittest.cc',
'browser/autofill/form_field_unittest.cc',
'browser/autofill/form_structure_unittest.cc',
'browser/autofill/name_field_unittest.cc',
'browser/autofill/personal_data_manager_unittest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment