Index: components/payments/address_normalizer.cc |
diff --git a/components/payments/address_normalizer.cc b/components/payments/address_normalizer.cc |
index f8dd35a3082d7eafb1967ad3b7669c237b87b057..aa5accf6dd0e6fb0aabdbd766a5eb65e1430ca1f 100644 |
--- a/components/payments/address_normalizer.cc |
+++ b/components/payments/address_normalizer.cc |
@@ -7,7 +7,9 @@ |
#include <memory> |
#include <utility> |
+#include "base/cancelable_callback.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/threading/sequenced_task_runner_handle.h" |
#include "components/autofill/core/browser/address_i18n.h" |
#include "third_party/libaddressinput/chromium/chrome_address_validator.h" |
#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" |
@@ -28,21 +30,38 @@ class AddressNormalizationRequest : public AddressNormalizer::Request { |
// The |delegate| and |address_validator| need to outlive this Request. |
AddressNormalizationRequest(const AutofillProfile& profile, |
const std::string& region_code, |
+ int timeout_seconds, |
AddressNormalizer::Delegate* delegate, |
autofill::AddressValidator* address_validator) |
: profile_(profile), |
region_code_(region_code), |
delegate_(delegate), |
- address_validator_(address_validator) {} |
+ address_validator_(address_validator), |
+ has_responded_(false), |
+ on_timeout_( |
+ base::Bind(&::payments::AddressNormalizationRequest::OnRulesLoaded, |
+ base::Unretained(this), |
+ false)) { |
+ base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, on_timeout_.callback(), |
+ base::TimeDelta::FromSeconds(timeout_seconds)); |
+ } |
~AddressNormalizationRequest() override {} |
void OnRulesLoaded(bool success) override { |
+ on_timeout_.Cancel(); |
+ |
+ if (has_responded_) |
+ return; |
+ has_responded_ = true; |
please use gerrit instead
2017/02/21 17:15:12
This pattern is used to guard against OnRulesLoade
sebsg
2017/02/21 18:30:59
With the current code, if the timeout happens firs
please use gerrit instead
2017/02/21 19:56:16
Is it possible for rules to never load? If the rul
sebsg
2017/02/21 22:17:07
As discussed offline, The rule loader will always
|
+ |
if (!success) { |
delegate_->OnCouldNotNormalize(profile_); |
return; |
} |
+ // The rules should be loaded. |
DCHECK(address_validator_->AreRulesLoadedForRegion(region_code_)); |
// Create the AddressData from the profile. |
@@ -70,6 +89,9 @@ class AddressNormalizationRequest : public AddressNormalizer::Request { |
AddressNormalizer::Delegate* delegate_; |
autofill::AddressValidator* address_validator_; |
+ bool has_responded_; |
+ base::CancelableCallback<void()> on_timeout_; |
+ |
DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequest); |
}; |
@@ -93,10 +115,13 @@ bool AddressNormalizer::AreRulesLoadedForRegion( |
void AddressNormalizer::StartAddressNormalization( |
const AutofillProfile& profile, |
const std::string& region_code, |
+ int timeout_seconds, |
AddressNormalizer::Delegate* requester) { |
+ DCHECK(timeout_seconds >= 0); |
+ |
std::unique_ptr<AddressNormalizationRequest> request( |
- new AddressNormalizationRequest(profile, region_code, requester, |
- &address_validator_)); |
+ new AddressNormalizationRequest(profile, region_code, timeout_seconds, |
Mathieu
2017/02/21 17:40:43
let's use base::MakeUnique instead of new
sebsg
2017/02/21 18:30:59
Done.
|
+ requester, &address_validator_)); |
// Check if the rules are already loaded. |
if (AreRulesLoadedForRegion(region_code)) { |
@@ -114,6 +139,10 @@ void AddressNormalizer::StartAddressNormalization( |
} |
it->second.push_back(std::move(request)); |
+ |
+ // Start loading the rules for that region. If the rule were already in the |
please use gerrit instead
2017/02/21 17:15:12
s/ rule / rules /
sebsg
2017/02/21 18:30:59
Done.
|
+ // process of being loaded, this call will do nothing. |
+ LoadRulesForRegion(region_code); |
} |
} |