summaryrefslogtreecommitdiffstats
path: root/chrome/browser/autofill
diff options
context:
space:
mode:
authordhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-24 22:33:23 +0000
committerdhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-24 22:33:23 +0000
commitfd529d6fabc2992da29f60f751480625b930e879 (patch)
tree962bee6d5f1f06af2bddfde6f18aac2622e22e4d /chrome/browser/autofill
parent29f55a47219cf6f5f6064a50395cbdc25dc493ad (diff)
downloadchromium_src-fd529d6fabc2992da29f60f751480625b930e879.zip
chromium_src-fd529d6fabc2992da29f60f751480625b930e879.tar.gz
chromium_src-fd529d6fabc2992da29f60f751480625b930e879.tar.bz2
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
Diffstat (limited to 'chrome/browser/autofill')
-rw-r--r--chrome/browser/autofill/form_field_unittest.cc75
-rw-r--r--chrome/browser/autofill/form_structure.cc4
-rw-r--r--chrome/browser/autofill/name_field.cc8
-rw-r--r--chrome/browser/autofill/name_field_unittest.cc40
4 files changed, 120 insertions, 7 deletions
diff --git a/chrome/browser/autofill/form_field_unittest.cc b/chrome/browser/autofill/form_field_unittest.cc
new file mode 100644
index 0000000..616525a
--- /dev/null
+++ b/chrome/browser/autofill/form_field_unittest.cc
@@ -0,0 +1,75 @@
+// 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
diff --git a/chrome/browser/autofill/form_structure.cc b/chrome/browser/autofill/form_structure.cc
index 9c184c2..2323f1a 100644
--- a/chrome/browser/autofill/form_structure.cc
+++ b/chrome/browser/autofill/form_structure.cc
@@ -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;
diff --git a/chrome/browser/autofill/name_field.cc b/chrome/browser/autofill/name_field.cc
index 12b37ce0..8163d7a 100644
--- a/chrome/browser/autofill/name_field.cc
+++ b/chrome/browser/autofill/name_field.cc
@@ -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;
diff --git a/chrome/browser/autofill/name_field_unittest.cc b/chrome/browser/autofill/name_field_unittest.cc
index 04b797d..03cbec3 100644
--- a/chrome/browser/autofill/name_field_unittest.cc
+++ b/chrome/browser/autofill/name_field_unittest.cc
@@ -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"),