1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/contact_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char* const name_prefixes[] = {
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "1lt", "1st", "2lt", "2nd", "3rd", "admiral", "capt", "captain", "col",
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "cpt", "dr", "gen", "general", "lcdr", "lt", "ltc", "ltg", "ltjg", "maj",
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "major", "mg", "mr", "mrs", "ms", "pastor", "prof", "rep", "reverend",
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "rev", "sen", "st" };
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char* const name_suffixes[] = {
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "b.a", "ba", "d.d.s", "dds", "i", "ii", "iii", "iv", "ix", "jr", "m.a",
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "m.d", "ma", "md", "ms", "ph.d", "phd", "sr", "v", "vi", "vii", "viii",
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "x" };
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char* const family_name_prefixes[] = {
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "d'", "de", "del", "der", "di", "la", "le", "mc", "san", "st", "ter",
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "van", "von" };
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Returns true if |set| contains |element|, modulo a final period.
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool ContainsString(const char* const set[],
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    size_t set_size,
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                    const base::string16& element) {
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!base::IsStringASCII(element))
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return false;
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::string16 trimmed_element;
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::TrimString(element, base::ASCIIToUTF16("."), &trimmed_element);
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  for (size_t i = 0; i < set_size; ++i) {
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (LowerCaseEqualsASCII(trimmed_element, set[i]))
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return true;
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return false;
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Removes common name prefixes from |name_tokens|.
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void StripPrefixes(std::vector<base::string16>* name_tokens) {
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<base::string16>::iterator iter = name_tokens->begin();
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while(iter != name_tokens->end()) {
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (!ContainsString(name_prefixes, arraysize(name_prefixes), *iter))
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      break;
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ++iter;
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<base::string16> copy_vector;
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  copy_vector.assign(iter, name_tokens->end());
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  *name_tokens = copy_vector;
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Removes common name suffixes from |name_tokens|.
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void StripSuffixes(std::vector<base::string16>* name_tokens) {
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while(!name_tokens->empty()) {
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (!ContainsString(name_suffixes, arraysize(name_suffixes),
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        name_tokens->back())) {
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      break;
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    }
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    name_tokens->pop_back();
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)struct NameParts {
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::string16 given;
816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::string16 middle;
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::string16 family;
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// TODO(estade): This does Western name splitting. It should do different
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// splitting based on the app locale.
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)NameParts SplitName(const base::string16& name) {
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<base::string16> name_tokens;
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Tokenize(name, base::ASCIIToUTF16(" ,"), &name_tokens);
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  StripPrefixes(&name_tokens);
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Don't assume "Ma" is a suffix in John Ma.
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (name_tokens.size() > 2)
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    StripSuffixes(&name_tokens);
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NameParts parts;
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (name_tokens.empty()) {
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Bad things have happened; just assume the whole thing is a given name.
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    parts.given = name;
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return parts;
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Only one token, assume given name.
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (name_tokens.size() == 1) {
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    parts.given = name_tokens[0];
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return parts;
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // 2 or more tokens. Grab the family, which is the last word plus any
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // recognizable family prefixes.
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<base::string16> reverse_family_tokens;
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  reverse_family_tokens.push_back(name_tokens.back());
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  name_tokens.pop_back();
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while (name_tokens.size() >= 1 &&
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)         ContainsString(family_name_prefixes,
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        arraysize(family_name_prefixes),
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        name_tokens.back())) {
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    reverse_family_tokens.push_back(name_tokens.back());
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    name_tokens.pop_back();
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::vector<base::string16> family_tokens(reverse_family_tokens.rbegin(),
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                            reverse_family_tokens.rend());
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  parts.family = JoinString(family_tokens, base::char16(' '));
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Take the last remaining token as the middle name (if there are at least 2
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // tokens).
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (name_tokens.size() >= 2) {
1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    parts.middle = name_tokens.back();
1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    name_tokens.pop_back();
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Remainder is given name.
1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  parts.given = JoinString(name_tokens, base::char16(' '));
1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return parts;
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NameInfo::NameInfo() {}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NameInfo::NameInfo(const NameInfo& info) : FormGroup() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *this = info;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NameInfo::~NameInfo() {}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NameInfo& NameInfo::operator=(const NameInfo& info) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this == &info)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  given_ = info.given_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  middle_ = info.middle_;
1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  family_ = info.family_;
1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  full_ = info.full_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *this;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NameInfo::ParsedNamesAreEqual(const NameInfo& info) {
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return (base::StringToLowerASCII(given_) ==
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              base::StringToLowerASCII(info.given_) &&
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          base::StringToLowerASCII(middle_) ==
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              base::StringToLowerASCII(info.middle_) &&
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          base::StringToLowerASCII(family_) ==
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              base::StringToLowerASCII(info.family_));
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid NameInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(NAME_FIRST);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(NAME_MIDDLE);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(NAME_LAST);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(NAME_MIDDLE_INITIAL);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(NAME_FULL);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbase::string16 NameInfo::GetRawInfo(ServerFieldType type) const {
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK_EQ(NAME, AutofillType(type).group());
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
182bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_FIRST:
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return given_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_MIDDLE:
1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return middle_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_LAST:
1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return family_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_MIDDLE_INITIAL:
192bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      return MiddleInitial();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_FULL:
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return full_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    default:
198bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      return base::string16();
199bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid NameInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK_EQ(NAME, AutofillType(type).group());
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  switch (type) {
206bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_FIRST:
2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      given_ = value;
208bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      break;
209bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
210bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_MIDDLE:
211bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_MIDDLE_INITIAL:
212bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      middle_ = value;
213bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      break;
214bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
215bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_LAST:
2166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      family_ = value;
217bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      break;
218bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
219bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case NAME_FULL:
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      full_ = value;
221bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      break;
222bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
223bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    default:
224bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      NOTREACHED();
225bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 NameInfo::GetInfo(const AutofillType& type,
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 const std::string& app_locale) const {
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (type.GetStorableType() == NAME_FULL)
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return FullName();
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetRawInfo(type.GetStorableType());
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NameInfo::SetInfo(const AutofillType& type,
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       const base::string16& value,
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       const std::string& app_locale) {
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Always clear out the full name if we're making a change.
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (value != GetInfo(type, app_locale))
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    full_.clear();
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (type.GetStorableType() == NAME_FULL) {
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetFullName(value);
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return FormGroup::SetInfo(type, value, app_locale);
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 NameInfo::FullName() const {
2526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!full_.empty())
2536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return full_;
2546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> full_name;
2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!given_.empty())
2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    full_name.push_back(given_);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!middle_.empty())
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name.push_back(middle_);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!family_.empty())
2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    full_name.push_back(family_);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return JoinString(full_name, ' ');
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 NameInfo::MiddleInitial() const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (middle_.empty())
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return base::string16();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::string16 middle_name(middle_);
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 initial;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initial.push_back(middle_name[0]);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return initial;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NameInfo::SetFullName(const base::string16& full) {
2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  full_ = full;
2806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // If |full| is empty, leave the other name parts alone. This might occur
2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // due to a migrated database with an empty |full_name| value.
2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (full.empty())
2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return;
2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  NameParts parts = SplitName(full);
2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  given_ = parts.given;
2886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  middle_ = parts.middle;
2896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  family_ = parts.family;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EmailInfo::EmailInfo() {}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EmailInfo::EmailInfo(const EmailInfo& info) : FormGroup() {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *this = info;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EmailInfo::~EmailInfo() {}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EmailInfo& EmailInfo::operator=(const EmailInfo& info) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this == &info)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_ = info.email_;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *this;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid EmailInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(EMAIL_ADDRESS);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbase::string16 EmailInfo::GetRawInfo(ServerFieldType type) const {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == EMAIL_ADDRESS)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return email_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::string16();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid EmailInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(EMAIL_ADDRESS, type);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_ = value;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompanyInfo::CompanyInfo() {}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompanyInfo::CompanyInfo(const CompanyInfo& info) : FormGroup() {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *this = info;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompanyInfo::~CompanyInfo() {}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompanyInfo& CompanyInfo::operator=(const CompanyInfo& info) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (this == &info)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  company_name_ = info.company_name_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *this;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid CompanyInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  supported_types->insert(COMPANY_NAME);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochbase::string16 CompanyInfo::GetRawInfo(ServerFieldType type) const {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == COMPANY_NAME)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return company_name_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::string16();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid CompanyInfo::SetRawInfo(ServerFieldType type,
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const base::string16& value) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(COMPANY_NAME, type);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  company_name_ = value;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
358