| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/core/browser/address.h" | 5 #include "components/autofill/core/browser/address.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/strings/string_split.h" |
| 11 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "components/autofill/core/browser/autofill_country.h" | 14 #include "components/autofill/core/browser/autofill_country.h" |
| 14 #include "components/autofill/core/browser/autofill_field.h" | 15 #include "components/autofill/core/browser/autofill_field.h" |
| 15 #include "components/autofill/core/browser/autofill_type.h" | 16 #include "components/autofill/core/browser/autofill_type.h" |
| 16 | 17 |
| 17 namespace autofill { | 18 namespace autofill { |
| 18 | 19 |
| 19 Address::Address() {} | 20 Address::Address() {} |
| 20 | 21 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 51 | 52 |
| 52 case ADDRESS_HOME_STATE: | 53 case ADDRESS_HOME_STATE: |
| 53 return state_; | 54 return state_; |
| 54 | 55 |
| 55 case ADDRESS_HOME_ZIP: | 56 case ADDRESS_HOME_ZIP: |
| 56 return zip_code_; | 57 return zip_code_; |
| 57 | 58 |
| 58 case ADDRESS_HOME_COUNTRY: | 59 case ADDRESS_HOME_COUNTRY: |
| 59 return ASCIIToUTF16(country_code_); | 60 return ASCIIToUTF16(country_code_); |
| 60 | 61 |
| 62 case ADDRESS_HOME_STREET_ADDRESS: { |
| 63 base::string16 address = line1_; |
| 64 if (!line2_.empty()) |
| 65 address += ASCIIToUTF16("\n") + line2_; |
| 66 return address; |
| 67 } |
| 68 |
| 69 // TODO(isherman): Add support for these field types in support of i18n. |
| 70 case ADDRESS_HOME_SORTING_CODE: |
| 71 case ADDRESS_HOME_DEPENDENT_LOCALITY: |
| 72 return base::string16(); |
| 73 |
| 61 default: | 74 default: |
| 75 NOTREACHED(); |
| 62 return base::string16(); | 76 return base::string16(); |
| 63 } | 77 } |
| 64 } | 78 } |
| 65 | 79 |
| 66 void Address::SetRawInfo(ServerFieldType type, const base::string16& value) { | 80 void Address::SetRawInfo(ServerFieldType type, const base::string16& value) { |
| 67 DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group()); | 81 DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group()); |
| 68 switch (type) { | 82 switch (type) { |
| 69 case ADDRESS_HOME_LINE1: | 83 case ADDRESS_HOME_LINE1: |
| 70 line1_ = value; | 84 line1_ = value; |
| 71 break; | 85 break; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 85 case ADDRESS_HOME_COUNTRY: | 99 case ADDRESS_HOME_COUNTRY: |
| 86 DCHECK(value.empty() || | 100 DCHECK(value.empty() || |
| 87 (value.length() == 2u && IsStringASCII(value))); | 101 (value.length() == 2u && IsStringASCII(value))); |
| 88 country_code_ = UTF16ToASCII(value); | 102 country_code_ = UTF16ToASCII(value); |
| 89 break; | 103 break; |
| 90 | 104 |
| 91 case ADDRESS_HOME_ZIP: | 105 case ADDRESS_HOME_ZIP: |
| 92 zip_code_ = value; | 106 zip_code_ = value; |
| 93 break; | 107 break; |
| 94 | 108 |
| 109 case ADDRESS_HOME_STREET_ADDRESS: { |
| 110 // Clear any stale values, which might or might not get overwritten below. |
| 111 line1_.clear(); |
| 112 line2_.clear(); |
| 113 |
| 114 std::vector<base::string16> lines; |
| 115 base::SplitString(value, char16('\n'), &lines); |
| 116 if (lines.size() > 0) |
| 117 line1_ = lines[0]; |
| 118 if (lines.size() > 1) |
| 119 line2_ = lines[1]; |
| 120 |
| 121 // TODO(isherman): Add support for additional address lines. |
| 122 break; |
| 123 } |
| 124 |
| 125 // TODO(isherman): Add support for these field types in support of i18n. |
| 126 case ADDRESS_HOME_SORTING_CODE: |
| 127 case ADDRESS_HOME_DEPENDENT_LOCALITY: |
| 128 break; |
| 129 |
| 95 default: | 130 default: |
| 96 NOTREACHED(); | 131 NOTREACHED(); |
| 97 } | 132 } |
| 98 } | 133 } |
| 99 | 134 |
| 100 base::string16 Address::GetInfo(const AutofillType& type, | 135 base::string16 Address::GetInfo(const AutofillType& type, |
| 101 const std::string& app_locale) const { | 136 const std::string& app_locale) const { |
| 102 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { | 137 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) |
| 103 return ASCIIToUTF16(country_code_); | 138 return ASCIIToUTF16(country_code_); |
| 104 } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) { | 139 |
| 140 ServerFieldType storable_type = type.GetStorableType(); |
| 141 if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty()) |
| 142 return AutofillCountry(country_code_, app_locale).name(); |
| 143 |
| 144 if (storable_type == ADDRESS_HOME_STREET_ADDRESS) { |
| 145 // TODO(isherman): Remove this special-case. |
| 105 base::string16 address = line1_; | 146 base::string16 address = line1_; |
| 106 if (!line2_.empty()) | 147 if (!line2_.empty()) |
| 107 address += ASCIIToUTF16(", ") + line2_; | 148 address += ASCIIToUTF16(", ") + line2_; |
| 108 return address; | 149 return address; |
| 109 } | 150 } |
| 110 | 151 |
| 111 ServerFieldType storable_type = type.GetStorableType(); | |
| 112 if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty()) | |
| 113 return AutofillCountry(country_code_, app_locale).name(); | |
| 114 | |
| 115 return GetRawInfo(storable_type); | 152 return GetRawInfo(storable_type); |
| 116 } | 153 } |
| 117 | 154 |
| 118 bool Address::SetInfo(const AutofillType& type, | 155 bool Address::SetInfo(const AutofillType& type, |
| 119 const base::string16& value, | 156 const base::string16& value, |
| 120 const std::string& app_locale) { | 157 const std::string& app_locale) { |
| 121 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { | 158 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { |
| 122 if (!value.empty() && (value.size() != 2u || !IsStringASCII(value))) { | 159 if (!value.empty() && (value.size() != 2u || !IsStringASCII(value))) { |
| 123 country_code_ = std::string(); | 160 country_code_ = std::string(); |
| 124 return false; | 161 return false; |
| 125 } | 162 } |
| 126 | 163 |
| 127 country_code_ = StringToUpperASCII(UTF16ToASCII(value)); | 164 country_code_ = StringToUpperASCII(UTF16ToASCII(value)); |
| 128 return true; | 165 return true; |
| 129 } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) { | |
| 130 // Don't attempt to parse the address into lines, since this is potentially | |
| 131 // a user-entered address in the user's own format, so the code would have | |
| 132 // to rely on iffy heuristics at best. Instead, just give up when importing | |
| 133 // addresses like this. | |
| 134 line1_ = line2_ = base::string16(); | |
| 135 return false; | |
| 136 } | 166 } |
| 137 | 167 |
| 138 ServerFieldType storable_type = type.GetStorableType(); | 168 ServerFieldType storable_type = type.GetStorableType(); |
| 139 if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) { | 169 if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) { |
| 140 country_code_ = AutofillCountry::GetCountryCode(value, app_locale); | 170 country_code_ = AutofillCountry::GetCountryCode(value, app_locale); |
| 141 return !country_code_.empty(); | 171 return !country_code_.empty(); |
| 142 } | 172 } |
| 143 | 173 |
| 174 // If the address doesn't have any newlines, don't attempt to parse it into |
| 175 // lines, since this is potentially a user-entered address in the user's own |
| 176 // format, so the code would have to rely on iffy heuristics at best. |
| 177 // Instead, just give up when importing addresses like this. |
| 178 if (storable_type == ADDRESS_HOME_STREET_ADDRESS && !value.empty() && |
| 179 value.find(char16('\n')) == base::string16::npos) { |
| 180 line1_ = line2_ = base::string16(); |
| 181 return false; |
| 182 } |
| 183 |
| 144 SetRawInfo(storable_type, value); | 184 SetRawInfo(storable_type, value); |
| 145 return true; | 185 return true; |
| 146 } | 186 } |
| 147 | 187 |
| 148 void Address::GetMatchingTypes(const base::string16& text, | 188 void Address::GetMatchingTypes(const base::string16& text, |
| 149 const std::string& app_locale, | 189 const std::string& app_locale, |
| 150 ServerFieldTypeSet* matching_types) const { | 190 ServerFieldTypeSet* matching_types) const { |
| 151 FormGroup::GetMatchingTypes(text, app_locale, matching_types); | 191 FormGroup::GetMatchingTypes(text, app_locale, matching_types); |
| 152 | 192 |
| 153 // Check to see if the |text| canonicalized as a country name is a match. | 193 // Check to see if the |text| canonicalized as a country name is a match. |
| 154 std::string country_code = AutofillCountry::GetCountryCode(text, app_locale); | 194 std::string country_code = AutofillCountry::GetCountryCode(text, app_locale); |
| 155 if (!country_code.empty() && country_code_ == country_code) | 195 if (!country_code.empty() && country_code_ == country_code) |
| 156 matching_types->insert(ADDRESS_HOME_COUNTRY); | 196 matching_types->insert(ADDRESS_HOME_COUNTRY); |
| 157 } | 197 } |
| 158 | 198 |
| 159 void Address::GetSupportedTypes(ServerFieldTypeSet* supported_types) const { | 199 void Address::GetSupportedTypes(ServerFieldTypeSet* supported_types) const { |
| 160 supported_types->insert(ADDRESS_HOME_LINE1); | 200 supported_types->insert(ADDRESS_HOME_LINE1); |
| 161 supported_types->insert(ADDRESS_HOME_LINE2); | 201 supported_types->insert(ADDRESS_HOME_LINE2); |
| 162 supported_types->insert(ADDRESS_HOME_CITY); | 202 supported_types->insert(ADDRESS_HOME_CITY); |
| 163 supported_types->insert(ADDRESS_HOME_STATE); | 203 supported_types->insert(ADDRESS_HOME_STATE); |
| 164 supported_types->insert(ADDRESS_HOME_ZIP); | 204 supported_types->insert(ADDRESS_HOME_ZIP); |
| 165 supported_types->insert(ADDRESS_HOME_COUNTRY); | 205 supported_types->insert(ADDRESS_HOME_COUNTRY); |
| 166 } | 206 } |
| 167 | 207 |
| 168 } // namespace autofill | 208 } // namespace autofill |
| OLD | NEW |