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

Side by Side Diff: components/payments/core/subkey_requester.cc

Issue 2879853003: [Payments] Code Refactoring for the Subkey Request (Closed)
Patch Set: Refactoring Created 3 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/payments/core/subkey_requester.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "base/bind.h"
11 #include "base/bind_helpers.h"
12 #include "base/cancelable_callback.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "base/threading/sequenced_task_runner_handle.h"
16 #include "base/time/time.h"
17 #include "third_party/libaddressinput/chromium/chrome_address_validator.h"
18 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h"
19 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/source.h"
20 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/storage.h"
21 namespace payments {
22
23 namespace {
24
25 using ::autofill::AutofillProfile;
sebsg 2017/05/18 17:50:51 needed?
Parastoo 2017/05/18 20:59:45 Done.
26 using ::i18n::addressinput::Source;
27 using ::i18n::addressinput::Storage;
28
29 class SubKeyRequest : public SubKeyRequester::Request {
30 public:
31 // The |delegate| and |address_validator| need to outlive this Request.
32 SubKeyRequest(const std::string& region_code,
33 int timeout_seconds,
34 SubKeyRequester::Delegate* delegate,
35 autofill::AddressValidator* address_validator)
36 : region_code_(region_code),
37 delegate_(delegate),
38 address_validator_(address_validator),
39 has_responded_(false),
40 on_timeout_(base::Bind(&::payments::SubKeyRequest::OnRulesLoaded,
41 base::Unretained(this))) {
42 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
43 FROM_HERE, on_timeout_.callback(),
44 base::TimeDelta::FromSeconds(timeout_seconds));
45 }
46
47 ~SubKeyRequest() override {}
48
49 void OnRulesLoaded() override {
50 on_timeout_.Cancel();
51 // Check if the timeout happened before the rules were loaded.
52 if (has_responded_)
53 return;
54 has_responded_ = true;
55
56 delegate_->OnSubKeysReceived(
57 address_validator_->GetRegionSubKeys(region_code_));
58 }
59
60 private:
61 std::string region_code_;
62 SubKeyRequester::Delegate* delegate_;
sebsg 2017/05/18 17:50:51 Please mention the lifetime of these pointer. For
Parastoo 2017/05/18 21:05:21 Done.
63 autofill::AddressValidator* address_validator_;
64
65 bool has_responded_;
66 base::CancelableCallback<void()> on_timeout_;
67
68 DISALLOW_COPY_AND_ASSIGN(SubKeyRequest);
69 };
70
71 } // namespace
72
73 SubKeyRequester::SubKeyRequester(std::unique_ptr<Source> source,
74 std::unique_ptr<Storage> storage)
75 : address_validator_(std::move(source), std::move(storage), this) {}
76
77 SubKeyRequester::~SubKeyRequester() {}
78
79 void SubKeyRequester::StartRegionSubKeysRequest(const std::string& region_code,
80 int timeout_seconds,
81 Delegate* requester) {
82 DCHECK(timeout_seconds >= 0);
83
84 std::unique_ptr<SubKeyRequest> request(base::MakeUnique<SubKeyRequest>(
85 region_code, timeout_seconds, requester, &address_validator_));
86
87 if (AreRulesLoadedForRegion(region_code)) {
88 request->OnRulesLoaded();
89 } else {
90 // Setup the variables so that the subkeys request is sent, when the rules
91 // are loaded.
92 pending_subkey_region_code_ = region_code;
93 pending_subkey_request_ = std::move(request);
94 }
95 // Start loading the rules for that region. If the rules were already in the
96 // process of being loaded, this call will do nothing.
97 LoadRulesForRegion(region_code);
sebsg 2017/05/18 17:50:51 Move this in the "else"?
Parastoo 2017/05/18 20:59:45 Done.
98 }
99
100 bool SubKeyRequester::AreRulesLoadedForRegion(const std::string& region_code) {
101 return address_validator_.AreRulesLoadedForRegion(region_code);
102 }
103
104 void SubKeyRequester::LoadRulesForRegion(const std::string& region_code) {
105 address_validator_.LoadRules(region_code);
106 }
107
108 void SubKeyRequester::OnAddressValidationRulesLoaded(
109 const std::string& region_code,
110 bool success) {
111 // if |success| == false, AddressValidator::GetRegionSubKeys will return an
112 // empty list of subkeys. => No need to check for |success|.
113 // Check if there is any subkey request for that region code.
114 if (!pending_subkey_region_code_.compare(region_code))
115 pending_subkey_request_->OnRulesLoaded();
116 pending_subkey_region_code_.clear();
sebsg 2017/05/18 17:50:51 I'm curious about this. Do you know if my address_
Parastoo 2017/05/18 20:59:45 No. For further reference: You (AddressNormalize
117 pending_subkey_request_.reset();
118 }
119
120 void SubKeyRequester::CancelPendingGetSubKeys() {
121 pending_subkey_region_code_.clear();
122 pending_subkey_request_.reset();
123 }
124
125 } // namespace payments
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698