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