Index: components/autofill/core/browser/autofill_manager.cc |
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc |
index ea4c155b95a449c7ed10a19e9755d9580b4c07d5..c6ff80e0a8605834ba2b3940a682edfc4df6052e 100644 |
--- a/components/autofill/core/browser/autofill_manager.cc |
+++ b/components/autofill/core/browser/autofill_manager.cc |
@@ -244,6 +244,30 @@ void AutofillManager::ShowAutofillSettings() { |
client_->ShowAutofillSettings(); |
} |
+void AutofillManager::UnmaskCardForPayment(const CreditCard& maybe_masked_card, |
+ const UnmaskCallback& callback) { |
+ if (unmask_callback_) { |
+ callback.Run(false, maybe_masked_card, maybe_masked_card, base::string16()); |
+ return; |
+ } |
+ |
+ unmask_callback_.reset(new UnmaskCallback(callback)); |
+ unmask_request_.card = maybe_masked_card; |
+ bool is_masked = |
+ maybe_masked_card.record_type() == CreditCard::MASKED_SERVER_CARD; |
+ |
+ if (is_masked) |
+ payments_client_->Prepare(); |
+ |
+ client_->ShowUnmaskPrompt(unmask_request_.card, |
Mathieu
2016/04/19 13:24:25
can you mention why we're calling ShowUnmaskPrompt
|
+ weak_ptr_factory_.GetWeakPtr()); |
+ |
+ if (is_masked) { |
+ client_->LoadRiskData(base::Bind(&AutofillManager::OnDidGetUnmaskRiskData, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+} |
+ |
bool AutofillManager::ShouldShowScanCreditCard(const FormData& form, |
const FormFieldData& field) { |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -607,15 +631,12 @@ void AutofillManager::FillOrPreviewCreditCardForm( |
if (action == AutofillDriver::FORM_DATA_ACTION_FILL) { |
if (credit_card.record_type() == CreditCard::MASKED_SERVER_CARD && |
WillFillCreditCardNumber(form, field)) { |
- unmask_request_.card = credit_card; |
unmasking_query_id_ = query_id; |
unmasking_form_ = form; |
unmasking_field_ = field; |
- payments_client_->Prepare(); |
- client_->ShowUnmaskPrompt(unmask_request_.card, |
- weak_ptr_factory_.GetWeakPtr()); |
- client_->LoadRiskData(base::Bind(&AutofillManager::OnDidGetUnmaskRiskData, |
- weak_ptr_factory_.GetWeakPtr())); |
+ UnmaskCardForPayment(credit_card, |
+ base::Bind(&AutofillManager::OnCardUnmasked, |
+ weak_ptr_factory_.GetWeakPtr())); |
credit_card_form_event_logger_->OnDidSelectMaskedServerCardSuggestion(); |
return; |
} |
@@ -876,6 +897,16 @@ void AutofillManager::OnLoadedServerPredictions( |
} |
void AutofillManager::OnUnmaskResponse(const UnmaskResponse& response) { |
+ DCHECK(unmask_callback_); |
+ |
+ if (unmask_request_.card.record_type() != CreditCard::MASKED_SERVER_CARD) { |
+ unmask_callback_->Run(true, unmask_request_.card, unmask_request_.card, |
+ response.cvc); |
+ unmask_callback_.reset(); |
+ client_->OnUnmaskVerificationResult(AutofillClient::SUCCESS); |
+ return; |
+ } |
+ |
unmask_request_.user_response = response; |
if (!unmask_request_.risk_data.empty()) { |
real_pan_request_timestamp_ = base::Time::Now(); |
@@ -884,8 +915,12 @@ void AutofillManager::OnUnmaskResponse(const UnmaskResponse& response) { |
} |
void AutofillManager::OnUnmaskPromptClosed() { |
+ if (unmask_callback_) { |
+ unmask_callback_->Run(false, unmask_request_.card, unmask_request_.card, |
+ base::string16()); |
+ unmask_callback_.reset(); |
+ } |
payments_client_->CancelRequest(); |
- driver_->RendererShouldClearPreviewedForm(); |
unmask_request_ = payments::PaymentsClient::UnmaskRequestDetails(); |
} |
@@ -895,11 +930,12 @@ IdentityProvider* AutofillManager::GetIdentityProvider() { |
void AutofillManager::OnDidGetRealPan(AutofillClient::PaymentsRpcResult result, |
const std::string& real_pan) { |
+ DCHECK(unmask_callback_); |
AutofillMetrics::LogRealPanDuration( |
base::Time::Now() - real_pan_request_timestamp_, result); |
+ CreditCard original = unmask_request_.card; |
if (!real_pan.empty()) { |
DCHECK_EQ(AutofillClient::SUCCESS, result); |
- credit_card_form_event_logger_->OnDidFillSuggestion(unmask_request_.card); |
unmask_request_.card.set_record_type(CreditCard::FULL_SERVER_CARD); |
unmask_request_.card.SetNumber(base::UTF8ToUTF16(real_pan)); |
if (!unmask_request_.user_response.exp_month.empty()) { |
@@ -912,11 +948,13 @@ void AutofillManager::OnDidGetRealPan(AutofillClient::PaymentsRpcResult result, |
} |
if (unmask_request_.user_response.should_store_pan) |
personal_data_->UpdateServerCreditCard(unmask_request_.card); |
- |
- FillCreditCardForm(unmasking_query_id_, unmasking_form_, unmasking_field_, |
- unmask_request_.card); |
} |
+ unmask_callback_->Run(!real_pan.empty() && result == AutofillClient::SUCCESS, |
+ original, unmask_request_.card, |
+ unmask_request_.user_response.cvc); |
+ unmask_callback_.reset(); |
+ |
client_->OnUnmaskVerificationResult(result); |
} |
@@ -966,6 +1004,19 @@ void AutofillManager::OnDidUploadCard( |
// TODO(jdonnelly): Log duration. |
} |
+void AutofillManager::OnCardUnmasked(bool success, |
+ const CreditCard& original_card, |
+ const CreditCard& unmasked_card, |
+ const base::string16& unused_cvc) { |
+ if (success) { |
+ credit_card_form_event_logger_->OnDidFillSuggestion(original_card); |
+ FillCreditCardForm(unmasking_query_id_, unmasking_form_, unmasking_field_, |
Mathieu
2016/04/19 13:24:24
curious, if the CVC is unused here, where is it ta
|
+ unmasked_card); |
+ } else { |
+ driver_->RendererShouldClearPreviewedForm(); |
+ } |
+} |
+ |
void AutofillManager::OnDidGetUnmaskRiskData(const std::string& risk_data) { |
unmask_request_.risk_data = risk_data; |
if (!unmask_request_.user_response.cvc.empty()) { |