| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/autofill/browser/form_group.h" | 5 #include "components/autofill/browser/form_group.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "components/autofill/browser/autofill_country.h" | 14 #include "components/autofill/browser/autofill_country.h" |
| 15 #include "components/autofill/browser/state_names.h" |
| 16 #include "components/autofill/browser/validation.h" |
| 15 #include "components/autofill/common/form_field_data.h" | 17 #include "components/autofill/common/form_field_data.h" |
| 16 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
| 17 #include "ui/base/l10n/l10n_util.h" | 19 #include "ui/base/l10n/l10n_util.h" |
| 18 | 20 |
| 19 namespace autofill { | 21 namespace autofill { |
| 20 namespace { | 22 namespace { |
| 21 | 23 |
| 22 // TODO(jhawkins): Add more states/provinces. See http://crbug.com/45039. | |
| 23 | |
| 24 class State { | |
| 25 public: | |
| 26 const char* name; | |
| 27 const char* abbreviation; | |
| 28 | |
| 29 static const State all_states[]; | |
| 30 | |
| 31 static base::string16 Abbreviation(const base::string16& name); | |
| 32 static base::string16 FullName(const base::string16& abbreviation); | |
| 33 }; | |
| 34 | |
| 35 const State State::all_states[] = { | |
| 36 { "alabama", "al" }, | |
| 37 { "alaska", "ak" }, | |
| 38 { "arizona", "az" }, | |
| 39 { "arkansas", "ar" }, | |
| 40 { "california", "ca" }, | |
| 41 { "colorado", "co" }, | |
| 42 { "connecticut", "ct" }, | |
| 43 { "delaware", "de" }, | |
| 44 { "district of columbia", "dc" }, | |
| 45 { "florida", "fl" }, | |
| 46 { "georgia", "ga" }, | |
| 47 { "hawaii", "hi" }, | |
| 48 { "idaho", "id" }, | |
| 49 { "illinois", "il" }, | |
| 50 { "indiana", "in" }, | |
| 51 { "iowa", "ia" }, | |
| 52 { "kansas", "ks" }, | |
| 53 { "kentucky", "ky" }, | |
| 54 { "louisiana", "la" }, | |
| 55 { "maine", "me" }, | |
| 56 { "maryland", "md" }, | |
| 57 { "massachusetts", "ma" }, | |
| 58 { "michigan", "mi" }, | |
| 59 { "minnesota", "mv" }, | |
| 60 { "mississippi", "ms" }, | |
| 61 { "missouri", "mo" }, | |
| 62 { "montana", "mt" }, | |
| 63 { "nebraska", "ne" }, | |
| 64 { "nevada", "nv" }, | |
| 65 { "new hampshire", "nh" }, | |
| 66 { "new jersey", "nj" }, | |
| 67 { "new mexico", "nm" }, | |
| 68 { "new york", "ny" }, | |
| 69 { "north carolina", "nc" }, | |
| 70 { "north dakota", "nd" }, | |
| 71 { "ohio", "oh" }, | |
| 72 { "oklahoma", "ok" }, | |
| 73 { "oregon", "or" }, | |
| 74 { "pennsylvania", "pa" }, | |
| 75 { "puerto rico", "pr" }, | |
| 76 { "rhode island", "ri" }, | |
| 77 { "south carolina", "sc" }, | |
| 78 { "south dakota", "sd" }, | |
| 79 { "tennessee", "tn" }, | |
| 80 { "texas", "tx" }, | |
| 81 { "utah", "ut" }, | |
| 82 { "vermont", "vt" }, | |
| 83 { "virginia", "va" }, | |
| 84 { "washington", "wa" }, | |
| 85 { "west virginia", "wv" }, | |
| 86 { "wisconsin", "wi" }, | |
| 87 { "wyoming", "wy" }, | |
| 88 { NULL, NULL } | |
| 89 }; | |
| 90 | |
| 91 base::string16 State::Abbreviation(const base::string16& name) { | |
| 92 for (const State* state = all_states; state->name; ++state) { | |
| 93 if (LowerCaseEqualsASCII(name, state->name)) | |
| 94 return ASCIIToUTF16(state->abbreviation); | |
| 95 } | |
| 96 return base::string16(); | |
| 97 } | |
| 98 | |
| 99 base::string16 State::FullName(const base::string16& abbreviation) { | |
| 100 for (const State* state = all_states; state->name; ++state) { | |
| 101 if (LowerCaseEqualsASCII(abbreviation, state->abbreviation)) | |
| 102 return ASCIIToUTF16(state->name); | |
| 103 } | |
| 104 return base::string16(); | |
| 105 } | |
| 106 | |
| 107 const char* const kMonthsAbbreviated[] = { | 24 const char* const kMonthsAbbreviated[] = { |
| 108 NULL, // Padding so index 1 = month 1 = January. | 25 NULL, // Padding so index 1 = month 1 = January. |
| 109 "Jan", "Feb", "Mar", "Apr", "May", "Jun", | 26 "Jan", "Feb", "Mar", "Apr", "May", "Jun", |
| 110 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", | 27 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", |
| 111 }; | 28 }; |
| 112 | 29 |
| 113 const char* const kMonthsFull[] = { | 30 const char* const kMonthsFull[] = { |
| 114 NULL, // Padding so index 1 = month 1 = January. | 31 NULL, // Padding so index 1 = month 1 = January. |
| 115 "January", "February", "March", "April", "May", "June", | 32 "January", "February", "March", "April", "May", "June", |
| 116 "July", "August", "September", "October", "November", "December", | 33 "July", "August", "September", "October", "November", "December", |
| (...skipping 17 matching lines...) Expand all Loading... |
| 134 field->value = field->option_values[i]; | 51 field->value = field->option_values[i]; |
| 135 return true; | 52 return true; |
| 136 } | 53 } |
| 137 } | 54 } |
| 138 | 55 |
| 139 return false; | 56 return false; |
| 140 } | 57 } |
| 141 | 58 |
| 142 bool FillStateSelectControl(const base::string16& value, | 59 bool FillStateSelectControl(const base::string16& value, |
| 143 FormFieldData* field) { | 60 FormFieldData* field) { |
| 144 base::string16 abbrev, full; | 61 base::string16 abbreviation = value; |
| 145 if (value.size() < 4U) { | 62 base::string16 full = state_names::GetNameForAbbreviation(value); |
| 146 abbrev = value; | 63 if (full.empty()) { |
| 147 full = State::FullName(value); | 64 abbreviation = state_names::GetAbbreviationForName(value); |
| 148 } else { | |
| 149 abbrev = State::Abbreviation(value); | |
| 150 full = value; | 65 full = value; |
| 151 } | 66 } |
| 152 | 67 |
| 153 // Try the abbreviation name first. | 68 // Try the abbreviation first. |
| 154 if (!abbrev.empty() && SetSelectControlValue(abbrev, field)) | 69 if (!abbreviation.empty() && SetSelectControlValue(abbreviation, field)) |
| 155 return true; | 70 return true; |
| 156 | 71 |
| 157 if (full.empty()) | 72 return !full.empty() && SetSelectControlValue(full, field); |
| 158 return false; | |
| 159 | |
| 160 return SetSelectControlValue(full, field); | |
| 161 } | 73 } |
| 162 | 74 |
| 163 bool FillExpirationMonthSelectControl(const base::string16& value, | 75 bool FillExpirationMonthSelectControl(const base::string16& value, |
| 164 FormFieldData* field) { | 76 FormFieldData* field) { |
| 165 int index = 0; | 77 int index = 0; |
| 166 if (!base::StringToInt(value, &index) || | 78 if (!base::StringToInt(value, &index) || |
| 167 index <= 0 || | 79 index <= 0 || |
| 168 static_cast<size_t>(index) >= arraysize(kMonthsFull)) | 80 static_cast<size_t>(index) >= arraysize(kMonthsFull)) |
| 169 return false; | 81 return false; |
| 170 | 82 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 } else if (type == CREDIT_CARD_TYPE) { | 224 } else if (type == CREDIT_CARD_TYPE) { |
| 313 FillCreditCardTypeSelectControl(field_text, field); | 225 FillCreditCardTypeSelectControl(field_text, field); |
| 314 } | 226 } |
| 315 } | 227 } |
| 316 | 228 |
| 317 bool FormGroup::FillCountrySelectControl(const std::string& app_locale, | 229 bool FormGroup::FillCountrySelectControl(const std::string& app_locale, |
| 318 FormFieldData* field_data) const { | 230 FormFieldData* field_data) const { |
| 319 return false; | 231 return false; |
| 320 } | 232 } |
| 321 | 233 |
| 322 // static | |
| 323 bool FormGroup::IsValidState(const base::string16& value) { | |
| 324 return !State::Abbreviation(value).empty() || !State::FullName(value).empty(); | |
| 325 } | |
| 326 | |
| 327 } // namespace autofill | 234 } // namespace autofill |
| OLD | NEW |