Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / components / autofill / core / browser / autofill_profile.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/autofill/core/browser/autofill_profile.h"
6
7 #include <algorithm>
8 #include <functional>
9 #include <map>
10 #include <ostream>
11 #include <set>
12
13 #include "base/basictypes.h"
14 #include "base/guid.h"
15 #include "base/logging.h"
16 #include "base/strings/string_util.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "components/autofill/core/browser/address.h"
19 #include "components/autofill/core/browser/address_i18n.h"
20 #include "components/autofill/core/browser/autofill_country.h"
21 #include "components/autofill/core/browser/autofill_field.h"
22 #include "components/autofill/core/browser/autofill_type.h"
23 #include "components/autofill/core/browser/contact_info.h"
24 #include "components/autofill/core/browser/phone_number.h"
25 #include "components/autofill/core/browser/phone_number_i18n.h"
26 #include "components/autofill/core/browser/validation.h"
27 #include "components/autofill/core/common/form_field_data.h"
28 #include "grit/components_strings.h"
29 #include "third_party/libaddressinput/chromium/addressinput_util.h"
30 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
31 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_formatter.h"
32 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_metadata.h"
33 #include "ui/base/l10n/l10n_util.h"
34
35 using base::ASCIIToUTF16;
36 using base::UTF16ToUTF8;
37 using i18n::addressinput::AddressData;
38 using i18n::addressinput::AddressField;
39
40 namespace autofill {
41 namespace {
42
43 // Like |AutofillType::GetStorableType()|, but also returns |NAME_FULL| for
44 // first, middle, and last name field types.
45 ServerFieldType GetStorableTypeCollapsingNames(ServerFieldType type) {
46   ServerFieldType storable_type = AutofillType(type).GetStorableType();
47   if (AutofillType(storable_type).group() == NAME)
48     return NAME_FULL;
49
50   return storable_type;
51 }
52
53 // Fills |distinguishing_fields| with a list of fields to use when creating
54 // labels that can help to distinguish between two profiles. Draws fields from
55 // |suggested_fields| if it is non-NULL; otherwise returns a default list.
56 // If |suggested_fields| is non-NULL, does not include |excluded_field| in the
57 // list. Otherwise, |excluded_field| is ignored, and should be set to
58 // |UNKNOWN_TYPE| by convention. The resulting list of fields is sorted in
59 // decreasing order of importance.
60 void GetFieldsForDistinguishingProfiles(
61     const std::vector<ServerFieldType>* suggested_fields,
62     ServerFieldType excluded_field,
63     std::vector<ServerFieldType>* distinguishing_fields) {
64   static const ServerFieldType kDefaultDistinguishingFields[] = {
65     NAME_FULL,
66     ADDRESS_HOME_LINE1,
67     ADDRESS_HOME_LINE2,
68     ADDRESS_HOME_DEPENDENT_LOCALITY,
69     ADDRESS_HOME_CITY,
70     ADDRESS_HOME_STATE,
71     ADDRESS_HOME_ZIP,
72     ADDRESS_HOME_SORTING_CODE,
73     ADDRESS_HOME_COUNTRY,
74     EMAIL_ADDRESS,
75     PHONE_HOME_WHOLE_NUMBER,
76     COMPANY_NAME,
77   };
78
79   std::vector<ServerFieldType> default_fields;
80   if (!suggested_fields) {
81     default_fields.assign(
82         kDefaultDistinguishingFields,
83         kDefaultDistinguishingFields + arraysize(kDefaultDistinguishingFields));
84     if (excluded_field == UNKNOWN_TYPE) {
85       distinguishing_fields->swap(default_fields);
86       return;
87     }
88     suggested_fields = &default_fields;
89   }
90
91   // Keep track of which fields we've seen so that we avoid duplicate entries.
92   // Always ignore fields of unknown type and the excluded field.
93   std::set<ServerFieldType> seen_fields;
94   seen_fields.insert(UNKNOWN_TYPE);
95   seen_fields.insert(GetStorableTypeCollapsingNames(excluded_field));
96
97   distinguishing_fields->clear();
98   for (std::vector<ServerFieldType>::const_iterator it =
99            suggested_fields->begin();
100        it != suggested_fields->end(); ++it) {
101     ServerFieldType suggested_type = GetStorableTypeCollapsingNames(*it);
102     if (seen_fields.insert(suggested_type).second)
103       distinguishing_fields->push_back(suggested_type);
104   }
105
106   // Special case: If the excluded field is a partial name (e.g. first name) and
107   // the suggested fields include other name fields, include |NAME_FULL| in the
108   // list of distinguishing fields as a last-ditch fallback. This allows us to
109   // distinguish between profiles that are identical except for the name.
110   if (excluded_field != NAME_FULL &&
111       GetStorableTypeCollapsingNames(excluded_field) == NAME_FULL) {
112     for (std::vector<ServerFieldType>::const_iterator it =
113              suggested_fields->begin();
114          it != suggested_fields->end(); ++it) {
115       if (*it != excluded_field &&
116           GetStorableTypeCollapsingNames(*it) == NAME_FULL) {
117         distinguishing_fields->push_back(NAME_FULL);
118         break;
119       }
120     }
121   }
122 }
123
124 // A helper function for string streaming.  Concatenates multi-valued entries
125 // stored for a given |type| into a single string.  This string is returned.
126 const base::string16 MultiString(const AutofillProfile& p,
127                                  ServerFieldType type) {
128   std::vector<base::string16> values;
129   p.GetRawMultiInfo(type, &values);
130   base::string16 accumulate;
131   for (size_t i = 0; i < values.size(); ++i) {
132     if (i > 0)
133       accumulate += ASCIIToUTF16(" ");
134     accumulate += values[i];
135   }
136   return accumulate;
137 }
138
139 base::string16 GetFormGroupInfo(const FormGroup& form_group,
140                                 const AutofillType& type,
141                                 const std::string& app_locale) {
142   return app_locale.empty() ?
143       form_group.GetRawInfo(type.GetStorableType()) :
144       form_group.GetInfo(type, app_locale);
145 }
146
147 template <class T>
148 void CopyRawValuesToItems(ServerFieldType type,
149                           const std::vector<base::string16>& values,
150                           const T& prototype,
151                           std::vector<T>* form_group_items) {
152   form_group_items->resize(values.size(), prototype);
153   for (size_t i = 0; i < form_group_items->size(); ++i) {
154     (*form_group_items)[i].SetRawInfo(type, values[i]);
155   }
156   // Must have at least one (possibly empty) element.
157   form_group_items->resize(std::max<size_t>(1UL, values.size()), prototype);
158 }
159
160 template <class T>
161 void CopyValuesToItems(AutofillType type,
162                        const std::vector<base::string16>& values,
163                        const T& prototype,
164                        const std::string& app_locale,
165                        std::vector<T>* form_group_items) {
166   form_group_items->resize(values.size(), prototype);
167   for (size_t i = 0; i < form_group_items->size(); ++i) {
168     (*form_group_items)[i].SetInfo(type, values[i], app_locale);
169   }
170   // Must have at least one (possibly empty) element.
171   form_group_items->resize(std::max<size_t>(1UL, values.size()), prototype);
172 }
173
174 template <class T>
175 void CopyItemsToValues(const AutofillType& type,
176                        const std::vector<T>& form_group_items,
177                        const std::string& app_locale,
178                        std::vector<base::string16>* values) {
179   values->resize(form_group_items.size());
180   for (size_t i = 0; i < values->size(); ++i) {
181     (*values)[i] = GetFormGroupInfo(form_group_items[i], type, app_locale);
182   }
183 }
184
185 // Collapse compound field types to their "full" type.  I.e. First name
186 // collapses to full name, area code collapses to full phone, etc.
187 void CollapseCompoundFieldTypes(ServerFieldTypeSet* type_set) {
188   ServerFieldTypeSet collapsed_set;
189   for (ServerFieldTypeSet::iterator it = type_set->begin();
190        it != type_set->end(); ++it) {
191     switch (*it) {
192       case NAME_FIRST:
193       case NAME_MIDDLE:
194       case NAME_LAST:
195       case NAME_MIDDLE_INITIAL:
196       case NAME_FULL:
197       case NAME_SUFFIX:
198         collapsed_set.insert(NAME_FULL);
199         break;
200
201       case PHONE_HOME_NUMBER:
202       case PHONE_HOME_CITY_CODE:
203       case PHONE_HOME_COUNTRY_CODE:
204       case PHONE_HOME_CITY_AND_NUMBER:
205       case PHONE_HOME_WHOLE_NUMBER:
206         collapsed_set.insert(PHONE_HOME_WHOLE_NUMBER);
207         break;
208
209       default:
210         collapsed_set.insert(*it);
211     }
212   }
213   std::swap(*type_set, collapsed_set);
214 }
215
216 class FindByPhone {
217  public:
218   FindByPhone(const base::string16& phone,
219               const std::string& country_code,
220               const std::string& app_locale)
221       : phone_(phone),
222         country_code_(country_code),
223         app_locale_(app_locale) {}
224
225   bool operator()(const base::string16& phone) {
226     return i18n::PhoneNumbersMatch(phone, phone_, country_code_, app_locale_);
227   }
228
229  private:
230   base::string16 phone_;
231   std::string country_code_;
232   std::string app_locale_;
233 };
234
235 // Functor used to check for case-insensitive equality of two strings.
236 struct CaseInsensitiveStringEquals {
237  public:
238   CaseInsensitiveStringEquals(const base::string16& other)
239       : other_(other) {}
240
241   bool operator()(const base::string16& x) const {
242     return x.size() == other_.size() &&
243         base::StringToLowerASCII(x) == base::StringToLowerASCII(other_);
244   }
245
246  private:
247   const base::string16& other_;
248 };
249
250 }  // namespace
251
252 AutofillProfile::AutofillProfile(const std::string& guid,
253                                  const std::string& origin)
254     : AutofillDataModel(guid, origin),
255       name_(1),
256       email_(1),
257       phone_number_(1, PhoneNumber(this)) {
258 }
259
260 AutofillProfile::AutofillProfile()
261     : AutofillDataModel(base::GenerateGUID(), std::string()),
262       name_(1),
263       email_(1),
264       phone_number_(1, PhoneNumber(this)) {
265 }
266
267 AutofillProfile::AutofillProfile(const AutofillProfile& profile)
268     : AutofillDataModel(std::string(), std::string()) {
269   operator=(profile);
270 }
271
272 AutofillProfile::~AutofillProfile() {
273 }
274
275 AutofillProfile& AutofillProfile::operator=(const AutofillProfile& profile) {
276   if (this == &profile)
277     return *this;
278
279   set_guid(profile.guid());
280   set_origin(profile.origin());
281
282   name_ = profile.name_;
283   email_ = profile.email_;
284   company_ = profile.company_;
285   phone_number_ = profile.phone_number_;
286
287   for (size_t i = 0; i < phone_number_.size(); ++i)
288     phone_number_[i].set_profile(this);
289
290   address_ = profile.address_;
291   set_language_code(profile.language_code());
292
293   return *this;
294 }
295
296 void AutofillProfile::GetMatchingTypes(
297     const base::string16& text,
298     const std::string& app_locale,
299     ServerFieldTypeSet* matching_types) const {
300   FormGroupList info = FormGroups();
301   for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it)
302     (*it)->GetMatchingTypes(text, app_locale, matching_types);
303 }
304
305 base::string16 AutofillProfile::GetRawInfo(ServerFieldType type) const {
306   const FormGroup* form_group = FormGroupForType(AutofillType(type));
307   if (!form_group)
308     return base::string16();
309
310   return form_group->GetRawInfo(type);
311 }
312
313 void AutofillProfile::SetRawInfo(ServerFieldType type,
314                                  const base::string16& value) {
315   FormGroup* form_group = MutableFormGroupForType(AutofillType(type));
316   if (form_group)
317     form_group->SetRawInfo(type, value);
318 }
319
320 base::string16 AutofillProfile::GetInfo(const AutofillType& type,
321                                         const std::string& app_locale) const {
322   if (type.html_type() == HTML_TYPE_FULL_ADDRESS) {
323     scoped_ptr<AddressData> address_data =
324         i18n::CreateAddressDataFromAutofillProfile(*this, app_locale);
325     if (!addressinput::HasAllRequiredFields(*address_data))
326       return base::string16();
327
328     std::vector<std::string> lines;
329     ::i18n::addressinput::GetFormattedNationalAddress(*address_data, &lines);
330     return base::UTF8ToUTF16(JoinString(lines, '\n'));
331   }
332
333   const FormGroup* form_group = FormGroupForType(type);
334   if (!form_group)
335     return base::string16();
336
337   return form_group->GetInfo(type, app_locale);
338 }
339
340 bool AutofillProfile::SetInfo(const AutofillType& type,
341                               const base::string16& value,
342                               const std::string& app_locale) {
343   FormGroup* form_group = MutableFormGroupForType(type);
344   if (!form_group)
345     return false;
346
347   base::string16 trimmed_value;
348   base::TrimWhitespace(value, base::TRIM_ALL, &trimmed_value);
349   return form_group->SetInfo(type, trimmed_value, app_locale);
350 }
351
352 base::string16 AutofillProfile::GetInfoForVariant(
353     const AutofillType& type,
354     size_t variant,
355     const std::string& app_locale) const {
356   std::vector<base::string16> values;
357   GetMultiInfo(type, app_locale, &values);
358
359   if (variant >= values.size()) {
360     // If the variant is unavailable, bail. This case is reachable, for
361     // example if Sync updates a profile during the filling process.
362     return base::string16();
363   }
364
365   return values[variant];
366 }
367
368 void AutofillProfile::SetRawMultiInfo(
369     ServerFieldType type,
370     const std::vector<base::string16>& values) {
371   switch (AutofillType(type).group()) {
372     case NAME:
373     case NAME_BILLING:
374       CopyRawValuesToItems(type, values, NameInfo(), &name_);
375       break;
376
377     case EMAIL:
378       CopyRawValuesToItems(type, values, EmailInfo(), &email_);
379       break;
380
381     case PHONE_HOME:
382     case PHONE_BILLING:
383       CopyRawValuesToItems(type, values, PhoneNumber(this), &phone_number_);
384       break;
385
386     default:
387       if (values.size() == 1U) {
388         SetRawInfo(type, values[0]);
389       } else if (values.empty()) {
390         SetRawInfo(type, base::string16());
391       } else {
392         // Shouldn't attempt to set multiple values on single-valued field.
393         NOTREACHED();
394       }
395       break;
396   }
397 }
398
399 void AutofillProfile::GetRawMultiInfo(
400     ServerFieldType type,
401     std::vector<base::string16>* values) const {
402   GetMultiInfoImpl(AutofillType(type), std::string(), values);
403 }
404
405 void AutofillProfile::SetMultiInfo(const AutofillType& type,
406                                    const std::vector<base::string16>& values,
407                                    const std::string& app_locale) {
408   switch (AutofillType(type).group()) {
409     case NAME:
410     case NAME_BILLING:
411       CopyValuesToItems(type, values, NameInfo(), app_locale, &name_);
412       break;
413
414     case EMAIL:
415       CopyValuesToItems(type, values, EmailInfo(), app_locale, &email_);
416       break;
417
418     case PHONE_HOME:
419     case PHONE_BILLING:
420       CopyValuesToItems(
421           type, values, PhoneNumber(this), app_locale, &phone_number_);
422       break;
423
424     default:
425       if (values.size() == 1U) {
426         SetInfo(type, values[0], app_locale);
427       } else if (values.empty()) {
428         SetInfo(type, base::string16(), app_locale);
429       } else {
430         // Shouldn't attempt to set multiple values on single-valued field.
431         NOTREACHED();
432       }
433       break;
434   }
435 }
436
437 void AutofillProfile::GetMultiInfo(const AutofillType& type,
438                                    const std::string& app_locale,
439                                    std::vector<base::string16>* values) const {
440   GetMultiInfoImpl(type, app_locale, values);
441 }
442
443 bool AutofillProfile::IsEmpty(const std::string& app_locale) const {
444   ServerFieldTypeSet types;
445   GetNonEmptyTypes(app_locale, &types);
446   return types.empty();
447 }
448
449 bool AutofillProfile::IsPresentButInvalid(ServerFieldType type) const {
450   std::string country = UTF16ToUTF8(GetRawInfo(ADDRESS_HOME_COUNTRY));
451   base::string16 data = GetRawInfo(type);
452   if (data.empty())
453     return false;
454
455   switch (type) {
456     case ADDRESS_HOME_STATE:
457       return country == "US" && !autofill::IsValidState(data);
458
459     case ADDRESS_HOME_ZIP:
460       return country == "US" && !autofill::IsValidZip(data);
461
462     case PHONE_HOME_WHOLE_NUMBER:
463       return !i18n::PhoneObject(data, country).IsValidNumber();
464
465     case EMAIL_ADDRESS:
466       return !autofill::IsValidEmailAddress(data);
467
468     default:
469       NOTREACHED();
470       return false;
471   }
472 }
473
474 int AutofillProfile::Compare(const AutofillProfile& profile) const {
475   const ServerFieldType single_value_types[] = {
476     COMPANY_NAME,
477     ADDRESS_HOME_STREET_ADDRESS,
478     ADDRESS_HOME_DEPENDENT_LOCALITY,
479     ADDRESS_HOME_CITY,
480     ADDRESS_HOME_STATE,
481     ADDRESS_HOME_ZIP,
482     ADDRESS_HOME_SORTING_CODE,
483     ADDRESS_HOME_COUNTRY,
484   };
485
486   for (size_t i = 0; i < arraysize(single_value_types); ++i) {
487     int comparison = GetRawInfo(single_value_types[i]).compare(
488         profile.GetRawInfo(single_value_types[i]));
489     if (comparison != 0)
490       return comparison;
491   }
492
493   const ServerFieldType multi_value_types[] = { NAME_FULL,
494                                                 NAME_FIRST,
495                                                 NAME_MIDDLE,
496                                                 NAME_LAST,
497                                                 EMAIL_ADDRESS,
498                                                 PHONE_HOME_WHOLE_NUMBER };
499
500   for (size_t i = 0; i < arraysize(multi_value_types); ++i) {
501     std::vector<base::string16> values_a;
502     std::vector<base::string16> values_b;
503     GetRawMultiInfo(multi_value_types[i], &values_a);
504     profile.GetRawMultiInfo(multi_value_types[i], &values_b);
505     if (values_a.size() < values_b.size())
506       return -1;
507     if (values_a.size() > values_b.size())
508       return 1;
509     for (size_t j = 0; j < values_a.size(); ++j) {
510       int comparison = values_a[j].compare(values_b[j]);
511       if (comparison != 0)
512         return comparison;
513     }
514   }
515
516   return 0;
517 }
518
519 bool AutofillProfile::EqualsSansOrigin(const AutofillProfile& profile) const {
520   return guid() == profile.guid() &&
521          language_code() == profile.language_code() &&
522          Compare(profile) == 0;
523 }
524
525 bool AutofillProfile::EqualsSansGuid(const AutofillProfile& profile) const {
526   return origin() == profile.origin() &&
527          language_code() == profile.language_code() &&
528          Compare(profile) == 0;
529 }
530
531 bool AutofillProfile::operator==(const AutofillProfile& profile) const {
532   return guid() == profile.guid() && EqualsSansGuid(profile);
533 }
534
535 bool AutofillProfile::operator!=(const AutofillProfile& profile) const {
536   return !operator==(profile);
537 }
538
539 const base::string16 AutofillProfile::PrimaryValue() const {
540   return GetRawInfo(ADDRESS_HOME_LINE1) + GetRawInfo(ADDRESS_HOME_CITY);
541 }
542
543 bool AutofillProfile::IsSubsetOf(const AutofillProfile& profile,
544                                  const std::string& app_locale) const {
545   ServerFieldTypeSet types;
546   GetNonEmptyTypes(app_locale, &types);
547
548   for (ServerFieldTypeSet::const_iterator it = types.begin(); it != types.end();
549        ++it) {
550     if (*it == NAME_FULL || *it == ADDRESS_HOME_STREET_ADDRESS) {
551       // Ignore the compound "full name" field type.  We are only interested in
552       // comparing the constituent parts.  For example, if |this| has a middle
553       // name saved, but |profile| lacks one, |profile| could still be a subset
554       // of |this|.  Likewise, ignore the compound "street address" type, as we
555       // are only interested in matching line-by-line.
556       continue;
557     } else if (AutofillType(*it).group() == PHONE_HOME) {
558       // Phone numbers should be canonicalized prior to being compared.
559       if (*it != PHONE_HOME_WHOLE_NUMBER) {
560         continue;
561       } else if (!i18n::PhoneNumbersMatch(
562             GetRawInfo(*it),
563             profile.GetRawInfo(*it),
564             base::UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY)),
565             app_locale)) {
566         return false;
567       }
568     } else if (base::StringToLowerASCII(GetRawInfo(*it)) !=
569                    base::StringToLowerASCII(profile.GetRawInfo(*it))) {
570       return false;
571     }
572   }
573
574   return true;
575 }
576
577 void AutofillProfile::OverwriteOrAppendNames(
578     const std::vector<NameInfo>& names,
579     const std::string& app_locale) {
580   std::vector<NameInfo> results(name_);
581   for (std::vector<NameInfo>::const_iterator it = names.begin();
582        it != names.end();
583        ++it) {
584     NameInfo imported_name = *it;
585     bool should_append_imported_name = true;
586
587     for (size_t index = 0; index < name_.size(); ++index) {
588       NameInfo current_name = name_[index];
589       if (current_name.ParsedNamesAreEqual(imported_name)) {
590         if (current_name.GetRawInfo(NAME_FULL).empty()) {
591           current_name.SetRawInfo(NAME_FULL,
592                                   imported_name.GetRawInfo(NAME_FULL));
593         }
594
595         should_append_imported_name = false;
596         break;
597       }
598
599       AutofillType type = AutofillType(NAME_FULL);
600       base::string16 full_name = current_name.GetInfo(type, app_locale);
601       if (base::StringToLowerASCII(full_name) ==
602           base::StringToLowerASCII(imported_name.GetInfo(type, app_locale))) {
603         // The imported name has the same full name string as one of the
604         // existing names for this profile.  Because full names are
605         // _heuristically_ parsed into {first, middle, last} name components,
606         // it's possible that either the existing name or the imported name
607         // was misparsed.  Prefer to keep the name whose {first, middle,
608         // last} components do not match those computed by the heuristic
609         // parse, as this more likely represents the correct, user-input parse
610         // of the name.
611         NameInfo heuristically_parsed_name;
612         heuristically_parsed_name.SetInfo(type, full_name, app_locale);
613         if (imported_name.ParsedNamesAreEqual(heuristically_parsed_name)) {
614           should_append_imported_name = false;
615           break;
616         }
617
618         if (current_name.ParsedNamesAreEqual(heuristically_parsed_name)) {
619           results[index] = imported_name;
620           should_append_imported_name = false;
621           break;
622         }
623       }
624     }
625
626     // Append unique names to the list.
627     if (should_append_imported_name)
628       results.push_back(imported_name);
629   }
630
631   name_.swap(results);
632 }
633
634 void AutofillProfile::OverwriteWithOrAddTo(const AutofillProfile& profile,
635                                            const std::string& app_locale) {
636   // Verified profiles should never be overwritten with unverified data.
637   DCHECK(!IsVerified() || profile.IsVerified());
638   set_origin(profile.origin());
639   set_language_code(profile.language_code());
640
641   ServerFieldTypeSet field_types;
642   profile.GetNonEmptyTypes(app_locale, &field_types);
643
644   // Only transfer "full" types (e.g. full name) and not fragments (e.g.
645   // first name, last name).
646   CollapseCompoundFieldTypes(&field_types);
647
648   // TODO(isherman): Revisit this decision in the context of i18n and storing
649   // full addresses rather than storing 1-to-2 lines of an address.
650   // For addresses, do the opposite: transfer individual address lines, rather
651   // than full addresses.
652   field_types.erase(ADDRESS_HOME_STREET_ADDRESS);
653
654   for (ServerFieldTypeSet::const_iterator iter = field_types.begin();
655        iter != field_types.end(); ++iter) {
656     FieldTypeGroup group = AutofillType(*iter).group();
657     // Special case names.
658     if (group == NAME) {
659       OverwriteOrAppendNames(profile.name_, app_locale);
660       continue;
661     }
662
663     // Single value field --- overwrite.
664     if (!AutofillProfile::SupportsMultiValue(*iter)) {
665       base::string16 new_value = profile.GetRawInfo(*iter);
666       if (base::StringToLowerASCII(GetRawInfo(*iter)) !=
667               base::StringToLowerASCII(new_value)) {
668         SetRawInfo(*iter, new_value);
669       }
670       continue;
671     }
672
673     // Multi value field --- overwrite/append.
674     std::vector<base::string16> new_values;
675     profile.GetRawMultiInfo(*iter, &new_values);
676     std::vector<base::string16> existing_values;
677     GetRawMultiInfo(*iter, &existing_values);
678
679     // GetMultiInfo always returns at least one element, even if the profile
680     // has no data stored for this field type.
681     if (existing_values.size() == 1 && existing_values.front().empty())
682       existing_values.clear();
683
684     for (std::vector<base::string16>::iterator value_iter =
685              new_values.begin();
686          value_iter != new_values.end(); ++value_iter) {
687       // Don't add duplicates. Most types get case insensitive matching.
688       std::vector<base::string16>::const_iterator existing_iter;
689
690       if (group == PHONE_HOME) {
691         // Phones allow "fuzzy" matching, so "1-800-FLOWERS", "18003569377",
692         // "(800)356-9377" and "356-9377" are considered the same.
693         std::string country_code =
694             base::UTF16ToASCII(GetRawInfo(ADDRESS_HOME_COUNTRY));
695         existing_iter =
696             std::find_if(existing_values.begin(), existing_values.end(),
697                          FindByPhone(*value_iter, country_code, app_locale));
698       } else {
699         existing_iter =
700             std::find_if(existing_values.begin(), existing_values.end(),
701                          CaseInsensitiveStringEquals(*value_iter));
702       }
703
704       if (existing_iter == existing_values.end())
705         existing_values.insert(existing_values.end(), *value_iter);
706     }
707
708     SetRawMultiInfo(*iter, existing_values);
709   }
710 }
711
712 // static
713 bool AutofillProfile::SupportsMultiValue(ServerFieldType type) {
714   FieldTypeGroup group = AutofillType(type).group();
715   return group == NAME ||
716          group == NAME_BILLING ||
717          group == EMAIL ||
718          group == PHONE_HOME ||
719          group == PHONE_BILLING;
720 }
721
722 // static
723 void AutofillProfile::CreateDifferentiatingLabels(
724     const std::vector<AutofillProfile*>& profiles,
725     const std::string& app_locale,
726     std::vector<base::string16>* labels) {
727   const size_t kMinimalFieldsShown = 2;
728   CreateInferredLabels(profiles, NULL, UNKNOWN_TYPE, kMinimalFieldsShown,
729                        app_locale, labels);
730   DCHECK_EQ(profiles.size(), labels->size());
731 }
732
733 // static
734 void AutofillProfile::CreateInferredLabels(
735     const std::vector<AutofillProfile*>& profiles,
736     const std::vector<ServerFieldType>* suggested_fields,
737     ServerFieldType excluded_field,
738     size_t minimal_fields_shown,
739     const std::string& app_locale,
740     std::vector<base::string16>* labels) {
741   std::vector<ServerFieldType> fields_to_use;
742   GetFieldsForDistinguishingProfiles(suggested_fields, excluded_field,
743                                      &fields_to_use);
744
745   // Construct the default label for each profile. Also construct a map that
746   // associates each label with the profiles that have this label. This map is
747   // then used to detect which labels need further differentiating fields.
748   std::map<base::string16, std::list<size_t> > labels_to_profiles;
749   for (size_t i = 0; i < profiles.size(); ++i) {
750     base::string16 label =
751         profiles[i]->ConstructInferredLabel(fields_to_use,
752                                             minimal_fields_shown,
753                                             app_locale);
754     labels_to_profiles[label].push_back(i);
755   }
756
757   labels->resize(profiles.size());
758   for (std::map<base::string16, std::list<size_t> >::const_iterator it =
759            labels_to_profiles.begin();
760        it != labels_to_profiles.end(); ++it) {
761     if (it->second.size() == 1) {
762       // This label is unique, so use it without any further ado.
763       base::string16 label = it->first;
764       size_t profile_index = it->second.front();
765       (*labels)[profile_index] = label;
766     } else {
767       // We have more than one profile with the same label, so add
768       // differentiating fields.
769       CreateInferredLabelsHelper(profiles, it->second, fields_to_use,
770                                  minimal_fields_shown, app_locale, labels);
771     }
772   }
773 }
774
775 void AutofillProfile::GetSupportedTypes(
776     ServerFieldTypeSet* supported_types) const {
777   FormGroupList info = FormGroups();
778   for (FormGroupList::const_iterator it = info.begin(); it != info.end(); ++it)
779     (*it)->GetSupportedTypes(supported_types);
780 }
781
782 void AutofillProfile::GetMultiInfoImpl(
783     const AutofillType& type,
784     const std::string& app_locale,
785     std::vector<base::string16>* values) const {
786   switch (type.group()) {
787     case NAME:
788     case NAME_BILLING:
789       CopyItemsToValues(type, name_, app_locale, values);
790       break;
791     case EMAIL:
792       CopyItemsToValues(type, email_, app_locale, values);
793       break;
794     case PHONE_HOME:
795     case PHONE_BILLING:
796       CopyItemsToValues(type, phone_number_, app_locale, values);
797       break;
798     default:
799       values->resize(1);
800       (*values)[0] = GetFormGroupInfo(*this, type, app_locale);
801   }
802 }
803
804 base::string16 AutofillProfile::ConstructInferredLabel(
805     const std::vector<ServerFieldType>& included_fields,
806     size_t num_fields_to_use,
807     const std::string& app_locale) const {
808   base::string16 separator =
809       l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_SUMMARY_SEPARATOR);
810
811   AutofillType region_code_type(HTML_TYPE_COUNTRY_CODE, HTML_MODE_NONE);
812   const base::string16& profile_region_code =
813       GetInfo(region_code_type, app_locale);
814   std::string address_region_code = UTF16ToUTF8(profile_region_code);
815
816   // A copy of |this| pruned down to contain only data for the address fields in
817   // |included_fields|.
818   AutofillProfile trimmed_profile(guid(), origin());
819   trimmed_profile.SetInfo(region_code_type, profile_region_code, app_locale);
820   trimmed_profile.set_language_code(language_code());
821
822   std::vector<ServerFieldType> remaining_fields;
823   for (std::vector<ServerFieldType>::const_iterator it =
824            included_fields.begin();
825        it != included_fields.end() && num_fields_to_use > 0;
826        ++it) {
827     AddressField address_field;
828     if (!i18n::FieldForType(*it, &address_field) ||
829         !::i18n::addressinput::IsFieldUsed(
830             address_field, address_region_code) ||
831         address_field == ::i18n::addressinput::COUNTRY) {
832       remaining_fields.push_back(*it);
833       continue;
834     }
835
836     AutofillType autofill_type(*it);
837     const base::string16& field_value = GetInfo(autofill_type, app_locale);
838     if (field_value.empty())
839       continue;
840
841     trimmed_profile.SetInfo(autofill_type, field_value, app_locale);
842     --num_fields_to_use;
843   }
844
845   scoped_ptr<AddressData> address_data =
846       i18n::CreateAddressDataFromAutofillProfile(trimmed_profile, app_locale);
847   std::string address_line;
848   ::i18n::addressinput::GetFormattedNationalAddressLine(
849       *address_data, &address_line);
850   base::string16 label = base::UTF8ToUTF16(address_line);
851
852   for (std::vector<ServerFieldType>::const_iterator it =
853            remaining_fields.begin();
854        it != remaining_fields.end() && num_fields_to_use > 0;
855        ++it) {
856     const base::string16& field_value = GetInfo(AutofillType(*it), app_locale);
857     if (field_value.empty())
858       continue;
859
860     if (!label.empty())
861       label.append(separator);
862
863     label.append(field_value);
864     --num_fields_to_use;
865   }
866
867   // If country code is missing, libaddressinput won't be used to format the
868   // address. In this case the suggestion might include a multi-line street
869   // address which needs to be flattened.
870   base::ReplaceChars(label, base::ASCIIToUTF16("\n"), separator, &label);
871
872   return label;
873 }
874
875 // static
876 void AutofillProfile::CreateInferredLabelsHelper(
877     const std::vector<AutofillProfile*>& profiles,
878     const std::list<size_t>& indices,
879     const std::vector<ServerFieldType>& fields,
880     size_t num_fields_to_include,
881     const std::string& app_locale,
882     std::vector<base::string16>* labels) {
883   // For efficiency, we first construct a map of fields to their text values and
884   // each value's frequency.
885   std::map<ServerFieldType,
886            std::map<base::string16, size_t> > field_text_frequencies_by_field;
887   for (std::vector<ServerFieldType>::const_iterator field = fields.begin();
888        field != fields.end(); ++field) {
889     std::map<base::string16, size_t>& field_text_frequencies =
890         field_text_frequencies_by_field[*field];
891
892     for (std::list<size_t>::const_iterator it = indices.begin();
893          it != indices.end(); ++it) {
894       const AutofillProfile* profile = profiles[*it];
895       base::string16 field_text =
896           profile->GetInfo(AutofillType(*field), app_locale);
897
898       // If this label is not already in the map, add it with frequency 0.
899       if (!field_text_frequencies.count(field_text))
900         field_text_frequencies[field_text] = 0;
901
902       // Now, increment the frequency for this label.
903       ++field_text_frequencies[field_text];
904     }
905   }
906
907   // Now comes the meat of the algorithm. For each profile, we scan the list of
908   // fields to use, looking for two things:
909   //  1. A (non-empty) field that differentiates the profile from all others
910   //  2. At least |num_fields_to_include| non-empty fields
911   // Before we've satisfied condition (2), we include all fields, even ones that
912   // are identical across all the profiles. Once we've satisfied condition (2),
913   // we only include fields that that have at last two distinct values.
914   for (std::list<size_t>::const_iterator it = indices.begin();
915        it != indices.end(); ++it) {
916     const AutofillProfile* profile = profiles[*it];
917
918     std::vector<ServerFieldType> label_fields;
919     bool found_differentiating_field = false;
920     for (std::vector<ServerFieldType>::const_iterator field = fields.begin();
921          field != fields.end(); ++field) {
922       // Skip over empty fields.
923       base::string16 field_text =
924           profile->GetInfo(AutofillType(*field), app_locale);
925       if (field_text.empty())
926         continue;
927
928       std::map<base::string16, size_t>& field_text_frequencies =
929           field_text_frequencies_by_field[*field];
930       found_differentiating_field |=
931           !field_text_frequencies.count(base::string16()) &&
932           (field_text_frequencies[field_text] == 1);
933
934       // Once we've found enough non-empty fields, skip over any remaining
935       // fields that are identical across all the profiles.
936       if (label_fields.size() >= num_fields_to_include &&
937           (field_text_frequencies.size() == 1))
938         continue;
939
940       label_fields.push_back(*field);
941
942       // If we've (1) found a differentiating field and (2) found at least
943       // |num_fields_to_include| non-empty fields, we're done!
944       if (found_differentiating_field &&
945           label_fields.size() >= num_fields_to_include)
946         break;
947     }
948
949     (*labels)[*it] = profile->ConstructInferredLabel(
950         label_fields, label_fields.size(), app_locale);
951   }
952 }
953
954 AutofillProfile::FormGroupList AutofillProfile::FormGroups() const {
955   FormGroupList v(5);
956   v[0] = &name_[0];
957   v[1] = &email_[0];
958   v[2] = &company_;
959   v[3] = &phone_number_[0];
960   v[4] = &address_;
961   return v;
962 }
963
964 const FormGroup* AutofillProfile::FormGroupForType(
965     const AutofillType& type) const {
966   return const_cast<AutofillProfile*>(this)->MutableFormGroupForType(type);
967 }
968
969 FormGroup* AutofillProfile::MutableFormGroupForType(const AutofillType& type) {
970   switch (type.group()) {
971     case NAME:
972     case NAME_BILLING:
973       return &name_[0];
974
975     case EMAIL:
976       return &email_[0];
977
978     case COMPANY:
979       return &company_;
980
981     case PHONE_HOME:
982     case PHONE_BILLING:
983       return &phone_number_[0];
984
985     case ADDRESS_HOME:
986     case ADDRESS_BILLING:
987       return &address_;
988
989     case NO_GROUP:
990     case CREDIT_CARD:
991     case PASSWORD_FIELD:
992     case TRANSACTION:
993         return NULL;
994   }
995
996   NOTREACHED();
997   return NULL;
998 }
999
1000 // So we can compare AutofillProfiles with EXPECT_EQ().
1001 std::ostream& operator<<(std::ostream& os, const AutofillProfile& profile) {
1002   return os
1003       << profile.guid()
1004       << " "
1005       << profile.origin()
1006       << " "
1007       << UTF16ToUTF8(MultiString(profile, NAME_FIRST))
1008       << " "
1009       << UTF16ToUTF8(MultiString(profile, NAME_MIDDLE))
1010       << " "
1011       << UTF16ToUTF8(MultiString(profile, NAME_LAST))
1012       << " "
1013       << UTF16ToUTF8(MultiString(profile, EMAIL_ADDRESS))
1014       << " "
1015       << UTF16ToUTF8(profile.GetRawInfo(COMPANY_NAME))
1016       << " "
1017       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_LINE1))
1018       << " "
1019       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_LINE2))
1020       << " "
1021       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY))
1022       << " "
1023       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_CITY))
1024       << " "
1025       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE))
1026       << " "
1027       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP))
1028       << " "
1029       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE))
1030       << " "
1031       << UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY))
1032       << " "
1033       << profile.language_code()
1034       << " "
1035       << UTF16ToUTF8(MultiString(profile, PHONE_HOME_WHOLE_NUMBER));
1036 }
1037
1038 }  // namespace autofill