| // Copyright 2017 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. | 
 |  | 
 | #ifndef COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_DISPLAY_MANAGER_H_ | 
 | #define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_DISPLAY_MANAGER_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/callback.h" | 
 | #include "base/macros.h" | 
 | #include "components/keyed_service/core/keyed_service.h" | 
 | #include "url/gurl.h" | 
 |  | 
 | namespace payments { | 
 |  | 
 | class ContentPaymentRequestDelegate; | 
 | class PaymentRequest; | 
 |  | 
 | // The callback type for functions that need to signal back to the ServiceWorker | 
 | // when a window was/failed to open following an openWindow call. The parameter | 
 | // indicates whether the call was successful or not. | 
 | using PaymentHandlerOpenWindowCallback = | 
 |     base::OnceCallback<void(bool /* success */, | 
 |                             int /* render_process_id */, | 
 |                             int /* render_frame_id */)>; | 
 |  | 
 | // This KeyedService is responsible for displaying and hiding Payment Request | 
 | // UI. It ensures that only one Payment Request is showing per profile. | 
 | class PaymentRequestDisplayManager : public KeyedService { | 
 |  public: | 
 |   class DisplayHandle { | 
 |    public: | 
 |     DisplayHandle(PaymentRequestDisplayManager* display_manager, | 
 |                   ContentPaymentRequestDelegate* delegate); | 
 |     ~DisplayHandle(); | 
 |     void Show(PaymentRequest* request); | 
 |     void Retry(); | 
 |     // Attempt to display |url| inside the Payment Request dialog and run | 
 |     // |callback| after navigation is completed, passing true/false to indicate | 
 |     // success/failure. | 
 |     void DisplayPaymentHandlerWindow(const GURL& url, | 
 |                                      PaymentHandlerOpenWindowCallback callback); | 
 |  | 
 |    private: | 
 |     PaymentRequestDisplayManager* display_manager_; | 
 |     ContentPaymentRequestDelegate* delegate_; | 
 |     DISALLOW_COPY_AND_ASSIGN(DisplayHandle); | 
 |   }; | 
 |  | 
 |   PaymentRequestDisplayManager(); | 
 |   ~PaymentRequestDisplayManager() override; | 
 |  | 
 |   // If no PaymentRequest is currently showing, returns a unique_ptr to a | 
 |   // display handle that can be used to display the PaymentRequest dialog. The | 
 |   // UI is considered open until the handle object is deleted. |callback| is | 
 |   // called with true if the window is finished opening successfully, false if | 
 |   // opening it failed. | 
 |   std::unique_ptr<DisplayHandle> TryShow( | 
 |       ContentPaymentRequestDelegate* delegate); | 
 |   void ShowPaymentHandlerWindow(const GURL& url, | 
 |                                 PaymentHandlerOpenWindowCallback callback); | 
 |  | 
 |  private: | 
 |   void set_current_handle(DisplayHandle* handle) { current_handle_ = handle; } | 
 |  | 
 |   DisplayHandle* current_handle_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PaymentRequestDisplayManager); | 
 | }; | 
 |  | 
 | }  // namespace payments | 
 |  | 
 | #endif  // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_DISPLAY_MANAGER_H_ |