Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2020 The Chromium Authors |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/payments/respond_with_callback.h" |
| 6 | |
| 7 | #include "content/browser/payments/payment_app_provider_impl.h" |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 8 | #include "content/browser/payments/payment_event_dispatcher.h" |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 9 | |
| 10 | namespace content { |
| 11 | |
| 12 | namespace { |
| 13 | |
| 14 | using payments::mojom::CanMakePaymentEventResponseType; |
| 15 | using payments::mojom::CanMakePaymentResponsePtr; |
| 16 | using payments::mojom::PaymentEventResponseType; |
| 17 | using payments::mojom::PaymentHandlerResponseCallback; |
| 18 | using payments::mojom::PaymentHandlerResponsePtr; |
| 19 | |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 20 | } // namespace |
| 21 | |
| 22 | mojo::PendingRemote<PaymentHandlerResponseCallback> |
| 23 | RespondWithCallback::BindNewPipeAndPassRemote() { |
| 24 | return receiver_.BindNewPipeAndPassRemote(); |
| 25 | } |
| 26 | |
| 27 | RespondWithCallback::RespondWithCallback( |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 28 | ServiceWorkerMetrics::EventType event_type, |
| 29 | scoped_refptr<ServiceWorkerVersion> service_worker_version, |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 30 | base::WeakPtr<PaymentEventDispatcher> event_dispatcher) |
Dave Tapuska | 8eedbdd | 2021-07-08 16:02:01 | [diff] [blame] | 31 | : service_worker_version_(service_worker_version), |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 32 | event_dispatcher_(event_dispatcher) { |
| 33 | request_id_ = service_worker_version->StartRequest( |
| 34 | event_type, base::BindOnce(&RespondWithCallback::OnServiceWorkerError, |
| 35 | weak_ptr_factory_.GetWeakPtr())); |
| 36 | } |
| 37 | |
| 38 | RespondWithCallback::~RespondWithCallback() = default; |
| 39 | |
| 40 | void RespondWithCallback::FinishServiceWorkerRequest() { |
Ben Kelly | d5307bec | 2020-10-07 14:13:07 | [diff] [blame] | 41 | service_worker_version_->FinishRequest(request_id_, /*was_handled=*/false); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 42 | } |
| 43 | |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 44 | void RespondWithCallback::ClearRespondWithCallbackAndCloseWindow() { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 45 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 46 | if (!event_dispatcher_) |
| 47 | return; |
| 48 | |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 49 | if (base::WeakPtr<PaymentAppProviderImpl> provider = |
| 50 | event_dispatcher_->payment_app_provider()) |
| 51 | provider->CloseOpenedWindow(); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 52 | |
| 53 | event_dispatcher_->ResetRespondWithCallback(); |
| 54 | } |
| 55 | |
| 56 | CanMakePaymentRespondWithCallback::CanMakePaymentRespondWithCallback( |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 57 | scoped_refptr<ServiceWorkerVersion> service_worker_version, |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 58 | base::WeakPtr<PaymentEventDispatcher> event_dispatcher, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 59 | PaymentAppProvider::CanMakePaymentCallback callback) |
Dave Tapuska | 8eedbdd | 2021-07-08 16:02:01 | [diff] [blame] | 60 | : RespondWithCallback(ServiceWorkerMetrics::EventType::CAN_MAKE_PAYMENT, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 61 | service_worker_version, |
| 62 | event_dispatcher), |
| 63 | callback_(std::move(callback)) {} |
| 64 | |
| 65 | CanMakePaymentRespondWithCallback::~CanMakePaymentRespondWithCallback() = |
| 66 | default; |
| 67 | |
| 68 | void CanMakePaymentRespondWithCallback::OnResponseForCanMakePayment( |
| 69 | CanMakePaymentResponsePtr response) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 70 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 71 | FinishServiceWorkerRequest(); |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 72 | std::move(callback_).Run(std::move(response)); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 73 | delete this; |
| 74 | } |
| 75 | |
| 76 | void CanMakePaymentRespondWithCallback::OnServiceWorkerError( |
| 77 | blink::ServiceWorkerStatusCode service_worker_status) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 78 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 79 | DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 80 | |
| 81 | CanMakePaymentEventResponseType response_type = |
| 82 | CanMakePaymentEventResponseType::BROWSER_ERROR; |
| 83 | if (service_worker_status == |
| 84 | blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected) { |
| 85 | response_type = CanMakePaymentEventResponseType::REJECT; |
| 86 | } else if (service_worker_status == |
| 87 | blink::ServiceWorkerStatusCode::kErrorTimeout) { |
| 88 | response_type = CanMakePaymentEventResponseType::TIMEOUT; |
| 89 | } |
| 90 | |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 91 | std::move(callback_).Run( |
| 92 | content::PaymentAppProviderUtil::CreateBlankCanMakePaymentResponse( |
| 93 | response_type)); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 94 | delete this; |
| 95 | } |
| 96 | |
| 97 | InvokeRespondWithCallback::InvokeRespondWithCallback( |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 98 | scoped_refptr<ServiceWorkerVersion> service_worker_version, |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 99 | base::WeakPtr<PaymentEventDispatcher> event_dispatcher, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 100 | PaymentAppProvider::InvokePaymentAppCallback callback) |
Dave Tapuska | 8eedbdd | 2021-07-08 16:02:01 | [diff] [blame] | 101 | : RespondWithCallback(ServiceWorkerMetrics::EventType::PAYMENT_REQUEST, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 102 | service_worker_version, |
| 103 | event_dispatcher), |
| 104 | callback_(std::move(callback)) {} |
| 105 | |
| 106 | void InvokeRespondWithCallback::AbortPaymentSinceOpennedWindowClosing( |
| 107 | PaymentEventResponseType reason) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 108 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 109 | |
| 110 | FinishServiceWorkerRequest(); |
| 111 | RespondToPaymentRequestWithErrorAndDeleteSelf(reason); |
| 112 | } |
| 113 | |
| 114 | InvokeRespondWithCallback::~InvokeRespondWithCallback() = default; |
| 115 | |
| 116 | void InvokeRespondWithCallback::OnResponseForPaymentRequest( |
| 117 | PaymentHandlerResponsePtr response) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 118 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 119 | FinishServiceWorkerRequest(); |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 120 | std::move(callback_).Run(std::move(response)); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 121 | ClearRespondWithCallbackAndCloseWindow(); |
| 122 | } |
| 123 | |
| 124 | void InvokeRespondWithCallback::OnServiceWorkerError( |
| 125 | blink::ServiceWorkerStatusCode service_worker_status) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 126 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 127 | DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 128 | |
| 129 | PaymentEventResponseType response_type = |
| 130 | PaymentEventResponseType::PAYMENT_EVENT_BROWSER_ERROR; |
| 131 | if (service_worker_status == |
| 132 | blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected) { |
| 133 | response_type = PaymentEventResponseType::PAYMENT_EVENT_REJECT; |
| 134 | } else if (service_worker_status == |
| 135 | blink::ServiceWorkerStatusCode::kErrorTimeout) { |
| 136 | response_type = PaymentEventResponseType::PAYMENT_EVENT_TIMEOUT; |
| 137 | } |
| 138 | |
| 139 | RespondToPaymentRequestWithErrorAndDeleteSelf(response_type); |
| 140 | } |
| 141 | |
| 142 | void InvokeRespondWithCallback::RespondToPaymentRequestWithErrorAndDeleteSelf( |
| 143 | PaymentEventResponseType response_type) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 144 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 145 | std::move(callback_).Run( |
| 146 | content::PaymentAppProviderUtil::CreateBlankPaymentHandlerResponse( |
| 147 | response_type)); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 148 | ClearRespondWithCallbackAndCloseWindow(); |
| 149 | } |
| 150 | |
| 151 | AbortRespondWithCallback::AbortRespondWithCallback( |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 152 | scoped_refptr<ServiceWorkerVersion> service_worker_version, |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 153 | base::WeakPtr<PaymentEventDispatcher> event_dispatcher, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 154 | PaymentAppProvider::AbortCallback callback) |
Dave Tapuska | 8eedbdd | 2021-07-08 16:02:01 | [diff] [blame] | 155 | : RespondWithCallback(ServiceWorkerMetrics::EventType::ABORT_PAYMENT, |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 156 | service_worker_version, |
| 157 | event_dispatcher), |
| 158 | callback_(std::move(callback)) {} |
| 159 | |
| 160 | AbortRespondWithCallback::~AbortRespondWithCallback() = default; |
| 161 | |
| 162 | // PaymentHandlerResponseCallback implementation. |
| 163 | void AbortRespondWithCallback::OnResponseForAbortPayment(bool payment_aborted) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 164 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 165 | FinishServiceWorkerRequest(); |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 166 | std::move(callback_).Run(payment_aborted); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 167 | |
| 168 | if (payment_aborted) |
| 169 | ClearRespondWithCallbackAndCloseWindow(); |
| 170 | |
| 171 | delete this; |
| 172 | } |
| 173 | |
| 174 | void AbortRespondWithCallback::OnServiceWorkerError( |
| 175 | blink::ServiceWorkerStatusCode service_worker_status) { |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 176 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 177 | DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk); |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 178 | std::move(callback_).Run(/*payment_aborted=*/false); |
DongJun Kim | cdd6f59 | 2020-09-23 20:13:22 | [diff] [blame] | 179 | // Do not call ClearRespondWithCallbackAndCloseWindow() here, because payment |
| 180 | // has not been aborted. The service worker either rejected, timed out, or |
| 181 | // threw a JavaScript exception in the "abortpayment" event, but that does |
| 182 | // not affect the ongoing "paymentrequest" event. |
| 183 | delete this; |
| 184 | } |
| 185 | |
Matt Falkenhagen | dde7e525 | 2021-09-10 02:41:18 | [diff] [blame] | 186 | } // namespace content |