| Index: components/autofill/core/browser/address.cc
 | 
| diff --git a/components/autofill/core/browser/address.cc b/components/autofill/core/browser/address.cc
 | 
| index 238cb248a387bccdbf8f54b4a04ad12cd1b5ac7b..43052bd2a5886de1516ea53ec8d2d1732bd31550 100644
 | 
| --- a/components/autofill/core/browser/address.cc
 | 
| +++ b/components/autofill/core/browser/address.cc
 | 
| @@ -8,6 +8,7 @@
 | 
|  
 | 
|  #include "base/basictypes.h"
 | 
|  #include "base/logging.h"
 | 
| +#include "base/strings/string_split.h"
 | 
|  #include "base/strings/string_util.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
|  #include "components/autofill/core/browser/autofill_country.h"
 | 
| @@ -58,7 +59,20 @@ base::string16 Address::GetRawInfo(ServerFieldType type) const {
 | 
|      case ADDRESS_HOME_COUNTRY:
 | 
|        return ASCIIToUTF16(country_code_);
 | 
|  
 | 
| +    case ADDRESS_HOME_STREET_ADDRESS: {
 | 
| +      base::string16 address = line1_;
 | 
| +      if (!line2_.empty())
 | 
| +        address += ASCIIToUTF16("\n") + line2_;
 | 
| +      return address;
 | 
| +    }
 | 
| +
 | 
| +    // TODO(isherman): Add support for these field types in support of i18n.
 | 
| +    case ADDRESS_HOME_SORTING_CODE:
 | 
| +    case ADDRESS_HOME_DEPENDENT_LOCALITY:
 | 
| +      return base::string16();
 | 
| +
 | 
|      default:
 | 
| +      NOTREACHED();
 | 
|        return base::string16();
 | 
|    }
 | 
|  }
 | 
| @@ -92,6 +106,27 @@ void Address::SetRawInfo(ServerFieldType type, const base::string16& value) {
 | 
|        zip_code_ = value;
 | 
|        break;
 | 
|  
 | 
| +    case ADDRESS_HOME_STREET_ADDRESS: {
 | 
| +      // Clear any stale values, which might or might not get overwritten below.
 | 
| +      line1_.clear();
 | 
| +      line2_.clear();
 | 
| +
 | 
| +      std::vector<base::string16> lines;
 | 
| +      base::SplitString(value, char16('\n'), &lines);
 | 
| +      if (lines.size() > 0)
 | 
| +        line1_ = lines[0];
 | 
| +      if (lines.size() > 1)
 | 
| +        line2_ = lines[1];
 | 
| +
 | 
| +      // TODO(isherman): Add support for additional address lines.
 | 
| +      break;
 | 
| +    }
 | 
| +
 | 
| +    // TODO(isherman): Add support for these field types in support of i18n.
 | 
| +    case ADDRESS_HOME_SORTING_CODE:
 | 
| +    case ADDRESS_HOME_DEPENDENT_LOCALITY:
 | 
| +      break;
 | 
| +
 | 
|      default:
 | 
|        NOTREACHED();
 | 
|    }
 | 
| @@ -99,19 +134,21 @@ void Address::SetRawInfo(ServerFieldType type, const base::string16& value) {
 | 
|  
 | 
|  base::string16 Address::GetInfo(const AutofillType& type,
 | 
|                                  const std::string& app_locale) const {
 | 
| -  if (type.html_type() == HTML_TYPE_COUNTRY_CODE) {
 | 
| +  if (type.html_type() == HTML_TYPE_COUNTRY_CODE)
 | 
|      return ASCIIToUTF16(country_code_);
 | 
| -  } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) {
 | 
| +
 | 
| +  ServerFieldType storable_type = type.GetStorableType();
 | 
| +  if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty())
 | 
| +    return AutofillCountry(country_code_, app_locale).name();
 | 
| +
 | 
| +  if (storable_type == ADDRESS_HOME_STREET_ADDRESS) {
 | 
| +    // TODO(isherman): Remove this special-case.
 | 
|      base::string16 address = line1_;
 | 
|      if (!line2_.empty())
 | 
|        address += ASCIIToUTF16(", ") + line2_;
 | 
|      return address;
 | 
|    }
 | 
|  
 | 
| -  ServerFieldType storable_type = type.GetStorableType();
 | 
| -  if (storable_type == ADDRESS_HOME_COUNTRY && !country_code_.empty())
 | 
| -    return AutofillCountry(country_code_, app_locale).name();
 | 
| -
 | 
|    return GetRawInfo(storable_type);
 | 
|  }
 | 
|  
 | 
| @@ -126,13 +163,6 @@ bool Address::SetInfo(const AutofillType& type,
 | 
|  
 | 
|      country_code_ = StringToUpperASCII(UTF16ToASCII(value));
 | 
|      return true;
 | 
| -  } else if (type.html_type() == HTML_TYPE_STREET_ADDRESS) {
 | 
| -    // Don't attempt to parse the address into lines, since this is potentially
 | 
| -    // a user-entered address in the user's own format, so the code would have
 | 
| -    // to rely on iffy heuristics at best.  Instead, just give up when importing
 | 
| -    // addresses like this.
 | 
| -    line1_ = line2_ = base::string16();
 | 
| -    return false;
 | 
|    }
 | 
|  
 | 
|    ServerFieldType storable_type = type.GetStorableType();
 | 
| @@ -141,6 +171,16 @@ bool Address::SetInfo(const AutofillType& type,
 | 
|      return !country_code_.empty();
 | 
|    }
 | 
|  
 | 
| +  // If the address doesn't have any newlines, don't attempt to parse it into
 | 
| +  // lines, since this is potentially a user-entered address in the user's own
 | 
| +  // format, so the code would have to rely on iffy heuristics at best.
 | 
| +  // Instead, just give up when importing addresses like this.
 | 
| +  if (storable_type == ADDRESS_HOME_STREET_ADDRESS && !value.empty() &&
 | 
| +      value.find(char16('\n')) == base::string16::npos) {
 | 
| +    line1_ = line2_ = base::string16();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
|    SetRawInfo(storable_type, value);
 | 
|    return true;
 | 
|  }
 | 
| 
 |