Chromium Code Reviews| Index: components/autofill/core/browser/phone_number_i18n.cc |
| diff --git a/components/autofill/core/browser/phone_number_i18n.cc b/components/autofill/core/browser/phone_number_i18n.cc |
| index 72b2e1f481849956d8091f5bc9adb460ff4ddc0c..7f092a23fd0275780ec062cbea039416f197f1ba 100644 |
| --- a/components/autofill/core/browser/phone_number_i18n.cc |
| +++ b/components/autofill/core/browser/phone_number_i18n.cc |
| @@ -63,13 +63,44 @@ void FormatValidatedNumber(const PhoneNumber& number, |
| PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); |
| std::string processed_number; |
| - phone_util->Format(number, format, &processed_number); |
| - if (formatted_number) |
| - *formatted_number = base::UTF8ToUTF16(processed_number); |
| + std::string region_code; |
| + phone_util->GetRegionCodeForNumber(number, ®ion_code); |
| + |
| + // Formats a phone number using the original phone number format that the |
| + // number is parsed from. |
| + // This applies to the following cases: |
| + // The phone number is an international phone number and has a leading '+' |
| + // sign. |
| + // The number is from the default country. This happens mostly for numbers |
| + // written in the nation format. |
|
Ilya Sherman
2014/07/11 03:43:40
nit: "nation" -> "national"
|
| + if (number.has_country_code_source() && |
| + ((number.country_code_source() == |
| + PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN && |
| + format == PhoneNumberUtil::INTERNATIONAL) || |
| + number.country_code_source() == |
| + PhoneNumber::FROM_DEFAULT_COUNTRY)) { |
| + phone_util->FormatInOriginalFormat(number, region_code, &processed_number); |
| + } else { |
| + phone_util->Format(number, format, &processed_number); |
| + } |
| + |
| + if (formatted_number) { |
| + *formatted_number = (processed_number[0] == '+' && region_code == "US" ? |
|
Ilya Sherman
2014/07/11 03:43:40
Please add comments to explain why the US is speci
|
| + base::UTF8ToUTF16(processed_number.substr(1, |
| + processed_number.length())) : |
| + base::UTF8ToUTF16(processed_number)); |
|
Ilya Sherman
2014/07/11 03:43:40
Hmm, this ternary expression is a bit hard to read
|
| + } |
| if (normalized_number) { |
| - phone_util->NormalizeDigitsOnly(&processed_number); |
| + // Keep the leading '+' while normalising numbers, excluding US numbers. |
| + if (processed_number[0] == '+' && region_code != "US") { |
| + processed_number = processed_number.substr(1, processed_number.length()); |
| + phone_util->NormalizeDigitsOnly(&processed_number); |
| + processed_number.insert(processed_number.begin(), '+'); |
| + } else { |
| + phone_util->NormalizeDigitsOnly(&processed_number); |
| + } |
| *normalized_number = base::UTF8ToUTF16(processed_number); |
| } |
| } |
| @@ -100,7 +131,9 @@ bool ParsePhoneNumber(const base::string16& value, |
| // The |default_region| should already be sanitized. |
| DCHECK_EQ(2U, default_region.size()); |
| - if (phone_util->Parse(number_text, default_region, i18n_number) != |
| + if (phone_util->ParseAndKeepRawInput(number_text, |
| + default_region, |
| + i18n_number) != |
| PhoneNumberUtil::NO_PARSING_ERROR) { |
| return false; |
| } |