blob: 4a487718bdae5d962f4a0a6c810aff041231e84a [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2020 The Chromium Authors
DongJun Kimcdd6f592020-09-23 20:13:222// 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 Falkenhagendde7e5252021-09-10 02:41:188#include "content/browser/payments/payment_event_dispatcher.h"
DongJun Kimcdd6f592020-09-23 20:13:229
10namespace content {
11
12namespace {
13
14using payments::mojom::CanMakePaymentEventResponseType;
15using payments::mojom::CanMakePaymentResponsePtr;
16using payments::mojom::PaymentEventResponseType;
17using payments::mojom::PaymentHandlerResponseCallback;
18using payments::mojom::PaymentHandlerResponsePtr;
19
DongJun Kimcdd6f592020-09-23 20:13:2220} // namespace
21
22mojo::PendingRemote<PaymentHandlerResponseCallback>
23RespondWithCallback::BindNewPipeAndPassRemote() {
24 return receiver_.BindNewPipeAndPassRemote();
25}
26
27RespondWithCallback::RespondWithCallback(
DongJun Kimcdd6f592020-09-23 20:13:2228 ServiceWorkerMetrics::EventType event_type,
29 scoped_refptr<ServiceWorkerVersion> service_worker_version,
Matt Falkenhagendde7e5252021-09-10 02:41:1830 base::WeakPtr<PaymentEventDispatcher> event_dispatcher)
Dave Tapuska8eedbdd2021-07-08 16:02:0131 : service_worker_version_(service_worker_version),
DongJun Kimcdd6f592020-09-23 20:13:2232 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
38RespondWithCallback::~RespondWithCallback() = default;
39
40void RespondWithCallback::FinishServiceWorkerRequest() {
Ben Kellyd5307bec2020-10-07 14:13:0741 service_worker_version_->FinishRequest(request_id_, /*was_handled=*/false);
DongJun Kimcdd6f592020-09-23 20:13:2242}
43
DongJun Kimcdd6f592020-09-23 20:13:2244void RespondWithCallback::ClearRespondWithCallbackAndCloseWindow() {
Matt Falkenhagendde7e5252021-09-10 02:41:1845 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:2246 if (!event_dispatcher_)
47 return;
48
Matt Falkenhagendde7e5252021-09-10 02:41:1849 if (base::WeakPtr<PaymentAppProviderImpl> provider =
50 event_dispatcher_->payment_app_provider())
51 provider->CloseOpenedWindow();
DongJun Kimcdd6f592020-09-23 20:13:2252
53 event_dispatcher_->ResetRespondWithCallback();
54}
55
56CanMakePaymentRespondWithCallback::CanMakePaymentRespondWithCallback(
DongJun Kimcdd6f592020-09-23 20:13:2257 scoped_refptr<ServiceWorkerVersion> service_worker_version,
Matt Falkenhagendde7e5252021-09-10 02:41:1858 base::WeakPtr<PaymentEventDispatcher> event_dispatcher,
DongJun Kimcdd6f592020-09-23 20:13:2259 PaymentAppProvider::CanMakePaymentCallback callback)
Dave Tapuska8eedbdd2021-07-08 16:02:0160 : RespondWithCallback(ServiceWorkerMetrics::EventType::CAN_MAKE_PAYMENT,
DongJun Kimcdd6f592020-09-23 20:13:2261 service_worker_version,
62 event_dispatcher),
63 callback_(std::move(callback)) {}
64
65CanMakePaymentRespondWithCallback::~CanMakePaymentRespondWithCallback() =
66 default;
67
68void CanMakePaymentRespondWithCallback::OnResponseForCanMakePayment(
69 CanMakePaymentResponsePtr response) {
Matt Falkenhagendde7e5252021-09-10 02:41:1870 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:2271 FinishServiceWorkerRequest();
Matt Falkenhagendde7e5252021-09-10 02:41:1872 std::move(callback_).Run(std::move(response));
DongJun Kimcdd6f592020-09-23 20:13:2273 delete this;
74}
75
76void CanMakePaymentRespondWithCallback::OnServiceWorkerError(
77 blink::ServiceWorkerStatusCode service_worker_status) {
Matt Falkenhagendde7e5252021-09-10 02:41:1878 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:2279 DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk);
DongJun Kimcdd6f592020-09-23 20:13:2280
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 Falkenhagendde7e5252021-09-10 02:41:1891 std::move(callback_).Run(
92 content::PaymentAppProviderUtil::CreateBlankCanMakePaymentResponse(
93 response_type));
DongJun Kimcdd6f592020-09-23 20:13:2294 delete this;
95}
96
97InvokeRespondWithCallback::InvokeRespondWithCallback(
DongJun Kimcdd6f592020-09-23 20:13:2298 scoped_refptr<ServiceWorkerVersion> service_worker_version,
Matt Falkenhagendde7e5252021-09-10 02:41:1899 base::WeakPtr<PaymentEventDispatcher> event_dispatcher,
DongJun Kimcdd6f592020-09-23 20:13:22100 PaymentAppProvider::InvokePaymentAppCallback callback)
Dave Tapuska8eedbdd2021-07-08 16:02:01101 : RespondWithCallback(ServiceWorkerMetrics::EventType::PAYMENT_REQUEST,
DongJun Kimcdd6f592020-09-23 20:13:22102 service_worker_version,
103 event_dispatcher),
104 callback_(std::move(callback)) {}
105
106void InvokeRespondWithCallback::AbortPaymentSinceOpennedWindowClosing(
107 PaymentEventResponseType reason) {
Matt Falkenhagendde7e5252021-09-10 02:41:18108 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:22109
110 FinishServiceWorkerRequest();
111 RespondToPaymentRequestWithErrorAndDeleteSelf(reason);
112}
113
114InvokeRespondWithCallback::~InvokeRespondWithCallback() = default;
115
116void InvokeRespondWithCallback::OnResponseForPaymentRequest(
117 PaymentHandlerResponsePtr response) {
Matt Falkenhagendde7e5252021-09-10 02:41:18118 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:22119 FinishServiceWorkerRequest();
Matt Falkenhagendde7e5252021-09-10 02:41:18120 std::move(callback_).Run(std::move(response));
DongJun Kimcdd6f592020-09-23 20:13:22121 ClearRespondWithCallbackAndCloseWindow();
122}
123
124void InvokeRespondWithCallback::OnServiceWorkerError(
125 blink::ServiceWorkerStatusCode service_worker_status) {
Matt Falkenhagendde7e5252021-09-10 02:41:18126 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:22127 DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk);
DongJun Kimcdd6f592020-09-23 20:13:22128
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
142void InvokeRespondWithCallback::RespondToPaymentRequestWithErrorAndDeleteSelf(
143 PaymentEventResponseType response_type) {
Matt Falkenhagendde7e5252021-09-10 02:41:18144 DCHECK_CURRENTLY_ON(BrowserThread::UI);
145 std::move(callback_).Run(
146 content::PaymentAppProviderUtil::CreateBlankPaymentHandlerResponse(
147 response_type));
DongJun Kimcdd6f592020-09-23 20:13:22148 ClearRespondWithCallbackAndCloseWindow();
149}
150
151AbortRespondWithCallback::AbortRespondWithCallback(
DongJun Kimcdd6f592020-09-23 20:13:22152 scoped_refptr<ServiceWorkerVersion> service_worker_version,
Matt Falkenhagendde7e5252021-09-10 02:41:18153 base::WeakPtr<PaymentEventDispatcher> event_dispatcher,
DongJun Kimcdd6f592020-09-23 20:13:22154 PaymentAppProvider::AbortCallback callback)
Dave Tapuska8eedbdd2021-07-08 16:02:01155 : RespondWithCallback(ServiceWorkerMetrics::EventType::ABORT_PAYMENT,
DongJun Kimcdd6f592020-09-23 20:13:22156 service_worker_version,
157 event_dispatcher),
158 callback_(std::move(callback)) {}
159
160AbortRespondWithCallback::~AbortRespondWithCallback() = default;
161
162// PaymentHandlerResponseCallback implementation.
163void AbortRespondWithCallback::OnResponseForAbortPayment(bool payment_aborted) {
Matt Falkenhagendde7e5252021-09-10 02:41:18164 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:22165 FinishServiceWorkerRequest();
Matt Falkenhagendde7e5252021-09-10 02:41:18166 std::move(callback_).Run(payment_aborted);
DongJun Kimcdd6f592020-09-23 20:13:22167
168 if (payment_aborted)
169 ClearRespondWithCallbackAndCloseWindow();
170
171 delete this;
172}
173
174void AbortRespondWithCallback::OnServiceWorkerError(
175 blink::ServiceWorkerStatusCode service_worker_status) {
Matt Falkenhagendde7e5252021-09-10 02:41:18176 DCHECK_CURRENTLY_ON(BrowserThread::UI);
DongJun Kimcdd6f592020-09-23 20:13:22177 DCHECK_NE(service_worker_status, blink::ServiceWorkerStatusCode::kOk);
Matt Falkenhagendde7e5252021-09-10 02:41:18178 std::move(callback_).Run(/*payment_aborted=*/false);
DongJun Kimcdd6f592020-09-23 20:13:22179 // 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 Falkenhagendde7e5252021-09-10 02:41:18186} // namespace content