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

Unified Diff: components/payments/content/payment_request.cc

Issue 2715213005: [Payments] Add the pay button, and control its enabled state (Closed)
Patch Set: addressed comments Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: components/payments/content/payment_request.cc
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 0a83cf2c5afd7ef3d4b6ffe48c37e57d90770c37..5e2614e46852f9989d6436ad977c3fbb24af1e18 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -4,10 +4,13 @@
#include "components/payments/content/payment_request.h"
+#include <algorithm>
#include <unordered_map>
#include <utility>
#include "base/memory/ptr_util.h"
+#include "components/autofill/core/browser/autofill_data_util.h"
+#include "components/autofill/core/browser/field_types.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "components/payments/content/payment_details_validation.h"
#include "components/payments/content/payment_request_web_contents_manager.h"
@@ -26,6 +29,7 @@ PaymentRequest::PaymentRequest(
delegate_(std::move(delegate)),
manager_(manager),
binding_(this, std::move(request)),
+ is_ready_to_pay_(false),
selected_shipping_profile_(nullptr),
selected_contact_profile_(nullptr),
selected_credit_card_(nullptr) {
@@ -54,6 +58,7 @@ void PaymentRequest::Init(
}
client_ = std::move(client);
details_ = std::move(details);
+ options_ = std::move(options);
PopulateValidatedMethodData(method_data);
PopulateProfileCache();
SetDefaultProfileSelections();
@@ -103,6 +108,22 @@ void PaymentRequest::OnConnectionTerminated() {
manager_->DestroyRequest(this);
}
+void PaymentRequest::Pay() {
+ DCHECK(is_ready_to_pay_);
+
+ // TODO(mathp): Return the PaymentResponse to the |client_|.
+ UserCancelled();
+}
+
+void PaymentRequest::AddObserver(Observer* observer) {
+ CHECK(observer);
+ observers_.AddObserver(observer);
+}
+
+void PaymentRequest::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
CurrencyFormatter* PaymentRequest::GetOrCreateCurrencyFormatter(
const std::string& currency_code,
const std::string& currency_system,
@@ -114,14 +135,21 @@ CurrencyFormatter* PaymentRequest::GetOrCreateCurrencyFormatter(
return currency_formatter_.get();
}
-const std::vector<autofill::AutofillProfile*>&
-PaymentRequest::shipping_profiles() {
- return shipping_profiles_;
+void PaymentRequest::SetSelectedShippingProfile(
+ autofill::AutofillProfile* profile) {
+ selected_shipping_profile_ = profile;
+ UpdateIsReadyToPayAndNotifyObservers();
+}
+
+void PaymentRequest::SetSelectedContactProfile(
+ autofill::AutofillProfile* profile) {
+ selected_contact_profile_ = profile;
+ UpdateIsReadyToPayAndNotifyObservers();
}
-const std::vector<autofill::AutofillProfile*>&
-PaymentRequest::contact_profiles() {
- return contact_profiles_;
+void PaymentRequest::SetSelectedCreditCard(autofill::CreditCard* card) {
+ selected_credit_card_ = card;
+ UpdateIsReadyToPayAndNotifyObservers();
}
void PaymentRequest::PopulateProfileCache() {
@@ -151,10 +179,10 @@ void PaymentRequest::PopulateProfileCache() {
void PaymentRequest::SetDefaultProfileSelections() {
if (!shipping_profiles().empty())
- set_selected_shipping_profile(shipping_profiles()[0]);
+ selected_shipping_profile_ = shipping_profiles()[0];
if (!contact_profiles().empty())
- set_selected_contact_profile(contact_profiles()[0]);
+ selected_contact_profile_ = contact_profiles()[0];
// TODO(anthonyvd): Change this code to prioritize server cards and implement
// a way to modify this function's return value.
@@ -165,6 +193,8 @@ void PaymentRequest::SetDefaultProfileSelections() {
selected_credit_card_ =
first_complete_card == cards.end() ? nullptr : *first_complete_card;
+
+ UpdateIsReadyToPayAndNotifyObservers();
}
void PaymentRequest::PopulateValidatedMethodData(
@@ -241,4 +271,63 @@ void PaymentRequest::PopulateValidatedMethodData(
}
}
+void PaymentRequest::UpdateIsReadyToPayAndNotifyObservers() {
+ is_ready_to_pay_ =
+ ArePaymentDetailsSatisfied() && ArePaymentOptionsSatisfied();
+ NotifyOnSelectedInformationChanged();
+}
+
+void PaymentRequest::NotifyOnSelectedInformationChanged() {
+ for (auto& observer : observers_)
+ observer.OnSelectedInformationChanged();
+}
+
+bool PaymentRequest::ArePaymentDetailsSatisfied() {
+ // TODO(mathp): A masked card may not satisfy IsValid().
+ if (selected_credit_card_ == nullptr || !selected_credit_card_->IsValid())
+ return false;
+
+ const std::string basic_card_payment_type =
+ autofill::data_util::GetPaymentRequestData(selected_credit_card_->type())
+ .basic_card_payment_type;
+ return !supported_card_networks_.empty() &&
+ std::find(supported_card_networks_.begin(),
+ supported_card_networks_.end(),
+ basic_card_payment_type) != supported_card_networks_.end();
+}
+
+bool PaymentRequest::ArePaymentOptionsSatisfied() {
+ // TODO(mathp): Have a measure of shipping address completeness.
+ if (options_->request_shipping && selected_shipping_profile_ == nullptr)
+ return false;
+
+ // TODO(mathp): Make an encompassing class to validate contact info.
+ const std::string& app_locale = delegate_->GetApplicationLocale();
+ if (options_->request_payer_name &&
+ (selected_contact_profile_ == nullptr ||
+ selected_contact_profile_
+ ->GetInfo(autofill::AutofillType(autofill::NAME_FULL), app_locale)
+ .empty())) {
+ return false;
+ }
+ if (options_->request_payer_email &&
+ (selected_contact_profile_ == nullptr ||
+ selected_contact_profile_
+ ->GetInfo(autofill::AutofillType(autofill::EMAIL_ADDRESS),
+ app_locale)
+ .empty())) {
+ return false;
+ }
+ if (options_->request_payer_phone &&
+ (selected_contact_profile_ == nullptr ||
+ selected_contact_profile_
+ ->GetInfo(autofill::AutofillType(autofill::PHONE_HOME_WHOLE_NUMBER),
+ app_locale)
+ .empty())) {
+ return false;
+ }
+
+ return true;
+}
+
} // namespace payments
« no previous file with comments | « components/payments/content/payment_request.h ('k') | components/payments/content/payment_request_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698