[Web Payments] Restrict displayed Payment Requests to one per profile
TBR: [email protected]
Bug: 796261
Change-Id: If9397fbedac6cb8f22b101f8a682aed7625c4238
Reviewed-on: https://chromium-review.googlesource.com/822694
Commit-Queue: anthonyvd <[email protected]>
Reviewed-by: Rouslan Solomakhin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#525134}
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 7489cf3..8da5c9c 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -33,11 +33,14 @@
content::WebContents* web_contents,
std::unique_ptr<ContentPaymentRequestDelegate> delegate,
PaymentRequestWebContentsManager* manager,
+ PaymentRequestDisplayManager* display_manager,
mojo::InterfaceRequest<mojom::PaymentRequest> request,
ObserverForTest* observer_for_testing)
: web_contents_(web_contents),
delegate_(std::move(delegate)),
manager_(manager),
+ display_manager_(display_manager),
+ display_handle_(nullptr),
binding_(this, std::move(request)),
top_level_origin_(url_formatter::FormatUrlForSecurityDisplay(
web_contents_->GetLastCommittedURL())),
@@ -155,7 +158,8 @@
}
// A tab can display only one PaymentRequest UI at a time.
- if (!manager_->CanShow(this)) {
+ display_handle_ = display_manager_->TryShow();
+ if (!display_handle_) {
LOG(ERROR) << "A PaymentRequest UI is already showing";
journey_logger_.SetNotShown(
JourneyLogger::NOT_SHOWN_REASON_CONCURRENT_REQUESTS);
@@ -184,7 +188,8 @@
if (methods_supported) {
journey_logger_.SetEventOccurred(JourneyLogger::EVENT_SHOWN);
- delegate_->ShowDialog(this);
+ DCHECK(display_handle_);
+ display_handle_->Show(delegate_.get(), this);
} else {
journey_logger_.SetNotShown(
JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD);
@@ -339,6 +344,10 @@
state_->GeneratePaymentResponse();
}
+void PaymentRequest::HideIfNecessary() {
+ display_handle_.reset();
+}
+
void PaymentRequest::RecordFirstAbortReason(
JourneyLogger::AbortReason abort_reason) {
if (!has_recorded_completion_) {