Index: components/payments/core/address_normalization_manager.cc |
diff --git a/components/payments/core/address_normalization_manager.cc b/components/payments/core/address_normalization_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..21475900670735c5e7c6b41044a929047932f6f9 |
--- /dev/null |
+++ b/components/payments/core/address_normalization_manager.cc |
@@ -0,0 +1,103 @@ |
+// Copyright 2017 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/payments/core/address_normalization_manager.h" |
+ |
+#include "base/memory/ptr_util.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "components/autofill/core/browser/autofill_data_util.h" |
+#include "components/autofill/core/browser/field_types.h" |
+ |
+namespace payments { |
+ |
+namespace { |
+constexpr int kAddressNormalizationTimeoutSeconds = 5; |
+} // namespace |
+ |
+AddressNormalizationManager::AddressNormalizationManager( |
+ std::unique_ptr<AddressNormalizer> address_normalizer, |
+ const std::string& default_country_code) |
+ : default_country_code_(default_country_code), |
+ address_normalizer_(std::move(address_normalizer)) { |
+ DCHECK(autofill::data_util::IsValidCountryCode(default_country_code)); |
+ DCHECK(address_normalizer_); |
+ |
+ // Start loading rules for the default country code. This happens |
+ // asynchronously, and will speed up normalization later if the rules for the |
+ // address' region have already been loaded. |
+ address_normalizer_->LoadRulesForRegion(default_country_code); |
+} |
+ |
+AddressNormalizationManager::~AddressNormalizationManager() {} |
+ |
+void AddressNormalizationManager::FinalizeWithCompletionCallback( |
+ base::OnceClosure completion_callback) { |
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
+ completion_callback_ = std::move(completion_callback); |
+ accepting_requests_ = false; |
+ MaybeRunCompletionCallback(); |
+} |
+ |
+void AddressNormalizationManager::StartNormalizingAddress( |
+ autofill::AutofillProfile* profile) { |
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
+ DCHECK(accepting_requests_) << "FinalizeWithCompletionCallback has been " |
+ "called, cannot normalize more addresses"; |
+ |
+ delegates_.push_back(base::MakeUnique<NormalizerDelegate>( |
+ this, address_normalizer_.get(), profile)); |
+} |
+ |
+void AddressNormalizationManager::MaybeRunCompletionCallback() { |
+ if (accepting_requests_ || !completion_callback_) |
+ return; |
+ |
+ for (const auto& delegate : delegates_) { |
+ if (!delegate->has_completed()) |
+ return; |
+ } |
+ |
+ // We're no longer accepting requests, and all the delegates have completed. |
+ // Now's the time to run the completion callback. |
+ std::move(completion_callback_).Run(); |
+} |
+ |
+AddressNormalizationManager::NormalizerDelegate::NormalizerDelegate( |
+ AddressNormalizationManager* owner, |
+ AddressNormalizer* address_normalizer, |
+ autofill::AutofillProfile* profile) |
+ : owner_(owner), profile_(profile) { |
+ DCHECK(owner_); |
+ DCHECK(profile_); |
+ |
+ std::string country_code = |
+ base::UTF16ToUTF8(profile_->GetRawInfo(autofill::ADDRESS_HOME_COUNTRY)); |
+ if (!autofill::data_util::IsValidCountryCode(country_code)) |
+ country_code = owner_->default_country_code_; |
+ |
+ address_normalizer->StartAddressNormalization( |
+ *profile_, country_code, kAddressNormalizationTimeoutSeconds, this); |
+} |
+ |
+void AddressNormalizationManager::NormalizerDelegate::OnAddressNormalized( |
+ const autofill::AutofillProfile& normalized_profile) { |
+ OnCompletion(normalized_profile); |
+} |
+ |
+void AddressNormalizationManager::NormalizerDelegate::OnCouldNotNormalize( |
+ const autofill::AutofillProfile& profile) { |
+ // Since the phone number is formatted in either case, this profile should |
+ // be used. |
+ OnCompletion(profile); |
+} |
+ |
+void AddressNormalizationManager::NormalizerDelegate::OnCompletion( |
+ const autofill::AutofillProfile& profile) { |
+ DCHECK(!has_completed_); |
+ has_completed_ = true; |
+ *profile_ = profile; |
+ owner_->MaybeRunCompletionCallback(); |
+} |
+ |
+} // namespace payments |