Index: components/autofill/browser/phone_number_i18n.cc |
diff --git a/components/autofill/browser/phone_number_i18n.cc b/components/autofill/browser/phone_number_i18n.cc |
deleted file mode 100644 |
index d8ad08eb0e0fc5dc7b2fee1e6470105a7f0289de..0000000000000000000000000000000000000000 |
--- a/components/autofill/browser/phone_number_i18n.cc |
+++ /dev/null |
@@ -1,299 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/autofill/browser/phone_number_i18n.h" |
- |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "components/autofill/browser/autofill_country.h" |
-#include "third_party/libphonenumber/src/phonenumber_api.h" |
- |
-using i18n::phonenumbers::PhoneNumber; |
-using i18n::phonenumbers::PhoneNumberUtil; |
- |
-namespace autofill { |
- |
-namespace { |
- |
-std::string SanitizeRegion(const std::string& region, |
- const std::string& app_locale) { |
- if (region.length() == 2) |
- return region; |
- |
- return AutofillCountry::CountryCodeForLocale(app_locale); |
-} |
- |
-// Returns true if |phone_number| is valid. |
-bool IsValidPhoneNumber(const PhoneNumber& phone_number) { |
- PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); |
- if (!phone_util->IsPossibleNumber(phone_number)) |
- return false; |
- |
- // Verify that the number has a valid area code (that in some cases could be |
- // empty) for the parsed country code. Also verify that this is a valid |
- // number (for example, in the US 1234567 is not valid, because numbers do not |
- // start with 1). |
- if (!phone_util->IsValidNumber(phone_number)) |
- return false; |
- |
- return true; |
-} |
- |
-// Formats the given |number| as a human-readable string, and writes the result |
-// into |formatted_number|. Also, normalizes the formatted number, and writes |
-// that result into |normalized_number|. This function should only be called |
-// with numbers already known to be valid, i.e. validation should be done prior |
-// to calling this function. Note that the |country_code|, which determines |
-// whether to format in the national or in the international format, is passed |
-// in explicitly, as |number| might have an implicit country code set, even |
-// though the original input lacked a country code. |
-void FormatValidatedNumber(const PhoneNumber& number, |
- const base::string16& country_code, |
- base::string16* formatted_number, |
- base::string16* normalized_number) { |
- PhoneNumberUtil::PhoneNumberFormat format = |
- country_code.empty() ? |
- PhoneNumberUtil::NATIONAL : |
- PhoneNumberUtil::INTERNATIONAL; |
- |
- PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); |
- std::string processed_number; |
- phone_util->Format(number, format, &processed_number); |
- |
- if (formatted_number) |
- *formatted_number = UTF8ToUTF16(processed_number); |
- |
- if (normalized_number) { |
- phone_util->NormalizeDigitsOnly(&processed_number); |
- *normalized_number = UTF8ToUTF16(processed_number); |
- } |
-} |
- |
-} // namespace |
- |
-namespace i18n { |
- |
-// Parses the number stored in |value| as it should be interpreted in the given |
-// |region|, and stores the results into the remaining arguments. The |region| |
-// should be sanitized prior to calling this function. |
-bool ParsePhoneNumber(const base::string16& value, |
- const std::string& region, |
- base::string16* country_code, |
- base::string16* city_code, |
- base::string16* number, |
- PhoneNumber* i18n_number) { |
- country_code->clear(); |
- city_code->clear(); |
- number->clear(); |
- *i18n_number = PhoneNumber(); |
- |
- std::string number_text(UTF16ToUTF8(value)); |
- |
- // Parse phone number based on the region. |
- PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); |
- |
- // The |region| should already be sanitized. |
- DCHECK_EQ(2U, region.size()); |
- if (phone_util->Parse(number_text, region.c_str(), i18n_number) != |
- PhoneNumberUtil::NO_PARSING_ERROR) { |
- return false; |
- } |
- |
- if (!IsValidPhoneNumber(*i18n_number)) |
- return false; |
- |
- std::string national_significant_number; |
- phone_util->GetNationalSignificantNumber(*i18n_number, |
- &national_significant_number); |
- |
- int area_length = phone_util->GetLengthOfGeographicalAreaCode(*i18n_number); |
- int destination_length = |
- phone_util->GetLengthOfNationalDestinationCode(*i18n_number); |
- // Some phones have a destination code in lieu of area code: mobile operators |
- // in Europe, toll and toll-free numbers in USA, etc. From our point of view |
- // these two types of codes are the same. |
- if (destination_length > area_length) |
- area_length = destination_length; |
- |
- std::string area_code; |
- std::string subscriber_number; |
- if (area_length > 0) { |
- area_code = national_significant_number.substr(0, area_length); |
- subscriber_number = national_significant_number.substr(area_length); |
- } else { |
- subscriber_number = national_significant_number; |
- } |
- *number = UTF8ToUTF16(subscriber_number); |
- *city_code = UTF8ToUTF16(area_code); |
- *country_code = base::string16(); |
- |
- phone_util->NormalizeDigitsOnly(&number_text); |
- base::string16 normalized_number(UTF8ToUTF16(number_text)); |
- |
- // Check if parsed number has a country code that was not inferred from the |
- // region. |
- if (i18n_number->has_country_code()) { |
- *country_code = UTF8ToUTF16( |
- base::StringPrintf("%d", i18n_number->country_code())); |
- if (normalized_number.length() <= national_significant_number.length() && |
- !StartsWith(normalized_number, *country_code, |
- true /* case_sensitive */)) { |
- country_code->clear(); |
- } |
- } |
- |
- return true; |
-} |
- |
-base::string16 NormalizePhoneNumber(const base::string16& value, |
- const std::string& region) { |
- DCHECK_EQ(2u, region.size()); |
- base::string16 country_code; |
- base::string16 unused_city_code; |
- base::string16 unused_number; |
- PhoneNumber phone_number; |
- if (!ParsePhoneNumber(value, region, &country_code, &unused_city_code, |
- &unused_number, &phone_number)) { |
- return base::string16(); // Parsing failed - do not store phone. |
- } |
- |
- base::string16 normalized_number; |
- FormatValidatedNumber(phone_number, country_code, NULL, &normalized_number); |
- return normalized_number; |
-} |
- |
-bool ConstructPhoneNumber(const base::string16& country_code, |
- const base::string16& city_code, |
- const base::string16& number, |
- const std::string& region, |
- base::string16* whole_number) { |
- DCHECK_EQ(2u, region.size()); |
- whole_number->clear(); |
- |
- base::string16 unused_country_code; |
- base::string16 unused_city_code; |
- base::string16 unused_number; |
- PhoneNumber phone_number; |
- if (!ParsePhoneNumber(country_code + city_code + number, region, |
- &unused_country_code, &unused_city_code, &unused_number, |
- &phone_number)) { |
- return false; |
- } |
- |
- FormatValidatedNumber(phone_number, country_code, whole_number, NULL); |
- return true; |
-} |
- |
-bool PhoneNumbersMatch(const base::string16& number_a, |
- const base::string16& number_b, |
- const std::string& raw_region, |
- const std::string& app_locale) { |
- // Sanitize the provided |raw_region| before trying to use it for parsing. |
- const std::string region = SanitizeRegion(raw_region, app_locale); |
- |
- PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance(); |
- |
- // Parse phone numbers based on the region |
- PhoneNumber i18n_number1; |
- if (phone_util->Parse(UTF16ToUTF8(number_a), region.c_str(), &i18n_number1) != |
- PhoneNumberUtil::NO_PARSING_ERROR) { |
- return false; |
- } |
- |
- PhoneNumber i18n_number2; |
- if (phone_util->Parse(UTF16ToUTF8(number_b), region.c_str(), &i18n_number2) != |
- PhoneNumberUtil::NO_PARSING_ERROR) { |
- return false; |
- } |
- |
- switch (phone_util->IsNumberMatch(i18n_number1, i18n_number2)) { |
- case PhoneNumberUtil::INVALID_NUMBER: |
- case PhoneNumberUtil::NO_MATCH: |
- return false; |
- case PhoneNumberUtil::SHORT_NSN_MATCH: |
- return false; |
- case PhoneNumberUtil::NSN_MATCH: |
- case PhoneNumberUtil::EXACT_MATCH: |
- return true; |
- } |
- |
- NOTREACHED(); |
- return false; |
-} |
- |
-PhoneObject::PhoneObject(const base::string16& number, |
- const std::string& region) |
- : region_(region) { |
- DCHECK_EQ(2u, region.size()); |
- // TODO(isherman): Autofill profiles should always have a |region| set, but in |
- // some cases it should be marked as implicit. Otherwise, phone numbers |
- // might behave differently when they are synced across computers: |
- // [ http://crbug.com/100845 ]. Once the bug is fixed, add a DCHECK here to |
- // verify. |
- |
- scoped_ptr<PhoneNumber> i18n_number(new PhoneNumber); |
- if (ParsePhoneNumber(number, region_, &country_code_, &city_code_, &number_, |
- i18n_number.get())) { |
- // The phone number was successfully parsed, so store the parsed version. |
- // The formatted and normalized versions will be set on the first call to |
- // the coresponding methods. |
- i18n_number_.reset(i18n_number.release()); |
- } else { |
- // Parsing failed. Store passed phone "as is" into |whole_number_|. |
- whole_number_ = number; |
- } |
-} |
- |
-PhoneObject::PhoneObject(const PhoneObject& other) { *this = other; } |
- |
-PhoneObject::PhoneObject() {} |
- |
-PhoneObject::~PhoneObject() { |
-} |
- |
-base::string16 PhoneObject::GetFormattedNumber() const { |
- if (i18n_number_ && formatted_number_.empty()) { |
- FormatValidatedNumber(*i18n_number_, country_code_, &formatted_number_, |
- &whole_number_); |
- } |
- |
- return formatted_number_; |
-} |
- |
-base::string16 PhoneObject::GetWholeNumber() const { |
- if (i18n_number_ && whole_number_.empty()) { |
- FormatValidatedNumber(*i18n_number_, country_code_, &formatted_number_, |
- &whole_number_); |
- } |
- |
- return whole_number_; |
-} |
- |
-PhoneObject& PhoneObject::operator=(const PhoneObject& other) { |
- if (this == &other) |
- return *this; |
- |
- region_ = other.region_; |
- |
- if (other.i18n_number_.get()) |
- i18n_number_.reset(new PhoneNumber(*other.i18n_number_)); |
- else |
- i18n_number_.reset(); |
- |
- country_code_ = other.country_code_; |
- city_code_ = other.city_code_; |
- number_ = other.number_; |
- |
- formatted_number_ = other.formatted_number_; |
- whole_number_ = other.whole_number_; |
- |
- return *this; |
-} |
- |
-} // namespace i18n |
-} // namespace autofill |