Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Unified Diff: components/autofill/browser/phone_number_i18n.cc

Issue 17392006: In components/autofill, move browser/ to core/browser/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to fix conflicts Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « components/autofill/browser/phone_number_i18n.h ('k') | components/autofill/browser/phone_number_i18n_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698