Index: chrome/browser/autofill/contact_info.cc |
diff --git a/chrome/browser/autofill/contact_info.cc b/chrome/browser/autofill/contact_info.cc |
index c951d66005532cdf1efa615e22358253df644249..1ff74ee529e33cfb45cd93c2a137a793493f104f 100644 |
--- a/chrome/browser/autofill/contact_info.cc |
+++ b/chrome/browser/autofill/contact_info.cc |
@@ -12,26 +12,37 @@ |
static const string16 kNameSplitChars = ASCIIToUTF16("-'. "); |
-static const AutofillFieldType kAutoFillContactInfoTypes[] = { |
+static const AutofillFieldType kAutoFillNameInfoTypes[] = { |
NAME_FIRST, |
NAME_MIDDLE, |
- NAME_LAST, |
- EMAIL_ADDRESS, |
- COMPANY_NAME, |
+ NAME_LAST |
}; |
-static const size_t kAutoFillContactInfoLength = |
- arraysize(kAutoFillContactInfoTypes); |
+static const size_t kAutoFillNameInfoLength = |
+ arraysize(kAutoFillNameInfoTypes); |
-ContactInfo::ContactInfo() {} |
+NameInfo::NameInfo() {} |
-ContactInfo::~ContactInfo() {} |
+NameInfo::NameInfo(const NameInfo& info) : FormGroup() { |
+ *this = info; |
+} |
+ |
+NameInfo::~NameInfo() {} |
+ |
+NameInfo& NameInfo::operator=(const NameInfo& info) { |
+ if (this == &info) |
+ return *this; |
-FormGroup* ContactInfo::Clone() const { |
- return new ContactInfo(*this); |
+ first_tokens_ = info.first_tokens_; |
+ middle_tokens_ = info.middle_tokens_; |
+ last_tokens_ = info.last_tokens_; |
+ first_ = info.first_; |
+ middle_ = info.middle_; |
+ last_ = info.last_; |
+ return *this; |
} |
-void ContactInfo::GetPossibleFieldTypes(const string16& text, |
+void NameInfo::GetPossibleFieldTypes(const string16& text, |
FieldTypeSet* possible_types) const { |
DCHECK(possible_types); |
@@ -47,20 +58,11 @@ void ContactInfo::GetPossibleFieldTypes(const string16& text, |
if (IsMiddleInitial(text)) |
possible_types->insert(NAME_MIDDLE_INITIAL); |
- if (IsSuffix(text)) |
- possible_types->insert(NAME_SUFFIX); |
- |
if (IsFullName(text)) |
possible_types->insert(NAME_FULL); |
- |
- if (email_ == text) |
- possible_types->insert(EMAIL_ADDRESS); |
- |
- if (company_name_ == text) |
- possible_types->insert(COMPANY_NAME); |
} |
-void ContactInfo::GetAvailableFieldTypes(FieldTypeSet* available_types) const { |
+void NameInfo::GetAvailableFieldTypes(FieldTypeSet* available_types) const { |
DCHECK(available_types); |
if (!first().empty()) |
@@ -77,26 +79,17 @@ void ContactInfo::GetAvailableFieldTypes(FieldTypeSet* available_types) const { |
if (!FullName().empty()) |
available_types->insert(NAME_FULL); |
- |
- if (!suffix().empty()) |
- available_types->insert(NAME_SUFFIX); |
- |
- if (!email().empty()) |
- available_types->insert(EMAIL_ADDRESS); |
- |
- if (!company_name().empty()) |
- available_types->insert(COMPANY_NAME); |
} |
-void ContactInfo::FindInfoMatches(const AutofillType& type, |
+void NameInfo::FindInfoMatches(const AutofillType& type, |
const string16& info, |
std::vector<string16>* matched_text) const { |
DCHECK(matched_text); |
string16 match; |
if (type.field_type() == UNKNOWN_TYPE) { |
- for (size_t i = 0; i < kAutoFillContactInfoLength; i++) { |
- if (FindInfoMatchesHelper(kAutoFillContactInfoTypes[i], info, &match)) |
+ for (size_t i = 0; i < kAutoFillNameInfoLength; i++) { |
+ if (FindInfoMatchesHelper(kAutoFillNameInfoTypes[i], info, &match)) |
matched_text->push_back(match); |
} |
} else if (FindInfoMatchesHelper(type.field_type(), info, &match)) { |
@@ -104,7 +97,7 @@ void ContactInfo::FindInfoMatches(const AutofillType& type, |
} |
} |
-string16 ContactInfo::GetFieldText(const AutofillType& type) const { |
+string16 NameInfo::GetFieldText(const AutofillType& type) const { |
AutofillFieldType field_type = type.field_type(); |
if (field_type == NAME_FIRST) |
return first(); |
@@ -121,82 +114,25 @@ string16 ContactInfo::GetFieldText(const AutofillType& type) const { |
if (field_type == NAME_FULL) |
return FullName(); |
- if (field_type == NAME_SUFFIX) |
- return suffix(); |
- |
- if (field_type == EMAIL_ADDRESS) |
- return email(); |
- |
- if (field_type == COMPANY_NAME) |
- return company_name(); |
- |
return string16(); |
} |
-void ContactInfo::SetInfo(const AutofillType& type, const string16& value) { |
+void NameInfo::SetInfo(const AutofillType& type, const string16& value) { |
AutofillFieldType field_type = type.field_type(); |
- DCHECK_EQ(AutofillType::CONTACT_INFO, type.group()); |
+ DCHECK_EQ(AutofillType::NAME, type.group()); |
if (field_type == NAME_FIRST) |
SetFirst(value); |
else if (field_type == NAME_MIDDLE || field_type == NAME_MIDDLE_INITIAL) |
SetMiddle(value); |
else if (field_type == NAME_LAST) |
SetLast(value); |
- else if (field_type == NAME_SUFFIX) |
- set_suffix(value); |
- else if (field_type == EMAIL_ADDRESS) |
- email_ = value; |
- else if (field_type == COMPANY_NAME) |
- company_name_ = value; |
else if (field_type == NAME_FULL) |
SetFullName(value); |
else |
NOTREACHED(); |
} |
-ContactInfo::ContactInfo(const ContactInfo& contact_info) |
- : FormGroup(), |
- first_tokens_(contact_info.first_tokens_), |
- middle_tokens_(contact_info.middle_tokens_), |
- last_tokens_(contact_info.last_tokens_), |
- first_(contact_info.first_), |
- middle_(contact_info.middle_), |
- last_(contact_info.last_), |
- suffix_(contact_info.suffix_), |
- email_(contact_info.email_), |
- company_name_(contact_info.company_name_) { |
-} |
- |
-string16 ContactInfo::FullName() const { |
- if (first_.empty()) |
- return string16(); |
- |
- std::vector<string16> full_name; |
- full_name.push_back(first_); |
- |
- if (!middle_.empty()) |
- full_name.push_back(middle_); |
- |
- if (!last_.empty()) |
- full_name.push_back(last_); |
- |
- if (!suffix_.empty()) |
- full_name.push_back(suffix_); |
- |
- return JoinString(full_name, ' '); |
-} |
- |
-string16 ContactInfo::MiddleInitial() const { |
- if (middle_.empty()) |
- return string16(); |
- |
- string16 middle_name(middle()); |
- string16 initial; |
- initial.push_back(middle_name[0]); |
- return initial; |
-} |
- |
-bool ContactInfo::FindInfoMatchesHelper(const AutofillFieldType& field_type, |
+bool NameInfo::FindInfoMatchesHelper(const AutofillFieldType& field_type, |
const string16& info, |
string16* match) const { |
if (match == NULL) { |
@@ -214,51 +150,63 @@ bool ContactInfo::FindInfoMatchesHelper(const AutofillFieldType& field_type, |
} else if (field_type == NAME_LAST && |
StartsWith(last(), info, false)) { |
*match = last(); |
- } else if (field_type == NAME_SUFFIX && |
- StartsWith(suffix(), info, false)) { |
- *match = suffix(); |
} else if (field_type == NAME_MIDDLE_INITIAL && IsMiddleInitial(info)) { |
*match = MiddleInitial(); |
} else if (field_type == NAME_FULL && |
StartsWith(FullName(), info, false)) { |
*match = FullName(); |
- } else if (field_type == EMAIL_ADDRESS && |
- StartsWith(email(), info, false)) { |
- *match = email(); |
- } else if (field_type == COMPANY_NAME && |
- StartsWith(company_name(), info, false)) { |
- *match = company_name(); |
} |
return !match->empty(); |
} |
+string16 NameInfo::FullName() const { |
+ if (first_.empty()) |
+ return string16(); |
+ |
+ std::vector<string16> full_name; |
+ full_name.push_back(first_); |
+ |
+ if (!middle_.empty()) |
+ full_name.push_back(middle_); |
+ |
+ if (!last_.empty()) |
+ full_name.push_back(last_); |
+ |
+ return JoinString(full_name, ' '); |
+} |
+ |
+string16 NameInfo::MiddleInitial() const { |
+ if (middle_.empty()) |
+ return string16(); |
+ |
+ string16 middle_name(middle()); |
+ string16 initial; |
+ initial.push_back(middle_name[0]); |
+ return initial; |
+} |
+ |
// If each of the 'words' contained in the text are also present in the first |
// name then we will consider the text to be of type kFirstName. This means |
// that people with multiple first names will be able to enter any one of |
// their first names and have it correctly recognized. |
-bool ContactInfo::IsFirstName(const string16& text) const { |
+bool NameInfo::IsFirstName(const string16& text) const { |
return IsNameMatch(text, first_tokens_); |
} |
// If each of the 'words' contained in the text are also present in the middle |
// name then we will consider the text to be of type kMiddleName. |
-bool ContactInfo::IsMiddleName(const string16& text) const { |
+bool NameInfo::IsMiddleName(const string16& text) const { |
return IsNameMatch(text, middle_tokens_); |
} |
// If each of the 'words' contained in the text are also present in the last |
// name then we will consider the text to be of type kLastName. |
-bool ContactInfo::IsLastName(const string16& text) const { |
+bool NameInfo::IsLastName(const string16& text) const { |
return IsNameMatch(text, last_tokens_); |
} |
-bool ContactInfo::IsSuffix(const string16& text) const { |
- string16 lower_suffix = StringToLowerASCII(suffix_); |
- return (lower_suffix == text); |
-} |
- |
-bool ContactInfo::IsMiddleInitial(const string16& text) const { |
+bool NameInfo::IsMiddleInitial(const string16& text) const { |
if (text.length() != 1) |
return false; |
@@ -280,7 +228,7 @@ bool ContactInfo::IsMiddleInitial(const string16& text) const { |
// 2) it contains at least one word from the last name. |
// 3) all of the words in the field match a word in either the first, |
// middle, or last name. |
-bool ContactInfo::IsFullName(const string16& text) const { |
+bool NameInfo::IsFullName(const string16& text) const { |
size_t first_tokens_size = first_tokens_.size(); |
if (first_tokens_size == 0) |
return false; |
@@ -291,7 +239,7 @@ bool ContactInfo::IsFullName(const string16& text) const { |
if (last_tokens_size == 0) |
return false; |
- NameTokens text_tokens; |
+ std::vector<string16> text_tokens; |
Tokenize(text, kNameSplitChars, &text_tokens); |
size_t text_tokens_size = text_tokens.size(); |
if (text_tokens_size == 0 || text_tokens_size < 2) |
@@ -304,8 +252,8 @@ bool ContactInfo::IsFullName(const string16& text) const { |
bool first_name_match = false; |
bool last_name_match = false; |
- NameTokens::iterator iter; |
- for (iter = text_tokens.begin(); iter != text_tokens.end(); ++iter) { |
+ for (std::vector<string16>::iterator iter = text_tokens.begin(); |
+ iter != text_tokens.end(); ++iter) { |
bool match = false; |
if (IsWordInName(*iter, first_tokens_)) { |
match = true; |
@@ -327,13 +275,13 @@ bool ContactInfo::IsFullName(const string16& text) const { |
return (first_name_match && last_name_match); |
} |
-bool ContactInfo::IsNameMatch(const string16& text, |
- const NameTokens& name_tokens) const { |
+bool NameInfo::IsNameMatch(const string16& text, |
+ const std::vector<string16>& name_tokens) const { |
size_t name_tokens_size = name_tokens.size(); |
if (name_tokens_size == 0) |
return false; |
- NameTokens text_tokens; |
+ std::vector<string16> text_tokens; |
Tokenize(text, kNameSplitChars, &text_tokens); |
size_t text_tokens_size = text_tokens.size(); |
if (text_tokens_size == 0) |
@@ -344,8 +292,8 @@ bool ContactInfo::IsNameMatch(const string16& text, |
// If each of the 'words' contained in the text are also present in the name, |
// then we will consider the text to match the name. |
- NameTokens::iterator iter; |
- for (iter = text_tokens.begin(); iter != text_tokens.end(); ++iter) { |
+ for (std::vector<string16>::iterator iter = text_tokens.begin(); |
+ iter != text_tokens.end(); ++iter) { |
if (!IsWordInName(*iter, name_tokens)) |
return false; |
} |
@@ -353,10 +301,10 @@ bool ContactInfo::IsNameMatch(const string16& text, |
return true; |
} |
-bool ContactInfo::IsWordInName(const string16& word, |
- const NameTokens& name_tokens) const { |
- NameTokens::const_iterator iter; |
- for (iter = name_tokens.begin(); iter != name_tokens.end(); ++iter) { |
+bool NameInfo::IsWordInName(const string16& word, |
+ const std::vector<string16>& name_tokens) const { |
+ for (std::vector<string16>::const_iterator iter = name_tokens.begin(); |
+ iter != name_tokens.end(); ++iter) { |
// |*iter| is already lower-cased. |
if (StringToLowerASCII(word) == *iter) |
return true; |
@@ -365,35 +313,38 @@ bool ContactInfo::IsWordInName(const string16& word, |
return false; |
} |
-void ContactInfo::SetFirst(const string16& first) { |
+void NameInfo::SetFirst(const string16& first) { |
first_ = first; |
first_tokens_.clear(); |
Tokenize(first, kNameSplitChars, &first_tokens_); |
- NameTokens::iterator iter; |
- for (iter = first_tokens_.begin(); iter != first_tokens_.end(); ++iter) |
+ for (std::vector<string16>::iterator iter = first_tokens_.begin(); |
+ iter != first_tokens_.end(); ++iter) { |
*iter = StringToLowerASCII(*iter); |
+ } |
} |
-void ContactInfo::SetMiddle(const string16& middle) { |
+void NameInfo::SetMiddle(const string16& middle) { |
middle_ = middle; |
middle_tokens_.clear(); |
Tokenize(middle, kNameSplitChars, &middle_tokens_); |
- NameTokens::iterator iter; |
- for (iter = middle_tokens_.begin(); iter != middle_tokens_.end(); ++iter) |
+ for (std::vector<string16>::iterator iter = middle_tokens_.begin(); |
+ iter != middle_tokens_.end(); ++iter) { |
*iter = StringToLowerASCII(*iter); |
+ } |
} |
-void ContactInfo::SetLast(const string16& last) { |
+void NameInfo::SetLast(const string16& last) { |
last_ = last; |
last_tokens_.clear(); |
Tokenize(last, kNameSplitChars, &last_tokens_); |
- NameTokens::iterator iter; |
- for (iter = last_tokens_.begin(); iter != last_tokens_.end(); ++iter) |
+ for (std::vector<string16>::iterator iter = last_tokens_.begin(); |
+ iter != last_tokens_.end(); ++iter) { |
*iter = StringToLowerASCII(*iter); |
+ } |
} |
-void ContactInfo::SetFullName(const string16& full) { |
- NameTokens full_name_tokens; |
+void NameInfo::SetFullName(const string16& full) { |
+ std::vector<string16> full_name_tokens; |
Tokenize(full, ASCIIToUTF16(" "), &full_name_tokens); |
// Clear the names. |
SetFirst(string16()); |
@@ -415,3 +366,119 @@ void ContactInfo::SetFullName(const string16& full) { |
} |
} |
+EmailInfo::EmailInfo() {} |
+ |
+EmailInfo::EmailInfo(const EmailInfo& info) : FormGroup() { |
+ *this = info; |
+} |
+ |
+EmailInfo::~EmailInfo() {} |
+ |
+EmailInfo& EmailInfo::operator=(const EmailInfo& info) { |
+ if (this == &info) |
+ return *this; |
+ |
+ email_ = info.email_; |
+ return *this; |
+} |
+ |
+void EmailInfo::GetPossibleFieldTypes(const string16& text, |
+ FieldTypeSet* possible_types) const { |
+ DCHECK(possible_types); |
+ // TODO(isherman): Investigate case-insensitive comparison. |
+ if (email_ == text) |
+ possible_types->insert(EMAIL_ADDRESS); |
+} |
+ |
+void EmailInfo::GetAvailableFieldTypes(FieldTypeSet* available_types) const { |
+ DCHECK(available_types); |
+ if (!email_.empty()) |
+ available_types->insert(EMAIL_ADDRESS); |
+} |
+ |
+void EmailInfo::FindInfoMatches(const AutofillType& type, |
+ const string16& info, |
+ std::vector<string16>* matched_text) const { |
+ DCHECK(matched_text); |
+ |
+ string16 match; |
+ if (type.field_type() == UNKNOWN_TYPE && StartsWith(email_, info, false)) { |
+ matched_text->push_back(email_); |
+ } else if (type.field_type() == EMAIL_ADDRESS && |
+ StartsWith(email_, info, false)) { |
+ matched_text->push_back(email_); |
+ } |
+} |
+ |
+string16 EmailInfo::GetFieldText(const AutofillType& type) const { |
+ AutofillFieldType field_type = type.field_type(); |
+ if (field_type == EMAIL_ADDRESS) |
+ return email_; |
+ |
+ return string16(); |
+} |
+ |
+void EmailInfo::SetInfo(const AutofillType& type, const string16& value) { |
+ DCHECK_EQ(AutofillType::EMAIL, type.group()); |
+ email_ = value; |
+} |
+ |
+CompanyInfo::CompanyInfo() {} |
+ |
+CompanyInfo::CompanyInfo(const CompanyInfo& info) : FormGroup() { |
+ *this = info; |
+} |
+ |
+CompanyInfo::~CompanyInfo() {} |
+ |
+CompanyInfo& CompanyInfo::operator=(const CompanyInfo& info) { |
+ if (this == &info) |
+ return *this; |
+ |
+ company_name_ = info.company_name_; |
+ return *this; |
+} |
+ |
+void CompanyInfo::GetPossibleFieldTypes(const string16& text, |
+ FieldTypeSet* possible_types) const { |
+ DCHECK(possible_types); |
+ |
+ if (company_name_ == text) |
+ possible_types->insert(COMPANY_NAME); |
+} |
+ |
+void CompanyInfo::GetAvailableFieldTypes(FieldTypeSet* available_types) const { |
+ DCHECK(available_types); |
+ |
+ if (!company_name_.empty()) |
+ available_types->insert(COMPANY_NAME); |
+} |
+ |
+void CompanyInfo::FindInfoMatches(const AutofillType& type, |
+ const string16& info, |
+ std::vector<string16>* matched_text) const { |
+ DCHECK(matched_text); |
+ |
+ string16 match; |
+ if (type.field_type() == UNKNOWN_TYPE && |
+ StartsWith(company_name_, info, false)) { |
+ matched_text->push_back(company_name_); |
+ } else if (type.field_type() == COMPANY_NAME && |
+ StartsWith(company_name_, info, false)) { |
+ matched_text->push_back(company_name_); |
+ } |
+} |
+ |
+string16 CompanyInfo::GetFieldText(const AutofillType& type) const { |
+ AutofillFieldType field_type = type.field_type(); |
+ |
+ if (field_type == COMPANY_NAME) |
+ return company_name_; |
+ |
+ return string16(); |
+} |
+ |
+void CompanyInfo::SetInfo(const AutofillType& type, const string16& value) { |
+ DCHECK_EQ(AutofillType::COMPANY, type.group()); |
+ company_name_ = value; |
+} |