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..124f564f9d144fa6a9c13435ac00735b484d94ea 100644 |
--- a/components/autofill/core/browser/phone_number_i18n.cc |
+++ b/components/autofill/core/browser/phone_number_i18n.cc |
@@ -63,13 +63,48 @@ 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 national format. |
+ 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) { |
+ // Drop the leading '+' for US numbers as some US sites can't handle |
+ // the "+" and in the US dialing "+1..." is the same as dialing "1...". |
+ if (processed_number[0] == '+' && region_code == "US") { |
+ *formatted_number = base::UTF8ToUTF16(processed_number.substr(1, |
+ processed_number.length())); |
Ilya Sherman
2014/07/11 19:15:46
nit: Please run git cl format to fix up the format
|
+ } else { |
+ *formatted_number = base::UTF8ToUTF16(processed_number); |
+ } |
+ } |
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 +135,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; |
} |