krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
rouslan | 908248c | 2017-02-27 21:30:24 | [diff] [blame] | 5 | #ifndef COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_H_ |
| 6 | #define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_H_ |
mathp | f709499d | 2017-01-09 20:48:36 | [diff] [blame] | 7 | |
| 8 | #include <memory> |
tmartino | 68c0a27 | 2017-01-19 17:44:08 | [diff] [blame] | 9 | #include <vector> |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 10 | |
rouslan | 908248c | 2017-02-27 21:30:24 | [diff] [blame] | 11 | #include "base/macros.h" |
Anthony Vallee-Dubois | dc1dbf1a | 2017-07-17 15:01:13 | [diff] [blame] | 12 | #include "base/memory/weak_ptr.h" |
Rouslan Solomakhin | 2706470 | 2018-12-14 21:15:33 | [diff] [blame] | 13 | #include "components/payments/content/developer_console_logger.h" |
Rouslan Solomakhin | 8e9f149b2 | 2019-05-10 17:43:02 | [diff] [blame] | 14 | #include "components/payments/content/payment_handler_host.h" |
Anthony Vallee-Dubois | c7ae733 | 2017-12-19 20:44:07 | [diff] [blame] | 15 | #include "components/payments/content/payment_request_display_manager.h" |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 16 | #include "components/payments/content/payment_request_spec.h" |
| 17 | #include "components/payments/content/payment_request_state.h" |
Rouslan Solomakhin | 5d15cb1f | 2019-11-11 18:11:39 | [diff] [blame] | 18 | #include "components/payments/content/service_worker_payment_app.h" |
sebsg | 20b49d7b | 2017-05-04 20:23:17 | [diff] [blame] | 19 | #include "components/payments/core/journey_logger.h" |
Danyao Wang | 1584079 | 2020-05-07 23:52:17 | [diff] [blame^] | 20 | #include "content/public/browser/global_routing_id.h" |
Gyuyoung Kim | 9cfbda3 | 2019-08-27 02:15:18 | [diff] [blame] | 21 | #include "mojo/public/cpp/bindings/receiver.h" |
| 22 | #include "mojo/public/cpp/bindings/remote.h" |
Han Leon | abbe7c90 | 2018-08-30 02:08:10 | [diff] [blame] | 23 | #include "third_party/blink/public/mojom/payments/payment_request.mojom.h" |
Rouslan Solomakhin | 6e979ab | 2017-08-30 17:30:39 | [diff] [blame] | 24 | #include "url/gurl.h" |
Rouslan Solomakhin | c71cca62 | 2020-01-31 22:15:35 | [diff] [blame] | 25 | #include "url/origin.h" |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 26 | |
| 27 | namespace content { |
rouslan | 69099768 | 2017-05-09 18:07:39 | [diff] [blame] | 28 | class RenderFrameHost; |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 29 | class WebContents; |
Rouslan Solomakhin | 115f723 | 2017-08-01 15:24:38 | [diff] [blame] | 30 | } // namespace content |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 31 | |
| 32 | namespace payments { |
| 33 | |
Rouslan Solomakhin | 4eea9bc2 | 2017-10-10 15:18:51 | [diff] [blame] | 34 | class ContentPaymentRequestDelegate; |
mathp | f709499d | 2017-01-09 20:48:36 | [diff] [blame] | 35 | class PaymentRequestWebContentsManager; |
| 36 | |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 37 | // This class manages the interaction between the renderer (through the |
| 38 | // PaymentRequestClient and Mojo stub implementation) and the UI (through the |
| 39 | // PaymentRequestDelegate). The API user (merchant) specification (supported |
| 40 | // payment methods, required information, order details) is stored in |
| 41 | // PaymentRequestSpec, and the current user selection state (and related data) |
| 42 | // is stored in PaymentRequestSpec. |
mathp | 4b85b58 | 2017-03-08 21:07:16 | [diff] [blame] | 43 | class PaymentRequest : public mojom::PaymentRequest, |
Rouslan Solomakhin | 8e9f149b2 | 2019-05-10 17:43:02 | [diff] [blame] | 44 | public PaymentHandlerHost::Delegate, |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 45 | public PaymentRequestSpec::Observer, |
Rouslan Solomakhin | 6d4c1c27 | 2019-11-22 17:09:27 | [diff] [blame] | 46 | public PaymentRequestState::Delegate { |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 47 | public: |
mathp | 300fa54 | 2017-03-27 19:29:37 | [diff] [blame] | 48 | class ObserverForTest { |
| 49 | public: |
| 50 | virtual void OnCanMakePaymentCalled() = 0; |
gogerald | 8189d52 | 2017-09-15 17:52:18 | [diff] [blame] | 51 | virtual void OnCanMakePaymentReturned() = 0; |
Danyao Wang | ce175bf | 2018-12-21 22:35:58 | [diff] [blame] | 52 | virtual void OnHasEnrolledInstrumentCalled() = 0; |
| 53 | virtual void OnHasEnrolledInstrumentReturned() = 0; |
Rouslan Solomakhin | 5d15cb1f | 2019-11-11 18:11:39 | [diff] [blame] | 54 | virtual void OnShowAppsReady() {} |
rouslan | 6e3cf7c6 | 2017-04-17 21:23:28 | [diff] [blame] | 55 | virtual void OnNotSupportedError() = 0; |
rouslan | b28f453 | 2017-05-08 15:41:47 | [diff] [blame] | 56 | virtual void OnConnectionTerminated() = 0; |
Anthony Vallee-Dubois | 6813c144 | 2017-05-17 19:32:56 | [diff] [blame] | 57 | virtual void OnAbortCalled() = 0; |
Sahel Sharify | 2a56b5f | 2019-11-28 19:27:19 | [diff] [blame] | 58 | virtual void OnCompleteCalled() {} |
mathp | 300fa54 | 2017-03-27 19:29:37 | [diff] [blame] | 59 | |
| 60 | protected: |
| 61 | virtual ~ObserverForTest() {} |
| 62 | }; |
| 63 | |
rouslan | 69099768 | 2017-05-09 18:07:39 | [diff] [blame] | 64 | PaymentRequest(content::RenderFrameHost* render_frame_host, |
| 65 | content::WebContents* web_contents, |
Rouslan Solomakhin | 4eea9bc2 | 2017-10-10 15:18:51 | [diff] [blame] | 66 | std::unique_ptr<ContentPaymentRequestDelegate> delegate, |
rouslan | 8fdbfb24 | 2017-03-15 01:12:49 | [diff] [blame] | 67 | PaymentRequestWebContentsManager* manager, |
Anthony Vallee-Dubois | c7ae733 | 2017-12-19 20:44:07 | [diff] [blame] | 68 | PaymentRequestDisplayManager* display_manager, |
Gyuyoung Kim | 9cfbda3 | 2019-08-27 02:15:18 | [diff] [blame] | 69 | mojo::PendingReceiver<mojom::PaymentRequest> receiver, |
mathp | 300fa54 | 2017-03-27 19:29:37 | [diff] [blame] | 70 | ObserverForTest* observer_for_testing); |
mathp | f709499d | 2017-01-09 20:48:36 | [diff] [blame] | 71 | ~PaymentRequest() override; |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 72 | |
rouslan | 8fdbfb24 | 2017-03-15 01:12:49 | [diff] [blame] | 73 | // mojom::PaymentRequest |
Gyuyoung Kim | 9cfbda3 | 2019-08-27 02:15:18 | [diff] [blame] | 74 | void Init(mojo::PendingRemote<mojom::PaymentRequestClient> client, |
rouslan | 8fdbfb24 | 2017-03-15 01:12:49 | [diff] [blame] | 75 | std::vector<mojom::PaymentMethodDataPtr> method_data, |
| 76 | mojom::PaymentDetailsPtr details, |
| 77 | mojom::PaymentOptionsPtr options) override; |
Rouslan Solomakhin | 9788d4b | 2019-04-09 13:10:23 | [diff] [blame] | 78 | void Show(bool is_user_gesture, bool wait_for_updated_details) override; |
Jinho Bang | be463a2 | 2018-08-02 10:26:50 | [diff] [blame] | 79 | void Retry(mojom::PaymentValidationErrorsPtr errors) override; |
mathp | 151bd31 | 2017-04-03 21:07:24 | [diff] [blame] | 80 | void UpdateWith(mojom::PaymentDetailsPtr details) override; |
Sahel Sharify | e2f88954 | 2019-12-02 22:17:48 | [diff] [blame] | 81 | void OnPaymentDetailsNotUpdated() override; |
mathp | f4bc50e | 2017-01-24 05:17:50 | [diff] [blame] | 82 | void Abort() override; |
rouslan | 8fdbfb24 | 2017-03-15 01:12:49 | [diff] [blame] | 83 | void Complete(mojom::PaymentComplete result) override; |
Danyao Wang | 03a4cbd | 2019-08-15 23:47:11 | [diff] [blame] | 84 | void CanMakePayment() override; |
Rouslan Solomakhin | 5683eb28 | 2019-01-29 18:06:03 | [diff] [blame] | 85 | void HasEnrolledInstrument(bool per_method_quota) override; |
mathp | 4b85b58 | 2017-03-08 21:07:16 | [diff] [blame] | 86 | |
Rouslan Solomakhin | 8e9f149b2 | 2019-05-10 17:43:02 | [diff] [blame] | 87 | // PaymentHandlerHost::Delegate |
| 88 | bool ChangePaymentMethod(const std::string& method_name, |
| 89 | const std::string& stringified_data) override; |
Sahel Sharify | 9d98a50 | 2019-09-30 19:58:39 | [diff] [blame] | 90 | bool ChangeShippingOption(const std::string& shipping_option_id) override; |
| 91 | bool ChangeShippingAddress( |
| 92 | mojom::PaymentAddressPtr shipping_address) override; |
Rouslan Solomakhin | a480efa | 2019-05-06 15:37:22 | [diff] [blame] | 93 | |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 94 | // PaymentRequestSpec::Observer: |
mathp | 151bd31 | 2017-04-03 21:07:24 | [diff] [blame] | 95 | void OnSpecUpdated() override {} |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 96 | |
| 97 | // PaymentRequestState::Delegate: |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 98 | void OnPaymentResponseAvailable(mojom::PaymentResponsePtr response) override; |
Rouslan Solomakhin | 68429b7 | 2019-06-27 15:12:39 | [diff] [blame] | 99 | void OnPaymentResponseError(const std::string& error_message) override; |
mathp | 151bd31 | 2017-04-03 21:07:24 | [diff] [blame] | 100 | void OnShippingOptionIdSelected(std::string shipping_option_id) override; |
| 101 | void OnShippingAddressSelected(mojom::PaymentAddressPtr address) override; |
Jinho Bang | bb17815 | 2018-09-13 09:44:43 | [diff] [blame] | 102 | void OnPayerInfoSelected(mojom::PayerDetailPtr payer_info) override; |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 103 | |
Rouslan Solomakhin | 1f95f09 | 2019-08-09 12:28:51 | [diff] [blame] | 104 | void SetInvokedServiceWorkerIdentity(const url::Origin& origin, |
Rouslan Solomakhin | 6d4c1c27 | 2019-11-22 17:09:27 | [diff] [blame] | 105 | int64_t registration_id); |
Rouslan Solomakhin | 1f95f09 | 2019-08-09 12:28:51 | [diff] [blame] | 106 | |
Rouslan Solomakhin | 16ee5520 | 2017-10-03 19:04:42 | [diff] [blame] | 107 | // Called when the user explicitly cancelled the flow. Will send a message |
mathp | f4bc50e | 2017-01-24 05:17:50 | [diff] [blame] | 108 | // to the renderer which will indirectly destroy this object (through |
| 109 | // OnConnectionTerminated). |
| 110 | void UserCancelled(); |
| 111 | |
sebsg | d56b3e42 | 2017-10-20 18:08:08 | [diff] [blame] | 112 | // Called when the main frame attached to this PaymentRequest is navigating to |
| 113 | // another document, but before the PaymentRequest is destroyed. |
| 114 | void DidStartMainFrameNavigationToDifferentDocument(bool is_user_initiated); |
sebsg | 2c8558a | 2017-05-17 18:54:10 | [diff] [blame] | 115 | |
mathp | f4bc50e | 2017-01-24 05:17:50 | [diff] [blame] | 116 | // As a result of a browser-side error or renderer-initiated mojo channel |
| 117 | // closure (e.g. there was an error on the renderer side, or payment was |
| 118 | // successful), this method is called. It is responsible for cleaning up, |
| 119 | // such as possibly closing the dialog. |
| 120 | void OnConnectionTerminated(); |
mathp | 6758be03 | 2017-01-13 04:49:50 | [diff] [blame] | 121 | |
mathp | d4be8de8 | 2017-03-01 00:51:48 | [diff] [blame] | 122 | // Called when the user clicks on the "Pay" button. |
| 123 | void Pay(); |
| 124 | |
Anthony Vallee-Dubois | c7ae733 | 2017-12-19 20:44:07 | [diff] [blame] | 125 | // Hide this Payment Request if it's already showing. |
| 126 | void HideIfNecessary(); |
| 127 | |
Anthony Vallee-Dubois | 10d131a | 2018-02-22 15:41:04 | [diff] [blame] | 128 | bool IsIncognito() const; |
| 129 | |
Sahel Sharify | 54f5e86 | 2020-03-26 20:02:41 | [diff] [blame] | 130 | // Called when the payment handler requests to open a payment handler window. |
| 131 | void OnPaymentHandlerOpenWindowCalled(); |
| 132 | |
anthonyvd | 3d7f972 | 2016-12-07 18:43:54 | [diff] [blame] | 133 | content::WebContents* web_contents() { return web_contents_; } |
| 134 | |
gogerald | 2ddfc64c | 2018-08-23 16:20:21 | [diff] [blame] | 135 | bool skipped_payment_request_ui() { return skipped_payment_request_ui_; } |
Rouslan Solomakhin | 1dca2a92 | 2019-09-06 22:25:07 | [diff] [blame] | 136 | bool is_show_user_gesture() const { return is_show_user_gesture_; } |
gogerald | 2ddfc64c | 2018-08-23 16:20:21 | [diff] [blame] | 137 | |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 138 | PaymentRequestSpec* spec() { return spec_.get(); } |
| 139 | PaymentRequestState* state() { return state_.get(); } |
mathp | d4be8de8 | 2017-03-01 00:51:48 | [diff] [blame] | 140 | |
Anthony Vallee-Dubois | 968ae4d | 2018-03-15 16:56:36 | [diff] [blame] | 141 | PaymentRequestSpec* spec() const { return spec_.get(); } |
| 142 | PaymentRequestState* state() const { return state_.get(); } |
| 143 | |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 144 | private: |
Rouslan Solomakhin | 2706470 | 2018-12-14 21:15:33 | [diff] [blame] | 145 | // Returns true after init() has been called and the mojo connection has been |
| 146 | // established. If the mojo connection gets later disconnected, this will |
| 147 | // returns false. |
| 148 | bool IsInitialized() const; |
| 149 | |
| 150 | // Returns true after show() has been called and the payment sheet is showing. |
| 151 | // If the payment sheet is later hidden, this will return false. |
| 152 | bool IsThisPaymentRequestShowing() const; |
| 153 | |
Sahel Sharify | 9120fd3 | 2019-12-05 17:16:11 | [diff] [blame] | 154 | // Returns true when there is exactly one available payment app which can |
| 155 | // provide all requested information including shipping address and payer's |
| 156 | // contact information whenever needed. |
| 157 | bool OnlySingleAppCanProvideAllRequiredInformation() const; |
| 158 | |
gogerald | 2ddfc64c | 2018-08-23 16:20:21 | [diff] [blame] | 159 | // Returns true if this payment request supports skipping the Payment Sheet. |
Sahel Sharify | 9120fd3 | 2019-12-05 17:16:11 | [diff] [blame] | 160 | // Typically, this means that exactly one payment app can provide requested |
| 161 | // information. |
Sahel Sharify | d3f1bc8 | 2019-05-21 18:48:46 | [diff] [blame] | 162 | bool SatisfiesSkipUIConstraints(); |
gogerald | 2ddfc64c | 2018-08-23 16:20:21 | [diff] [blame] | 163 | |
sebsg | fcdd13c | 2017-06-08 15:49:33 | [diff] [blame] | 164 | // Only records the abort reason if it's the first completion for this Payment |
| 165 | // Request. This is necessary since the aborts cascade into one another with |
| 166 | // the first one being the most precise. |
| 167 | void RecordFirstAbortReason(JourneyLogger::AbortReason completion_status); |
sebsg | 2c8558a | 2017-05-17 18:54:10 | [diff] [blame] | 168 | |
Danyao Wang | 03a4cbd | 2019-08-15 23:47:11 | [diff] [blame] | 169 | // The callback for PaymentRequestState::CanMakePayment. |
| 170 | void CanMakePaymentCallback(bool can_make_payment); |
gogerald | 8189d52 | 2017-09-15 17:52:18 | [diff] [blame] | 171 | |
Danyao Wang | ce175bf | 2018-12-21 22:35:58 | [diff] [blame] | 172 | // The callback for PaymentRequestState::HasEnrolledInstrument. Checks for |
| 173 | // query quota and may send QUERY_QUOTA_EXCEEDED. |
Rouslan Solomakhin | 5683eb28 | 2019-01-29 18:06:03 | [diff] [blame] | 174 | void HasEnrolledInstrumentCallback(bool per_method_quota, |
| 175 | bool has_enrolled_instrument); |
Danyao Wang | ce175bf | 2018-12-21 22:35:58 | [diff] [blame] | 176 | |
gogerald | 0a7ee6c | 2017-11-13 18:23:19 | [diff] [blame] | 177 | // The callback for PaymentRequestState::AreRequestedMethodsSupported. |
Rouslan Solomakhin | d5dcc32 | 2019-07-11 21:47:20 | [diff] [blame] | 178 | void AreRequestedMethodsSupportedCallback(bool methods_supported, |
| 179 | const std::string& error_message); |
gogerald | 0a7ee6c | 2017-11-13 18:23:19 | [diff] [blame] | 180 | |
Danyao Wang | ce175bf | 2018-12-21 22:35:58 | [diff] [blame] | 181 | // Sends either HAS_ENROLLED_INSTRUMENT or HAS_NO_ENROLLED_INSTRUMENT to the |
Danyao Wang | 4bc0606a | 2018-12-27 16:54:53 | [diff] [blame] | 182 | // renderer, depending on |has_enrolled_instrument| value. Does not check |
| 183 | // query quota so never sends QUERY_QUOTA_EXCEEDED. If |
| 184 | // |warn_localhost_or_file| is true, then sends |
Danyao Wang | ce175bf | 2018-12-21 22:35:58 | [diff] [blame] | 185 | // WARNING_HAS_ENROLLED_INSTRUMENT or WARNING_HAS_NO_ENROLLED_INSTRUMENT |
| 186 | // version of the values instead. |
| 187 | void RespondToHasEnrolledInstrumentQuery(bool has_enrolled_instrument, |
| 188 | bool warn_localhost_or_file); |
| 189 | |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 190 | content::WebContents* web_contents_; |
Danyao Wang | 1584079 | 2020-05-07 23:52:17 | [diff] [blame^] | 191 | const content::GlobalFrameRoutingId initiator_frame_routing_id_; |
Rouslan Solomakhin | 2706470 | 2018-12-14 21:15:33 | [diff] [blame] | 192 | DeveloperConsoleLogger log_; |
Rouslan Solomakhin | 4eea9bc2 | 2017-10-10 15:18:51 | [diff] [blame] | 193 | std::unique_ptr<ContentPaymentRequestDelegate> delegate_; |
mathp | f709499d | 2017-01-09 20:48:36 | [diff] [blame] | 194 | // |manager_| owns this PaymentRequest. |
| 195 | PaymentRequestWebContentsManager* manager_; |
Anthony Vallee-Dubois | c7ae733 | 2017-12-19 20:44:07 | [diff] [blame] | 196 | PaymentRequestDisplayManager* display_manager_; |
| 197 | std::unique_ptr<PaymentRequestDisplayManager::DisplayHandle> display_handle_; |
Gyuyoung Kim | 9cfbda3 | 2019-08-27 02:15:18 | [diff] [blame] | 198 | mojo::Receiver<mojom::PaymentRequest> receiver_{this}; |
| 199 | mojo::Remote<mojom::PaymentRequestClient> client_; |
mathp | d4be8de8 | 2017-03-01 00:51:48 | [diff] [blame] | 200 | |
mathp | f1a7a375 | 2017-03-15 11:23:37 | [diff] [blame] | 201 | std::unique_ptr<PaymentRequestSpec> spec_; |
| 202 | std::unique_ptr<PaymentRequestState> state_; |
anthonyvd | 3d7f972 | 2016-12-07 18:43:54 | [diff] [blame] | 203 | |
Rouslan Solomakhin | a480efa | 2019-05-06 15:37:22 | [diff] [blame] | 204 | // The end-point for the payment handler renderer process to call into the |
| 205 | // browser process. |
Rouslan Solomakhin | 8e9f149b2 | 2019-05-10 17:43:02 | [diff] [blame] | 206 | PaymentHandlerHost payment_handler_host_; |
Rouslan Solomakhin | a480efa | 2019-05-06 15:37:22 | [diff] [blame] | 207 | |
Rouslan Solomakhin | c71cca62 | 2020-01-31 22:15:35 | [diff] [blame] | 208 | // The scheme, host, and port of the top level frame that has invoked |
| 209 | // PaymentRequest API as formatted by |
| 210 | // url_formatter::FormatUrlForSecurityDisplay(). This is what the user sees in |
| 211 | // the address bar. |
Rouslan Solomakhin | 6e979ab | 2017-08-30 17:30:39 | [diff] [blame] | 212 | const GURL top_level_origin_; |
Rouslan Solomakhin | 115f723 | 2017-08-01 15:24:38 | [diff] [blame] | 213 | |
Rouslan Solomakhin | c71cca62 | 2020-01-31 22:15:35 | [diff] [blame] | 214 | // The scheme, host, and port of the frame that has invoked PaymentRequest API |
| 215 | // as formatted by url_formatter::FormatUrlForSecurityDisplay(). This can be |
| 216 | // either the main frame or an iframe. |
Rouslan Solomakhin | 6e979ab | 2017-08-30 17:30:39 | [diff] [blame] | 217 | const GURL frame_origin_; |
rouslan | 69099768 | 2017-05-09 18:07:39 | [diff] [blame] | 218 | |
Rouslan Solomakhin | c71cca62 | 2020-01-31 22:15:35 | [diff] [blame] | 219 | // The security origin of the frame that has invoked PaymentRequest API. This |
| 220 | // can be opaque. Used by security features like 'Sec-Fetch-Site' and |
| 221 | // 'Cross-Origin-Resource-Policy'. |
| 222 | const url::Origin frame_security_origin_; |
| 223 | |
mathp | 300fa54 | 2017-03-27 19:29:37 | [diff] [blame] | 224 | // May be null, must outlive this object. |
| 225 | ObserverForTest* observer_for_testing_; |
| 226 | |
sebsg | 20b49d7b | 2017-05-04 20:23:17 | [diff] [blame] | 227 | JourneyLogger journey_logger_; |
| 228 | |
sebsg | fcdd13c | 2017-06-08 15:49:33 | [diff] [blame] | 229 | // Whether a completion was already recorded for this Payment Request. |
| 230 | bool has_recorded_completion_ = false; |
sebsg | 2c8558a | 2017-05-17 18:54:10 | [diff] [blame] | 231 | |
Rouslan Solomakhin | 833f851 | 2018-04-03 23:19:25 | [diff] [blame] | 232 | // Whether PaymentRequest.show() was invoked with a user gesture. |
| 233 | bool is_show_user_gesture_ = false; |
| 234 | |
gogerald | 2ddfc64c | 2018-08-23 16:20:21 | [diff] [blame] | 235 | // Whether PaymentRequest.show() was invoked by skipping payment request UI. |
| 236 | bool skipped_payment_request_ui_ = false; |
| 237 | |
Rouslan Solomakhin | 2706470 | 2018-12-14 21:15:33 | [diff] [blame] | 238 | // Whether PaymentRequest mojo connection has been initialized from the |
| 239 | // renderer. |
| 240 | bool is_initialized_ = false; |
| 241 | |
| 242 | // Whether PaymentRequest.show() has been called. |
| 243 | bool is_show_called_ = false; |
| 244 | |
Rouslan Solomakhin | 55db827 | 2019-06-25 18:16:28 | [diff] [blame] | 245 | // If not empty, use this error message for rejecting PaymentRequest.show(). |
Rouslan Solomakhin | 68429b7 | 2019-06-27 15:12:39 | [diff] [blame] | 246 | std::string reject_show_error_message_; |
Rouslan Solomakhin | 55db827 | 2019-06-25 18:16:28 | [diff] [blame] | 247 | |
Jeremy Roman | 5c341f6d | 2019-07-15 15:56:10 | [diff] [blame] | 248 | base::WeakPtrFactory<PaymentRequest> weak_ptr_factory_{this}; |
Anthony Vallee-Dubois | dc1dbf1a | 2017-07-17 15:01:13 | [diff] [blame] | 249 | |
mathp | f709499d | 2017-01-09 20:48:36 | [diff] [blame] | 250 | DISALLOW_COPY_AND_ASSIGN(PaymentRequest); |
krb | 7f6421b | 2016-11-18 17:46:21 | [diff] [blame] | 251 | }; |
| 252 | |
| 253 | } // namespace payments |
| 254 | |
rouslan | 908248c | 2017-02-27 21:30:24 | [diff] [blame] | 255 | #endif // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_H_ |