OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autofill/autofill_profile.h" | 5 #include "chrome/browser/autofill/autofill_profile.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/stl_util-inl.h" | 10 #include "base/stl_util-inl.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 break; | 95 break; |
96 } | 96 } |
97 } | 97 } |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 } // namespace | 101 } // namespace |
102 | 102 |
103 AutoFillProfile::AutoFillProfile(const std::string& guid) | 103 AutoFillProfile::AutoFillProfile(const std::string& guid) |
104 : guid_(guid) { | 104 : guid_(guid) { |
105 InitPersonalInfo(&personal_info_); | |
106 } | 105 } |
107 | 106 |
108 AutoFillProfile::AutoFillProfile() | 107 AutoFillProfile::AutoFillProfile() |
109 : guid_(guid::GenerateGUID()) { | 108 : guid_(guid::GenerateGUID()) { |
110 InitPersonalInfo(&personal_info_); | |
111 } | 109 } |
112 | 110 |
113 AutoFillProfile::AutoFillProfile(const AutoFillProfile& source) | 111 AutoFillProfile::AutoFillProfile(const AutoFillProfile& source) |
114 : FormGroup() { | 112 : FormGroup() { |
Ilya Sherman
2011/03/09 00:50:50
Should we include this in the initialization lists
dhollowa
2011/03/09 01:55:47
It is only required for copy constructors, it is i
| |
115 operator=(source); | 113 operator=(source); |
116 } | 114 } |
117 | 115 |
118 AutoFillProfile::~AutoFillProfile() { | 116 AutoFillProfile::~AutoFillProfile() { |
119 STLDeleteContainerPairSecondPointers(personal_info_.begin(), | 117 } |
120 personal_info_.end()); | 118 |
119 AutoFillProfile& AutoFillProfile::operator=(const AutoFillProfile& profile) { | |
120 if (this == &profile) | |
121 return *this; | |
122 | |
123 label_ = profile.label_; | |
124 guid_ = profile.guid_; | |
125 | |
126 name_ = profile.name_; | |
127 email_ = profile.email_; | |
128 company_ = profile.company_; | |
129 home_number_ = profile.home_number_; | |
130 fax_number_ = profile.fax_number_; | |
131 address_ = profile.address_; | |
132 | |
133 return *this; | |
121 } | 134 } |
122 | 135 |
123 void AutoFillProfile::GetPossibleFieldTypes( | 136 void AutoFillProfile::GetPossibleFieldTypes( |
124 const string16& text, | 137 const string16& text, |
125 FieldTypeSet* possible_types) const { | 138 FieldTypeSet* possible_types) const { |
126 for (FormGroupMap::const_iterator iter = personal_info_.begin(); | 139 FormGroupList info = info_list(); |
127 iter != personal_info_.end(); ++iter) { | 140 for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it) |
128 FormGroup* data = iter->second; | 141 (*it)->GetPossibleFieldTypes(text, possible_types); |
129 DCHECK(data != NULL); | |
130 data->GetPossibleFieldTypes(text, possible_types); | |
131 } | |
132 } | 142 } |
133 | 143 |
134 void AutoFillProfile::GetAvailableFieldTypes( | 144 void AutoFillProfile::GetAvailableFieldTypes( |
135 FieldTypeSet* available_types) const { | 145 FieldTypeSet* available_types) const { |
136 for (FormGroupMap::const_iterator iter = personal_info_.begin(); | 146 FormGroupList info = info_list(); |
137 iter != personal_info_.end(); ++iter) { | 147 for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it) |
138 FormGroup* data = iter->second; | 148 (*it)->GetAvailableFieldTypes(available_types); |
139 DCHECK(data != NULL); | |
140 data->GetAvailableFieldTypes(available_types); | |
141 } | |
142 } | 149 } |
143 | 150 |
144 string16 AutoFillProfile::GetFieldText(const AutofillType& type) const { | 151 string16 AutoFillProfile::GetFieldText(const AutofillType& type) const { |
145 AutofillType return_type( | 152 AutofillType return_type( |
146 AutofillType::GetEquivalentFieldType(type.field_type())); | 153 AutofillType::GetEquivalentFieldType(type.field_type())); |
147 | 154 |
148 FormGroupMap::const_iterator iter = personal_info_.find(return_type.group()); | 155 FormGroupMap info = info_map(); |
Ilya Sherman
2011/03/09 00:50:50
How about creating a wrapper around find() rather
dhollowa
2011/03/09 01:55:47
No, the association between key/value is set up by
Ilya Sherman
2011/03/09 02:01:22
What I meant was: We pretty much always want info_
| |
149 if (iter == personal_info_.end() || iter->second == NULL) | 156 FormGroupMap::const_iterator it = info.find(return_type.group()); |
157 if (it == info.end()) | |
150 return string16(); | 158 return string16(); |
151 | 159 |
152 return iter->second->GetFieldText(return_type); | 160 return it->second->GetFieldText(return_type); |
153 } | 161 } |
154 | 162 |
155 void AutoFillProfile::FindInfoMatches( | 163 void AutoFillProfile::FindInfoMatches( |
156 const AutofillType& type, | 164 const AutofillType& type, |
157 const string16& info, | 165 const string16& input, |
158 std::vector<string16>* matched_text) const { | 166 std::vector<string16>* matched_text) const { |
159 if (matched_text == NULL) { | 167 if (matched_text == NULL) { |
160 DLOG(ERROR) << "NULL matched text passed in"; | 168 DLOG(ERROR) << "NULL matched text passed in"; |
161 return; | 169 return; |
162 } | 170 } |
163 | 171 |
164 string16 clean_info = StringToLowerASCII(CollapseWhitespace(info, false)); | 172 string16 clean_info = StringToLowerASCII(CollapseWhitespace(input, false)); |
165 | 173 |
166 // If the field_type is unknown, then match against all field types. | 174 // If the field_type is unknown, then match against all field types. |
167 if (type.field_type() == UNKNOWN_TYPE) { | 175 if (type.field_type() == UNKNOWN_TYPE) { |
168 FormGroupMap::const_iterator iter; | 176 FormGroupList info = info_list(); |
169 for (iter = personal_info_.begin(); iter != personal_info_.end(); ++iter) { | 177 for (FormGroupList::const_iterator it = info.begin(); |
170 iter->second->FindInfoMatches(type, clean_info, matched_text); | 178 it != info.end(); ++it) |
171 } | 179 (*it)->FindInfoMatches(type, clean_info, matched_text); |
172 } else { | 180 } else { |
173 FormGroupMap::const_iterator iter = personal_info_.find(type.group()); | 181 FormGroupMap info = info_map(); |
174 DCHECK(iter != personal_info_.end() && iter->second != NULL); | 182 FormGroupMap::const_iterator it = info.find(type.group()); |
175 if (iter != personal_info_.end() && iter->second != NULL) | 183 DCHECK(it != info.end()); |
176 iter->second->FindInfoMatches(type, clean_info, matched_text); | 184 it->second->FindInfoMatches(type, clean_info, matched_text); |
177 } | 185 } |
178 } | 186 } |
179 | 187 |
180 void AutoFillProfile::SetInfo(const AutofillType& type, const string16& value) { | 188 void AutoFillProfile::SetInfo(const AutofillType& type, const string16& value) { |
181 FormGroupMap::const_iterator iter = personal_info_.find(type.group()); | 189 MutableFormGroupMap info = mutable_info_map(); |
182 if (iter == personal_info_.end() || iter->second == NULL) | 190 MutableFormGroupMap::iterator it = info.find(type.group()); |
183 return; | 191 DCHECK(it != info.end()); |
184 | 192 it->second->SetInfo(type, CollapseWhitespace(value, false)); |
185 iter->second->SetInfo(type, CollapseWhitespace(value, false)); | |
186 } | |
187 | |
188 FormGroup* AutoFillProfile::Clone() const { | |
189 return new AutoFillProfile(*this); | |
190 } | 193 } |
191 | 194 |
192 const string16 AutoFillProfile::Label() const { | 195 const string16 AutoFillProfile::Label() const { |
193 return label_; | 196 return label_; |
194 } | 197 } |
195 | 198 |
196 const std::string AutoFillProfile::CountryCode() const { | 199 const std::string AutoFillProfile::CountryCode() const { |
197 FormGroup* form_group = | 200 return address_.country_code(); |
198 personal_info_.find(AutofillType::ADDRESS_HOME)->second; | |
199 DCHECK(form_group); | |
200 Address* address = static_cast<Address*>(form_group); | |
201 return address->country_code(); | |
202 } | 201 } |
203 | 202 |
204 void AutoFillProfile::SetCountryCode(const std::string& country_code) { | 203 void AutoFillProfile::SetCountryCode(const std::string& country_code) { |
205 FormGroup* form_group = | 204 address_.set_country_code(country_code); |
206 personal_info_.find(AutofillType::ADDRESS_HOME)->second; | |
207 DCHECK(form_group); | |
208 Address* address = static_cast<Address*>(form_group); | |
209 address->set_country_code(country_code); | |
210 } | 205 } |
211 | 206 |
212 // static | 207 // static |
213 bool AutoFillProfile::AdjustInferredLabels( | 208 bool AutoFillProfile::AdjustInferredLabels( |
214 std::vector<AutoFillProfile*>* profiles) { | 209 std::vector<AutoFillProfile*>* profiles) { |
215 const size_t kMinimalFieldsShown = 2; | 210 const size_t kMinimalFieldsShown = 2; |
216 | 211 |
217 std::vector<string16> created_labels; | 212 std::vector<string16> created_labels; |
218 CreateInferredLabels(profiles, NULL, UNKNOWN_TYPE, kMinimalFieldsShown, | 213 CreateInferredLabels(profiles, NULL, UNKNOWN_TYPE, kMinimalFieldsShown, |
219 &created_labels); | 214 &created_labels); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
271 } | 266 } |
272 } | 267 } |
273 } | 268 } |
274 | 269 |
275 bool AutoFillProfile::IsEmpty() const { | 270 bool AutoFillProfile::IsEmpty() const { |
276 FieldTypeSet types; | 271 FieldTypeSet types; |
277 GetAvailableFieldTypes(&types); | 272 GetAvailableFieldTypes(&types); |
278 return types.empty(); | 273 return types.empty(); |
279 } | 274 } |
280 | 275 |
281 void AutoFillProfile::operator=(const AutoFillProfile& source) { | |
282 if (this == &source) | |
283 return; | |
284 | |
285 label_ = source.label_; | |
286 guid_ = source.guid_; | |
287 | |
288 STLDeleteContainerPairSecondPointers(personal_info_.begin(), | |
289 personal_info_.end()); | |
290 personal_info_.clear(); | |
291 | |
292 FormGroupMap::const_iterator iter; | |
293 for (iter = source.personal_info_.begin(); | |
294 iter != source.personal_info_.end(); | |
295 ++iter) { | |
296 personal_info_[iter->first] = iter->second->Clone(); | |
297 } | |
298 } | |
299 | |
300 int AutoFillProfile::Compare(const AutoFillProfile& profile) const { | 276 int AutoFillProfile::Compare(const AutoFillProfile& profile) const { |
301 // The following AutoFill field types are the only types we store in the WebDB | 277 // The following AutoFill field types are the only types we store in the WebDB |
302 // so far, so we're only concerned with matching these types in the profile. | 278 // so far, so we're only concerned with matching these types in the profile. |
303 const AutofillFieldType types[] = { NAME_FIRST, | 279 const AutofillFieldType types[] = { NAME_FIRST, |
304 NAME_MIDDLE, | 280 NAME_MIDDLE, |
305 NAME_LAST, | 281 NAME_LAST, |
306 EMAIL_ADDRESS, | 282 EMAIL_ADDRESS, |
307 COMPANY_NAME, | 283 COMPANY_NAME, |
308 ADDRESS_HOME_LINE1, | 284 ADDRESS_HOME_LINE1, |
309 ADDRESS_HOME_LINE2, | 285 ADDRESS_HOME_LINE2, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
439 label_fields.size() >= num_fields_to_include) | 415 label_fields.size() >= num_fields_to_include) |
440 break; | 416 break; |
441 } | 417 } |
442 | 418 |
443 (*created_labels)[*it] = | 419 (*created_labels)[*it] = |
444 profile->ConstructInferredLabel(label_fields, | 420 profile->ConstructInferredLabel(label_fields, |
445 label_fields.size()); | 421 label_fields.size()); |
446 } | 422 } |
447 } | 423 } |
448 | 424 |
449 // static | 425 AutoFillProfile::FormGroupList AutoFillProfile::info_list() const { |
450 void AutoFillProfile::InitPersonalInfo(FormGroupMap* personal_info) { | 426 FormGroupList v(6); |
451 (*personal_info)[AutofillType::CONTACT_INFO] = new ContactInfo(); | 427 v[0] = &name_; |
452 (*personal_info)[AutofillType::PHONE_HOME] = new HomePhoneNumber(); | 428 v[1] = &email_; |
453 (*personal_info)[AutofillType::PHONE_FAX] = new FaxNumber(); | 429 v[2] = &company_; |
454 (*personal_info)[AutofillType::ADDRESS_HOME] = new Address(); | 430 v[3] = &home_number_; |
431 v[4] = &fax_number_; | |
432 v[5] = &address_; | |
433 return v; | |
434 } | |
Ilya Sherman
2011/03/09 00:50:50
How about making this a constant array data member
dhollowa
2011/03/09 01:55:47
No, I want it like this because I'm planning to ex
| |
435 | |
436 AutoFillProfile::FormGroupMap AutoFillProfile::info_map() const { | |
437 FormGroupMap m; | |
438 m[AutofillType::NAME] = &name_; | |
439 m[AutofillType::EMAIL] = &email_; | |
440 m[AutofillType::COMPANY] = &company_; | |
441 m[AutofillType::PHONE_HOME] = &home_number_; | |
442 m[AutofillType::PHONE_FAX] = &fax_number_; | |
443 m[AutofillType::ADDRESS_HOME] = &address_; | |
444 return m; | |
445 } | |
446 | |
447 AutoFillProfile::MutableFormGroupMap AutoFillProfile::mutable_info_map() { | |
448 FormGroupMap m_const = info_map(); | |
449 MutableFormGroupMap m; | |
450 for (FormGroupMap::const_iterator it = m_const.begin(); | |
451 it != m_const.end(); ++it) { | |
452 m[it->first] = const_cast<FormGroup*>(it->second); | |
453 } | |
454 return m; | |
455 } | 455 } |
456 | 456 |
457 // So we can compare AutoFillProfiles with EXPECT_EQ(). | 457 // So we can compare AutoFillProfiles with EXPECT_EQ(). |
458 std::ostream& operator<<(std::ostream& os, const AutoFillProfile& profile) { | 458 std::ostream& operator<<(std::ostream& os, const AutoFillProfile& profile) { |
459 return os | 459 return os |
460 << UTF16ToUTF8(profile.Label()) | 460 << UTF16ToUTF8(profile.Label()) |
461 << " " | 461 << " " |
462 << profile.guid() | 462 << profile.guid() |
463 << " " | 463 << " " |
464 << UTF16ToUTF8(profile.GetFieldText(AutofillType(NAME_FIRST))) | 464 << UTF16ToUTF8(profile.GetFieldText(AutofillType(NAME_FIRST))) |
(...skipping 17 matching lines...) Expand all Loading... | |
482 << UTF16ToUTF8(profile.GetFieldText(AutofillType(ADDRESS_HOME_ZIP))) | 482 << UTF16ToUTF8(profile.GetFieldText(AutofillType(ADDRESS_HOME_ZIP))) |
483 << " " | 483 << " " |
484 << UTF16ToUTF8(profile.GetFieldText(AutofillType(ADDRESS_HOME_COUNTRY))) | 484 << UTF16ToUTF8(profile.GetFieldText(AutofillType(ADDRESS_HOME_COUNTRY))) |
485 << " " | 485 << " " |
486 << UTF16ToUTF8(profile.GetFieldText(AutofillType( | 486 << UTF16ToUTF8(profile.GetFieldText(AutofillType( |
487 PHONE_HOME_WHOLE_NUMBER))) | 487 PHONE_HOME_WHOLE_NUMBER))) |
488 << " " | 488 << " " |
489 << UTF16ToUTF8(profile.GetFieldText(AutofillType( | 489 << UTF16ToUTF8(profile.GetFieldText(AutofillType( |
490 PHONE_FAX_WHOLE_NUMBER))); | 490 PHONE_FAX_WHOLE_NUMBER))); |
491 } | 491 } |
OLD | NEW |