autofill_field.cc revision 116680a4aac90f2aa7413d9095a592090648e557
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copyright 2013 The Chromium Authors. All rights reserved.
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Use of this source code is governed by a BSD-style license that can be
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// found in the LICENSE file.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "components/autofill/core/browser/autofill_field.h"
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/logging.h"
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/sha1.h"
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/strings/string_number_conversions.h"
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/strings/string_split.h"
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/strings/string_util.h"
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/strings/utf_string_conversions.h"
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "components/autofill/core/browser/autofill_country.h"
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "components/autofill/core/browser/autofill_type.h"
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "components/autofill/core/browser/phone_number.h"
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "components/autofill/core/browser/state_names.h"
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "grit/components_strings.h"
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "ui/base/l10n/l10n_util.h"
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing base::ASCIIToUTF16;
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing base::StringToInt;
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocknamespace autofill {
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocknamespace {
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockconst char* const kMonthsAbbreviated[] = {
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  NULL,  // Padding so index 1 = month 1 = January.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockconst char* const kMonthsFull[] = {
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  NULL,  // Padding so index 1 = month 1 = January.
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  "January", "February", "March", "April", "May", "June",
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  "July", "August", "September", "October", "November", "December",
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Returns true if the value was successfully set, meaning |value| was found in
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// the list of select options in |field|.
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool SetSelectControlValue(const base::string16& value,
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           FormFieldData* field) {
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 value_lowercase = StringToLowerASCII(value);
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ(field->option_values.size(), field->option_contents.size());
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 best_match;
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (size_t i = 0; i < field->option_values.size(); ++i) {
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (value == field->option_values[i] ||
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        value == field->option_contents[i]) {
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // An exact match, use it.
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      best_match = field->option_values[i];
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      break;
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (value_lowercase == StringToLowerASCII(field->option_values[i]) ||
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        value_lowercase == StringToLowerASCII(field->option_contents[i])) {
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // A match, but not in the same case. Save it in case an exact match is
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // not found.
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      best_match = field->option_values[i];
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (best_match.empty())
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  field->value = best_match;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Like SetSelectControlValue, but searches within the field values and options
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for |value|. For example, "NC - North Carolina" would match "north carolina".
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool SetSelectControlValueSubstringMatch(const base::string16& value,
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         FormFieldData* field) {
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 value_lowercase = StringToLowerASCII(value);
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ(field->option_values.size(), field->option_contents.size());
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int best_match = -1;
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t i = 0; i < field->option_values.size(); ++i) {
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (StringToLowerASCII(field->option_values[i]).find(value_lowercase) !=
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            std::string::npos ||
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        StringToLowerASCII(field->option_contents[i]).find(value_lowercase) !=
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            std::string::npos) {
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      // The best match is the shortest one.
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (best_match == -1 ||
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          field->option_values[best_match].size() >
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              field->option_values[i].size()) {
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        best_match = i;
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (best_match >= 0) {
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    field->value = field->option_values[best_match];
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Like SetSelectControlValue, but searches within the field values and options
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for |value|. First it tokenizes the options, then tries to match against
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// tokens. For example, "NC - North Carolina" would match "nc" but not "ca".
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool SetSelectControlValueTokenMatch(const base::string16& value,
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     FormFieldData* field) {
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 value_lowercase = StringToLowerASCII(value);
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::vector<base::string16> tokenized;
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ(field->option_values.size(), field->option_contents.size());
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t i = 0; i < field->option_values.size(); ++i) {
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    base::SplitStringAlongWhitespace(
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        StringToLowerASCII(field->option_values[i]), &tokenized);
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (std::find(tokenized.begin(), tokenized.end(), value_lowercase) !=
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        tokenized.end()) {
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field->value = field->option_values[i];
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    base::SplitStringAlongWhitespace(
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        StringToLowerASCII(field->option_contents[i]), &tokenized);
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (std::find(tokenized.begin(), tokenized.end(), value_lowercase) !=
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        tokenized.end()) {
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field->value = field->option_values[i];
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Try to fill a numeric |value| into the given |field|.
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillNumericSelectControl(int value,
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              FormFieldData* field) {
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ(field->option_values.size(), field->option_contents.size());
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (size_t i = 0; i < field->option_values.size(); ++i) {
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    int option;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if ((StringToInt(field->option_values[i], &option) && option == value) ||
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        (StringToInt(field->option_contents[i], &option) && option == value)) {
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field->value = field->option_values[i];
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillStateSelectControl(const base::string16& value,
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            FormFieldData* field) {
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 full, abbreviation;
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  state_names::GetNameAndAbbreviation(value, &full, &abbreviation);
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Try an exact match of the abbreviation first.
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!abbreviation.empty() && SetSelectControlValue(abbreviation, field)) {
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Try an exact match of the full name.
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!full.empty() && SetSelectControlValue(full, field)) {
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Then try an inexact match of the full name.
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!full.empty() && SetSelectControlValueSubstringMatch(full, field)) {
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return true;
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Then try an inexact match of the abbreviation name.
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return !abbreviation.empty() &&
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      SetSelectControlValueTokenMatch(abbreviation, field);
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillCountrySelectControl(const base::string16& value,
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                              const std::string& app_locale,
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                              FormFieldData* field_data) {
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  std::string country_code = AutofillCountry::GetCountryCode(value, app_locale);
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (country_code.empty())
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return false;
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  DCHECK_EQ(field_data->option_values.size(),
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            field_data->option_contents.size());
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t i = 0; i < field_data->option_values.size(); ++i) {
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Canonicalize each <option> value to a country code, and compare to the
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // target country code.
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    base::string16 value = field_data->option_values[i];
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    base::string16 contents = field_data->option_contents[i];
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (country_code == AutofillCountry::GetCountryCode(value, app_locale) ||
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        country_code == AutofillCountry::GetCountryCode(contents, app_locale)) {
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field_data->value = value;
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillExpirationMonthSelectControl(const base::string16& value,
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      FormFieldData* field) {
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int index = 0;
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!StringToInt(value, &index) ||
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      index <= 0 ||
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      static_cast<size_t>(index) >= arraysize(kMonthsFull))
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool filled =
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      SetSelectControlValue(ASCIIToUTF16(kMonthsAbbreviated[index]), field) ||
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      SetSelectControlValue(ASCIIToUTF16(kMonthsFull[index]), field) ||
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      FillNumericSelectControl(index, field);
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return filled;
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Returns true if the last two digits in |year| match those in |str|.
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool LastTwoDigitsMatch(const base::string16& year,
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                        const base::string16& str) {
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int year_int;
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  int str_int;
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (!StringToInt(year, &year_int) || !StringToInt(str, &str_int))
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (year_int % 100) == (str_int % 100);
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Try to fill a year |value| into the given |field| by comparing the last two
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// digits of the year to the field's options.
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillYearSelectControl(const base::string16& value,
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           FormFieldData* field) {
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (value.size() != 2U && value.size() != 4U)
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ(field->option_values.size(), field->option_contents.size());
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (size_t i = 0; i < field->option_values.size(); ++i) {
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (LastTwoDigitsMatch(value, field->option_values[i]) ||
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        LastTwoDigitsMatch(value, field->option_contents[i])) {
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field->value = field->option_values[i];
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Try to fill a credit card type |value| (Visa, MasterCard, etc.) into the
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// given |field|.
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillCreditCardTypeSelectControl(const base::string16& value,
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     FormFieldData* field) {
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Try stripping off spaces.
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 value_stripped;
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::RemoveChars(StringToLowerASCII(value), base::kWhitespaceUTF16,
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    &value_stripped);
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (size_t i = 0; i < field->option_values.size(); ++i) {
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    base::string16 option_value_lowercase;
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    base::RemoveChars(StringToLowerASCII(field->option_values[i]),
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      base::kWhitespaceUTF16, &option_value_lowercase);
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    base::string16 option_contents_lowercase;
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    base::RemoveChars(StringToLowerASCII(field->option_contents[i]),
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      base::kWhitespaceUTF16, &option_contents_lowercase);
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Perform a case-insensitive comparison; but fill the form with the
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // original text, not the lowercased version.
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (value_stripped == option_value_lowercase ||
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        value_stripped == option_contents_lowercase) {
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      field->value = field->option_values[i];
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return true;
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // For American Express, also try filling as "AmEx".
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (value == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX))
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillCreditCardTypeSelectControl(ASCIIToUTF16("AmEx"), field);
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Set |field_data|'s value to |number|, or possibly an appropriate substring of
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// |number|.  The |field| specifies the type of the phone and whether this is a
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// phone prefix or suffix.
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid FillPhoneNumberField(const AutofillField& field,
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const base::string16& number,
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          FormFieldData* field_data) {
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check to see if the size field matches the "prefix" or "suffix" sizes and
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // fill accordingly.
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 value = number;
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (number.length() ==
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          PhoneNumber::kPrefixLength + PhoneNumber::kSuffixLength) {
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (field.phone_part() == AutofillField::PHONE_PREFIX ||
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        field_data->max_length == PhoneNumber::kPrefixLength) {
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      value = number.substr(PhoneNumber::kPrefixOffset,
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            PhoneNumber::kPrefixLength);
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } else if (field.phone_part() == AutofillField::PHONE_SUFFIX ||
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               field_data->max_length == PhoneNumber::kSuffixLength) {
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      value = number.substr(PhoneNumber::kSuffixOffset,
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            PhoneNumber::kSuffixLength);
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  field_data->value = value;
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Fills in the select control |field| with |value|.  If an exact match is not
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// found, falls back to alternate filling strategies based on the |type|.
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool FillSelectControl(const AutofillType& type,
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const base::string16& value,
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const std::string& app_locale,
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       FormFieldData* field) {
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  DCHECK_EQ("select-one", field->form_control_type);
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Guard against corrupted values passed over IPC.
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (field->option_values.size() != field->option_contents.size())
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (value.empty())
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // First, search for exact matches.
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (SetSelectControlValue(value, field))
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If that fails, try specific fallbacks based on the field type.
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ServerFieldType storable_type = type.GetStorableType();
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (storable_type == ADDRESS_HOME_STATE) {
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillStateSelectControl(value, field);
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else if (storable_type == ADDRESS_HOME_COUNTRY) {
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillCountrySelectControl(value, app_locale, field);
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else if (storable_type == CREDIT_CARD_EXP_MONTH) {
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillExpirationMonthSelectControl(value, field);
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else if (storable_type == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott             storable_type == CREDIT_CARD_EXP_4_DIGIT_YEAR) {
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillYearSelectControl(value, field);
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else if (storable_type == CREDIT_CARD_TYPE) {
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillCreditCardTypeSelectControl(value, field);
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return false;
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Fills in the month control |field| with |value|.  |value| should be a date
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// formatted as MM/YYYY.  If it isn't, filling will fail.
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool FillMonthControl(const base::string16& value, FormFieldData* field) {
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Autofill formats a combined date as month/year.
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::vector<base::string16> pieces;
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  base::SplitString(value, base::char16('/'), &pieces);
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (pieces.size() != 2)
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return false;
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // HTML5 input="month" is formatted as year-month.
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 month = pieces[0];
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::string16 year = pieces[1];
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if ((month.size() != 1 && month.size() != 2) || year.size() != 4)
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return false;
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // HTML5 input="month" expects zero-padded months.
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (month.size() == 1)
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    month = ASCIIToUTF16("0") + month;
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  field->value = year + ASCIIToUTF16("-") + month;
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Fills |field| with the street address in |value|.  Translates newlines into
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// equivalent separators when necessary, i.e. when filling a single-line field.
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid FillStreetAddress(const base::string16& value,
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       FormFieldData* field) {
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (field->form_control_type == "textarea") {
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    field->value = value;
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const base::string16& separator =
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      l10n_util::GetStringUTF16(IDS_AUTOFILL_ADDRESS_LINE_SEPARATOR);
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  base::ReplaceChars(value, base::ASCIIToUTF16("\n"), separator, &field->value);
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstd::string Hash32Bit(const std::string& str) {
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::string hash_bin = base::SHA1HashString(str);
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  DCHECK_EQ(20U, hash_bin.length());
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  uint32 hash32 = ((hash_bin[0] & 0xFF) << 24) |
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  ((hash_bin[1] & 0xFF) << 16) |
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  ((hash_bin[2] & 0xFF) << 8) |
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   (hash_bin[3] & 0xFF);
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return base::UintToString(hash32);
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}  // namespace
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottAutofillField::AutofillField()
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : server_type_(NO_SERVER_DATA),
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      heuristic_type_(UNKNOWN_TYPE),
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      html_type_(HTML_TYPE_UNKNOWN),
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      html_mode_(HTML_MODE_NONE),
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      phone_part_(IGNORED) {
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockAutofillField::AutofillField(const FormFieldData& field,
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                             const base::string16& unique_name)
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : FormFieldData(field),
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      unique_name_(unique_name),
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      server_type_(NO_SERVER_DATA),
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      heuristic_type_(UNKNOWN_TYPE),
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      html_type_(HTML_TYPE_UNKNOWN),
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      html_mode_(HTML_MODE_NONE),
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      phone_part_(IGNORED) {
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockAutofillField::~AutofillField() {}
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AutofillField::set_heuristic_type(ServerFieldType type) {
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (type >= 0 && type < MAX_VALID_FIELD_TYPE &&
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      type != FIELD_WITH_DEFAULT_VALUE) {
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    heuristic_type_ = type;
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else {
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    NOTREACHED();
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // This case should not be reachable; but since this has potential
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // implications on data uploaded to the server, better safe than sorry.
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    heuristic_type_ = UNKNOWN_TYPE;
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid AutofillField::set_server_type(ServerFieldType type) {
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Chrome no longer supports fax numbers, but the server still does.
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (type >= PHONE_FAX_NUMBER && type <= PHONE_FAX_WHOLE_NUMBER)
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return;
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  server_type_ = type;
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid AutofillField::SetHtmlType(HtmlFieldType type, HtmlFieldMode mode) {
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  html_type_ = type;
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  html_mode_ = mode;
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (type == HTML_TYPE_TEL_LOCAL_PREFIX)
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    phone_part_ = PHONE_PREFIX;
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else if (type == HTML_TYPE_TEL_LOCAL_SUFFIX)
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    phone_part_ = PHONE_SUFFIX;
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    phone_part_ = IGNORED;
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockAutofillType AutofillField::Type() const {
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (html_type_ != HTML_TYPE_UNKNOWN)
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return AutofillType(html_type_, html_mode_);
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (server_type_ != NO_SERVER_DATA)
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return AutofillType(server_type_);
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return AutofillType(heuristic_type_);
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool AutofillField::IsEmpty() const {
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return value.empty();
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstd::string AutofillField::FieldSignature() const {
453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  std::string field_name = base::UTF16ToUTF8(name);
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  std::string field_string = field_name + "&" + form_control_type;
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return Hash32Bit(field_string);
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool AutofillField::IsFieldFillable() const {
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return should_autocomplete && !Type().IsUnknown();
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// static
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool AutofillField::FillFormField(const AutofillField& field,
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  const base::string16& value,
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  const std::string& app_locale,
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  FormFieldData* field_data) {
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  AutofillType type = field.Type();
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (type.GetStorableType() == PHONE_HOME_NUMBER) {
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    FillPhoneNumberField(field, value, field_data);
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  } else if (field_data->form_control_type == "select-one") {
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return FillSelectControl(type, value, app_locale, field_data);
474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  } else if (field_data->form_control_type == "month") {
475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return FillMonthControl(value, field_data);
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  } else if (type.GetStorableType() == ADDRESS_HOME_STREET_ADDRESS) {
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    FillStreetAddress(value, field_data);
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return true;
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  field_data->value = value;
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}  // namespace autofill
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block