Index: components/autofill/core/browser/payments/full_card_request.cc |
diff --git a/components/autofill/core/browser/payments/full_card_request.cc b/components/autofill/core/browser/payments/full_card_request.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..81b759bbe14dfe8dc6cb64cbf418a7d29df745bc |
--- /dev/null |
+++ b/components/autofill/core/browser/payments/full_card_request.cc |
@@ -0,0 +1,134 @@ |
+// Copyright 2016 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/core/browser/payments/full_card_request.h" |
+ |
+#include "base/bind.h" |
+#include "base/logging.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "components/autofill/core/browser/autofill_client.h" |
+#include "components/autofill/core/browser/autofill_metrics.h" |
+#include "components/autofill/core/browser/credit_card.h" |
+#include "components/autofill/core/browser/personal_data_manager.h" |
+ |
+namespace autofill { |
+namespace payments { |
+ |
+FullCardRequest::FullCardRequest(AutofillClient* autofill_client, |
+ payments::PaymentsClient* payments_client, |
+ PersonalDataManager* personal_data_manager) |
+ : autofill_client_(autofill_client), |
+ payments_client_(payments_client), |
+ personal_data_manager_(personal_data_manager), |
+ delegate_(nullptr), |
+ weak_ptr_factory_(this) { |
+ DCHECK(autofill_client_); |
+ DCHECK(personal_data_manager_); |
+} |
+ |
+FullCardRequest::~FullCardRequest() {} |
+ |
+void FullCardRequest::GetFullCard(const CreditCard& card, |
+ AutofillClient::UnmaskCardReason reason, |
+ base::WeakPtr<Delegate> delegate) { |
+ DCHECK(delegate); |
+ |
+ // Only request can be active a time. If the member variable |delegate_| is |
+ // already set, then immediately reject the new request through the method |
+ // parameter |delegate|. |
+ if (delegate_) { |
+ delegate->OnFullCardError(); |
+ return; |
+ } |
+ |
+ delegate_ = delegate; |
+ request_.reset(new payments::PaymentsClient::UnmaskRequestDetails); |
+ request_->card = card; |
+ bool is_masked = card.record_type() == CreditCard::MASKED_SERVER_CARD; |
+ if (is_masked) |
+ payments_client_->Prepare(); |
+ |
+ autofill_client_->ShowUnmaskPrompt(request_->card, reason, |
+ weak_ptr_factory_.GetWeakPtr()); |
+ |
+ if (is_masked) { |
+ autofill_client_->LoadRiskData( |
+ base::Bind(&FullCardRequest::OnDidGetUnmaskRiskData, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+} |
+ |
+bool FullCardRequest::IsGettingFullCard() const { |
+ return !!request_; |
+} |
+ |
+void FullCardRequest::OnUnmaskResponse(const UnmaskResponse& response) { |
+ // TODO(rouslan): Update the expiration date of the card on disk. |
+ // http://crbug.com/606008 |
+ if (!response.exp_month.empty()) |
+ request_->card.SetRawInfo(CREDIT_CARD_EXP_MONTH, response.exp_month); |
+ |
+ if (!response.exp_year.empty()) |
+ request_->card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, response.exp_year); |
+ |
+ if (request_->card.record_type() != CreditCard::MASKED_SERVER_CARD) { |
+ if (delegate_) |
+ delegate_->OnFullCardDetails(request_->card, response.cvc); |
+ delegate_ = nullptr; |
+ autofill_client_->OnUnmaskVerificationResult(AutofillClient::SUCCESS); |
+ request_.reset(); |
+ return; |
+ } |
+ |
+ request_->user_response = response; |
+ if (!request_->risk_data.empty()) { |
+ real_pan_request_timestamp_ = base::Time::Now(); |
+ payments_client_->UnmaskCard(*request_); |
+ } |
+} |
+ |
+void FullCardRequest::OnUnmaskPromptClosed() { |
+ if (delegate_) |
+ delegate_->OnFullCardError(); |
+ |
+ delegate_ = nullptr; |
+ payments_client_->CancelRequest(); |
+ request_.reset(); |
+} |
+ |
+void FullCardRequest::OnDidGetUnmaskRiskData(const std::string& risk_data) { |
+ request_->risk_data = risk_data; |
+ if (!request_->user_response.cvc.empty()) { |
+ real_pan_request_timestamp_ = base::Time::Now(); |
+ payments_client_->UnmaskCard(*request_); |
+ } |
+} |
+ |
+void FullCardRequest::OnDidGetRealPan(AutofillClient::PaymentsRpcResult result, |
+ const std::string& real_pan) { |
+ AutofillMetrics::LogRealPanDuration( |
+ base::Time::Now() - real_pan_request_timestamp_, result); |
+ |
+ if (!real_pan.empty()) { |
+ DCHECK_EQ(AutofillClient::SUCCESS, result); |
+ request_->card.set_record_type(CreditCard::FULL_SERVER_CARD); |
+ request_->card.SetNumber(base::UTF8ToUTF16(real_pan)); |
+ |
+ if (request_->user_response.should_store_pan) |
+ personal_data_manager_->UpdateServerCreditCard(request_->card); |
+ |
+ if (delegate_) |
+ delegate_->OnFullCardDetails(request_->card, request_->user_response.cvc); |
+ } else { |
+ if (delegate_) |
+ delegate_->OnFullCardError(); |
+ } |
+ |
+ delegate_ = nullptr; |
+ autofill_client_->OnUnmaskVerificationResult(result); |
+ request_.reset(); |
+} |
+ |
+} // namespace payments |
+} // namespace autofill |