address.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
13cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// Copyright 2013 The Chromium Authors. All rights reserved. 23cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// Use of this source code is governed by a BSD-style license that can be 33cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks// found in the LICENSE file. 43cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 53cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/address.h" 63cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 73cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include <stddef.h> 83cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 93cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/basictypes.h" 103cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/logging.h" 113cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/strings/string_util.h" 123cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "base/strings/utf_string_conversions.h" 133cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_country.h" 143cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_field.h" 153cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks#include "components/autofill/core/browser/autofill_type.h" 163cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 173cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksnamespace { 183cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 193cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksconst char16 kAddressSplitChars[] = {'-', ',', '#', '.', ' ', 0}; 203cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 213cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks} // namespace 223cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 233cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksnamespace autofill { 243cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 253cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::Address() {} 263cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 273cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::Address(const Address& address) : FormGroup() { 283cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks *this = address; 293cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks} 303cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 313cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress::~Address() {} 323cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 333cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna ZaksAddress& Address::operator=(const Address& address) { 343cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks if (this == &address) 353cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return *this; 363cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 373cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks line1_ = address.line1_; 383cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks line2_ = address.line2_; 393cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks city_ = address.city_; 403cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks state_ = address.state_; 413cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks country_code_ = address.country_code_; 423cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks zip_code_ = address.zip_code_; 433cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return *this; 443cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks} 453cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 463cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksbase::string16 Address::GetRawInfo(ServerFieldType type) const { 473cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group()); 483cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks switch (type) { 493cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_LINE1: 503cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return line1_; 513cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 523cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_LINE2: 533cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return line2_; 543cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 553cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_CITY: 563cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return city_; 573cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 583cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_STATE: 593cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return state_; 603cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 613cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_ZIP: 623cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return zip_code_; 633cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 643cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_COUNTRY: 653cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return ASCIIToUTF16(country_code_); 663cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 673cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks default: 683cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks return base::string16(); 693cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks } 703cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks} 713cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks 723cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaksvoid Address::SetRawInfo(ServerFieldType type, const base::string16& value) { 733cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group()); 743cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks switch (type) { 753cd89ad193834e766ce5dc24e260aa8615d0d5e1Anna Zaks case ADDRESS_HOME_LINE1: 76 line1_ = value; 77 break; 78 79 case ADDRESS_HOME_LINE2: 80 line2_ = value; 81 break; 82 83 case ADDRESS_HOME_CITY: 84 city_ = value; 85 break; 86 87 case ADDRESS_HOME_STATE: 88 state_ = value; 89 break; 90 91 case ADDRESS_HOME_COUNTRY: 92 DCHECK(value.empty() || 93 (value.length() == 2u && IsStringASCII(value))); 94 country_code_ = UTF16ToASCII(value); 95 break; 96 97 case ADDRESS_HOME_ZIP: 98 zip_code_ = value; 99 break; 100 101 default: 102 NOTREACHED(); 103 } 104} 105 106base::string16 Address::GetInfo(const AutofillType& type, 107 const std::string& app_locale) const { 108 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { 109 return ASCIIToUTF16(country_code_); 110 } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) { 111 base::string16 address = line1_; 112 if (!line2_.empty()) 113 address += ASCIIToUTF16(", ") + line2_; 114 return address; 115 } 116 117 ServerFieldType storable_type = type.GetStorableType(); 118 if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty()) 119 return AutofillCountry(country_code_, app_locale).name(); 120 121 return GetRawInfo(storable_type); 122} 123 124bool Address::SetInfo(const AutofillType& type, 125 const base::string16& value, 126 const std::string& app_locale) { 127 if (type.html_type() == HTML_TYPE_COUNTRY_CODE) { 128 if (!value.empty() && (value.size() != 2u || !IsStringASCII(value))) { 129 country_code_ = std::string(); 130 return false; 131 } 132 133 country_code_ = StringToUpperASCII(UTF16ToASCII(value)); 134 return true; 135 } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) { 136 // Don't attempt to parse the address into lines, since this is potentially 137 // a user-entered address in the user's own format, so the code would have 138 // to rely on iffy heuristics at best. Instead, just give up when importing 139 // addresses like this. 140 line1_ = line2_ = base::string16(); 141 return false; 142 } 143 144 ServerFieldType storable_type = type.GetStorableType(); 145 if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) { 146 country_code_ = AutofillCountry::GetCountryCode(value, app_locale); 147 return !country_code_.empty(); 148 } 149 150 SetRawInfo(storable_type, value); 151 return true; 152} 153 154void Address::GetMatchingTypes(const base::string16& text, 155 const std::string& app_locale, 156 ServerFieldTypeSet* matching_types) const { 157 FormGroup::GetMatchingTypes(text, app_locale, matching_types); 158 159 // Check to see if the |text| canonicalized as a country name is a match. 160 std::string country_code = AutofillCountry::GetCountryCode(text, app_locale); 161 if (!country_code.empty() && country_code_ == country_code) 162 matching_types->insert(ADDRESS_HOME_COUNTRY); 163} 164 165void Address::GetSupportedTypes(ServerFieldTypeSet* supported_types) const { 166 supported_types->insert(ADDRESS_HOME_LINE1); 167 supported_types->insert(ADDRESS_HOME_LINE2); 168 supported_types->insert(ADDRESS_HOME_CITY); 169 supported_types->insert(ADDRESS_HOME_STATE); 170 supported_types->insert(ADDRESS_HOME_ZIP); 171 supported_types->insert(ADDRESS_HOME_COUNTRY); 172} 173 174} // namespace autofill 175