diff options
author | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-24 22:33:23 +0000 |
---|---|---|
committer | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-24 22:33:23 +0000 |
commit | fd529d6fabc2992da29f60f751480625b930e879 (patch) | |
tree | 962bee6d5f1f06af2bddfde6f18aac2622e22e4d /chrome/browser/autofill | |
parent | 29f55a47219cf6f5f6064a50395cbdc25dc493ad (diff) | |
download | chromium_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.cc | 75 | ||||
-rw-r--r-- | chrome/browser/autofill/form_structure.cc | 4 | ||||
-rw-r--r-- | chrome/browser/autofill/name_field.cc | 8 | ||||
-rw-r--r-- | chrome/browser/autofill/name_field_unittest.cc | 40 |
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"), |