| Index: chrome/browser/autofill/autofill_type.cc | 
| diff --git a/chrome/browser/autofill/autofill_type.cc b/chrome/browser/autofill/autofill_type.cc | 
| index 46c2aef18c5aa43833ce6af02728821daefb2f76..030b12cbc816c3acad8d039f01f620f1846090af 100644 | 
| --- a/chrome/browser/autofill/autofill_type.cc | 
| +++ b/chrome/browser/autofill/autofill_type.cc | 
| @@ -7,99 +7,164 @@ | 
| #include "base/basictypes.h" | 
| #include "base/logging.h" | 
|  | 
| -// TODO(jhawkins) all of the Human Readable names will need to be added to a | 
| -// resource file and localized because they are used in the confirmation | 
| -// dialog. | 
| -AutoFillType::AutoFillTypeDefinition kAutoFillTypeDefinitions[] = { | 
| -  { NO_SERVER_DATA, AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP, "No Server Data" }, | 
| -  { UNKNOWN_TYPE, AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP, "Unknown Type" }, | 
| -  { EMPTY_TYPE, AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP, "Empty Type" }, | 
| - | 
| -  { NAME_FIRST, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "First Name" }, | 
| -  { NAME_MIDDLE, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Middle Name" }, | 
| -  { NAME_LAST, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Last Name" }, | 
| -  { NAME_MIDDLE_INITIAL, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Middle Initial" }, | 
| -  { NAME_FULL, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Full Name" }, | 
| -  { NAME_SUFFIX, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Name Suffix" }, | 
| - | 
| -  { EMAIL_ADDRESS, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Email Address" }, | 
| -  { COMPANY_NAME, AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP, "Company Name" }, | 
| - | 
| -  { PHONE_HOME_NUMBER, AutoFillType::PHONE_HOME, AutoFillType::PHONE_NUMBER, "Home Phone Number" }, | 
| -  { PHONE_HOME_CITY_CODE, AutoFillType::PHONE_HOME, AutoFillType::PHONE_CITY_CODE, "Home Area Code" }, | 
| -  { PHONE_HOME_COUNTRY_CODE, AutoFillType::PHONE_HOME, AutoFillType::PHONE_COUNTRY_CODE, "Home Country Code" }, | 
| -  { PHONE_HOME_CITY_AND_NUMBER, AutoFillType::PHONE_HOME, AutoFillType::PHONE_CITY_AND_NUMBER, "Home Phone Number" }, | 
| -  { PHONE_HOME_WHOLE_NUMBER, AutoFillType::PHONE_HOME, AutoFillType::PHONE_WHOLE_NUMBER, "Home Phone Number" }, | 
| - | 
| -  { PHONE_FAX_NUMBER, AutoFillType::PHONE_FAX, AutoFillType::PHONE_NUMBER,  "Fax Number" }, | 
| -  { PHONE_FAX_CITY_CODE, AutoFillType::PHONE_FAX, AutoFillType::PHONE_CITY_CODE, "Fax Area Code" }, | 
| -  { PHONE_FAX_COUNTRY_CODE, AutoFillType::PHONE_FAX, AutoFillType::PHONE_COUNTRY_CODE, "Fax Country Code" }, | 
| -  { PHONE_FAX_CITY_AND_NUMBER, AutoFillType::PHONE_FAX, AutoFillType::PHONE_CITY_AND_NUMBER, "Fax Number" }, | 
| -  { PHONE_FAX_WHOLE_NUMBER, AutoFillType::PHONE_FAX, AutoFillType::PHONE_WHOLE_NUMBER, "Fax Number" }, | 
| - | 
| -  { ADDRESS_HOME_LINE1, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_LINE1, "Home Address Line 1" }, | 
| -  { ADDRESS_HOME_LINE2, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_LINE2, "Home Address Line 2" }, | 
| -  { ADDRESS_HOME_APT_NUM, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_APT_NUM, "Home Address Apartment Number" }, | 
| -  { ADDRESS_HOME_CITY, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_CITY,  "Home Address City" }, | 
| -  { ADDRESS_HOME_STATE, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_STATE, "Home Address State" }, | 
| -  { ADDRESS_HOME_ZIP, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_ZIP, "Home Address Zip Code" }, | 
| -  { ADDRESS_HOME_COUNTRY, AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_COUNTRY, "Home Address Country" }, | 
| - | 
| -  { ADDRESS_BILLING_LINE1, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_LINE1, "Billing Address Line 1" }, | 
| -  { ADDRESS_BILLING_LINE2, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_LINE2, "Billing Address Line 2" }, | 
| -  { ADDRESS_BILLING_APT_NUM, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_APT_NUM, "Billing Address Apartment Number" }, | 
| -  { ADDRESS_BILLING_CITY, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_CITY,  "Billing Address City" }, | 
| -  { ADDRESS_BILLING_STATE, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_STATE, "Billing Address State" }, | 
| -  { ADDRESS_BILLING_ZIP, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_ZIP, "Billing Address Zip Code" }, | 
| -  { ADDRESS_BILLING_COUNTRY, AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_COUNTRY, "Billing Address Country" }, | 
| - | 
| -  { CREDIT_CARD_NAME, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Name on Credit Card" }, | 
| -  { CREDIT_CARD_NUMBER, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Number" }, | 
| -  { CREDIT_CARD_EXP_MONTH, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Expiration Month" }, | 
| -  { CREDIT_CARD_EXP_2_DIGIT_YEAR, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Expiration Year" }, | 
| -  { CREDIT_CARD_EXP_4_DIGIT_YEAR, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Expiration Year" }, | 
| -  { CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Expiration Date" }, | 
| -  { CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Expiration Date" }, | 
| -  { CREDIT_CARD_TYPE, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Type" }, | 
| -  { CREDIT_CARD_VERIFICATION_CODE, AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP, "Credit Card Verification Number" }, | 
| - | 
| -  { MAX_VALID_FIELD_TYPE, AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP, "" }, | 
| +namespace { | 
| + | 
| +const AutoFillType::AutoFillTypeDefinition kUnknownAutoFillTypeDefinition = { | 
| +  /* UNKNOWN_TYPE */ AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP | 
| }; | 
|  | 
| -bool AutoFillType::initialized_ = false; | 
| -AutoFillType AutoFillType::types_[MAX_VALID_FIELD_TYPE + 1]; | 
| +AutoFillType::AutoFillTypeDefinition kAutoFillTypeDefinitions[] = { | 
| +  // NO_SERVER_DATA | 
| +  { AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP }, | 
| +  // UNKNOWN_TYPE | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  // EMPTY_TYPE | 
| +  { AutoFillType::NO_GROUP, AutoFillType::NO_SUBGROUP }, | 
| + | 
| +  // NAME_FIRST | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +  // NAME_MIDDLE | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +  // NAME_LAST | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +  // NAME_MIDDLE_INITIAL | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +  // NAME_FULL | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +  // NAME_SUFFIX | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| + | 
| +  // EMAIL_ADDRESS | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| + | 
| +  // PHONE_HOME_NUMBER | 
| +  { AutoFillType::PHONE_HOME, AutoFillType::PHONE_NUMBER }, | 
| +  // PHONE_HOME_CITY_CODE | 
| +  { AutoFillType::PHONE_HOME, AutoFillType::PHONE_CITY_CODE }, | 
| +  // PHONE_HOME_COUNTRY_CODE | 
| +  { AutoFillType::PHONE_HOME, AutoFillType::PHONE_COUNTRY_CODE }, | 
| +  // PHONE_HOME_CITY_AND_NUMBER | 
| +  { AutoFillType::PHONE_HOME, AutoFillType::PHONE_CITY_AND_NUMBER }, | 
| +  // PHONE_HOME_WHOLE_NUMBER | 
| +  { AutoFillType::PHONE_HOME, AutoFillType::PHONE_WHOLE_NUMBER }, | 
| + | 
| +  // Work phone numbers (values [15,19]) are deprecated. | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| + | 
| +  // PHONE_FAX_NUMBER | 
| +  { AutoFillType::PHONE_FAX, AutoFillType::PHONE_NUMBER }, | 
| +  // PHONE_FAX_CITY_CODE | 
| +  { AutoFillType::PHONE_FAX, AutoFillType::PHONE_CITY_CODE }, | 
| +  // PHONE_FAX_COUNTRY_CODE | 
| +  { AutoFillType::PHONE_FAX, AutoFillType::PHONE_COUNTRY_CODE }, | 
| +  // PHONE_FAX_CITY_AND_NUMBER | 
| +  { AutoFillType::PHONE_FAX, AutoFillType::PHONE_CITY_AND_NUMBER }, | 
| +  // PHONE_FAX_WHOLE_NUMBER | 
| +  { AutoFillType::PHONE_FAX, AutoFillType::PHONE_WHOLE_NUMBER }, | 
| + | 
| +  // Cell phone numbers (values [25, 29]) are deprecated. | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| + | 
| +  // ADDRESS_HOME_LINE1 | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_LINE1 }, | 
| +  // ADDRESS_HOME_LINE2 | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_LINE2 }, | 
| +  // ADDRESS_HOME_APT_NUM | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_APT_NUM }, | 
| +  // ADDRESS_HOME_CITY | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_CITY }, | 
| +  // ADDRESS_HOME_STATE | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_STATE }, | 
| +  // ADDRESS_HOME_ZIP | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_ZIP }, | 
| +  // ADDRESS_HOME_COUNTRY | 
| +  { AutoFillType::ADDRESS_HOME, AutoFillType::ADDRESS_COUNTRY }, | 
| + | 
| +  // ADDRESS_BILLING_LINE1 | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_LINE1 }, | 
| +  // ADDRESS_BILLING_LINE2 | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_LINE2 }, | 
| +  // ADDRESS_BILLING_APT_NUM | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_APT_NUM }, | 
| +  // ADDRESS_BILLING_CITY | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_CITY }, | 
| +  // ADDRESS_BILLING_STATE | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_STATE }, | 
| +  // ADDRESS_BILLING_ZIP | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_ZIP }, | 
| +  // ADDRESS_BILLING_COUNTRY | 
| +  { AutoFillType::ADDRESS_BILLING, AutoFillType::ADDRESS_COUNTRY }, | 
| + | 
| +  // ADDRESS_SHIPPING values [44,50] are deprecated. | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| +  kUnknownAutoFillTypeDefinition, | 
| + | 
| +  // CREDIT_CARD_NAME | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_NUMBER | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_EXP_MONTH | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_EXP_2_DIGIT_YEAR | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_EXP_4_DIGIT_YEAR | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_TYPE | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| +  // CREDIT_CARD_VERIFICATION_CODE | 
| +  { AutoFillType::CREDIT_CARD, AutoFillType::NO_SUBGROUP }, | 
| + | 
| +  // COMPANY_NAME | 
| +  { AutoFillType::CONTACT_INFO, AutoFillType::NO_SUBGROUP }, | 
| +}; | 
|  | 
| -AutoFillType::AutoFillType(AutoFillTypeDefinition* definition) | 
| -    : autofill_type_definition_(definition) { | 
| -  DCHECK(definition != NULL); | 
| -} | 
| +}  // namespace | 
|  | 
| AutoFillType::AutoFillType(AutoFillFieldType field_type) { | 
| -  StaticInitialize(); | 
| -  DCHECK(initialized_); | 
| - | 
| -  if (field_type < 0 || field_type > MAX_VALID_FIELD_TYPE || | 
| -      types_[field_type].autofill_type_definition_ == NULL) { | 
| -    field_type = UNKNOWN_TYPE; | 
| -  } | 
| +  if ((field_type < NO_SERVER_DATA || field_type >= MAX_VALID_FIELD_TYPE) || | 
| +      (field_type >= 15 && field_type <= 19) || | 
| +      (field_type >= 25 && field_type <= 29) || | 
| +      (field_type >= 44 && field_type <= 50)) | 
| +    field_type_ = UNKNOWN_TYPE; | 
| +  else | 
| +    field_type_ = field_type; | 
| +} | 
|  | 
| -  autofill_type_definition_ = types_[field_type].autofill_type_definition_; | 
| +AutoFillType::AutoFillType(const AutoFillType& autofill_type) { | 
| +  *this = autofill_type; | 
| } | 
|  | 
| -// TODO(jhawkins): refactor this class to not require static initialization. | 
| -void AutoFillType::StaticInitialize() { | 
| -  // Can be called more than once (in unit tests for example). | 
| -  if (initialized_) | 
| -    return; | 
| +AutoFillType& AutoFillType::operator=(const AutoFillType& autofill_type) { | 
| +  if (this != &autofill_type) | 
| +    this->field_type_ = autofill_type.field_type_; | 
| +  return *this; | 
| +} | 
|  | 
| -  initialized_ = true; | 
| +AutoFillFieldType AutoFillType::field_type() const { | 
| +  return field_type_; | 
| +} | 
|  | 
| -  InitializeFieldTypeMap(); | 
| +FieldTypeGroup AutoFillType::group() const { | 
| +  return kAutoFillTypeDefinitions[field_type_].group; | 
| } | 
|  | 
| -void AutoFillType::InitializeFieldTypeMap() { | 
| -  for (size_t i = 0; i < arraysize(kAutoFillTypeDefinitions); ++i) { | 
| -    AutoFillType type(&kAutoFillTypeDefinitions[i]); | 
| -    types_[type.field_type()] = type; | 
| -  } | 
| +FieldTypeSubGroup AutoFillType::subgroup() const { | 
| +  return kAutoFillTypeDefinitions[field_type_].subgroup; | 
| } | 
|  |