[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_) {