blob: 680df0a0f93ad471d640d2bad04ab52e8c5bce4f [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2016 The Chromium Authors
jinho.bangab430572016-12-16 14:33:582// 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/payment_app_database.h"
6
jinho.bangf7742a22017-05-04 01:31:597#include <map>
jinho.bangab430572016-12-16 14:33:588#include <utility>
9
gogeraldd8c5af342017-06-14 02:22:3610#include "base/base64.h"
Lei Zhangd4f2c7ad2021-05-13 20:10:1211#include "base/containers/contains.h"
Avi Drissmanadac21992023-01-11 23:46:3912#include "base/functional/bind.h"
Jinho Bang850aa4842017-09-20 02:03:1913#include "base/strings/utf_string_conversions.h"
jinho.bangf7742a22017-05-04 01:31:5914#include "base/time/time.h"
jinho.bangab430572016-12-16 14:33:5815#include "content/browser/payments/payment_app.pb.h"
16#include "content/browser/payments/payment_app_context_impl.h"
17#include "content/browser/service_worker/service_worker_context_wrapper.h"
18#include "content/browser/service_worker/service_worker_registration.h"
19#include "content/public/browser/browser_thread.h"
Dmitry Gozman88ca5a992018-05-18 00:13:3320#include "third_party/blink/public/common/manifest/manifest.h"
Steven Binglerfdc1ded2021-05-27 19:02:1521#include "third_party/blink/public/common/storage_key/storage_key.h"
gogeraldd8c5af342017-06-14 02:22:3622#include "third_party/skia/include/core/SkBitmap.h"
gogerald7b13c532018-08-24 19:37:1523#include "ui/gfx/codec/png_codec.h"
gogerald70b9dcb2017-07-05 05:28:4924#include "url/gurl.h"
25#include "url/origin.h"
jinho.bangab430572016-12-16 14:33:5826
27namespace content {
28namespace {
29
Sahel Sharify1a149fbd2019-09-11 01:25:4430using ::payments::mojom::PaymentDelegation;
jinho.bang0e7bbf12017-04-17 17:03:0331using ::payments::mojom::PaymentHandlerStatus;
32using ::payments::mojom::PaymentInstrument;
33using ::payments::mojom::PaymentInstrumentPtr;
34
gogerald70b9dcb2017-07-05 05:28:4935const char kPaymentAppPrefix[] = "PaymentApp:";
jinho.bangf7742a22017-05-04 01:31:5936const char kPaymentInstrumentPrefix[] = "PaymentInstrument:";
37const char kPaymentInstrumentKeyInfoPrefix[] = "PaymentInstrumentKeyInfo:";
jinho.bange052a49f2017-04-27 17:56:5838
gogerald29b88092017-08-03 15:22:1939// |pattern| is the scope URL of the service worker registration.
40std::string CreatePaymentAppKey(const std::string& pattern) {
41 return kPaymentAppPrefix + pattern;
gogerald70b9dcb2017-07-05 05:28:4942}
43
jinho.bange052a49f2017-04-27 17:56:5844std::string CreatePaymentInstrumentKey(const std::string& instrument_key) {
jinho.bangf7742a22017-05-04 01:31:5945 return kPaymentInstrumentPrefix + instrument_key;
46}
47
48std::string CreatePaymentInstrumentKeyInfoKey(
49 const std::string& instrument_key) {
50 return kPaymentInstrumentKeyInfoPrefix + instrument_key;
jinho.bange052a49f2017-04-27 17:56:5851}
jinho.bangab430572016-12-16 14:33:5852
jinho.bang5f5a9b492017-05-13 07:55:1353std::map<uint64_t, std::string> ToStoredPaymentInstrumentKeyInfos(
jinho.bangf7742a22017-05-04 01:31:5954 const std::vector<std::string>& inputs) {
55 std::map<uint64_t, std::string> key_info;
56 for (const auto& input : inputs) {
jinho.bang5f5a9b492017-05-13 07:55:1357 StoredPaymentInstrumentKeyInfoProto key_info_proto;
jinho.bangf7742a22017-05-04 01:31:5958 if (!key_info_proto.ParseFromString(input))
59 return std::map<uint64_t, std::string>();
60
61 key_info.insert(std::pair<uint64_t, std::string>(
62 key_info_proto.insertion_order(), key_info_proto.key()));
63 }
64
65 return key_info;
66}
67
jinho.bang5f5a9b492017-05-13 07:55:1368PaymentInstrumentPtr ToPaymentInstrumentForMojo(const std::string& input) {
69 StoredPaymentInstrumentProto instrument_proto;
jinho.bang0e7bbf12017-04-17 17:03:0370 if (!instrument_proto.ParseFromString(input))
71 return nullptr;
72
73 PaymentInstrumentPtr instrument = PaymentInstrument::New();
74 instrument->name = instrument_proto.name();
Jinho Bang850aa4842017-09-20 02:03:1975 for (const auto& icon_proto : instrument_proto.icons()) {
Rayan Kanso393cb2232018-06-06 09:34:0576 blink::Manifest::ImageResource icon;
Jinho Bang850aa4842017-09-20 02:03:1977 icon.src = GURL(icon_proto.src());
78 icon.type = base::UTF8ToUTF16(icon_proto.type());
79 for (const auto& size_proto : icon_proto.sizes()) {
80 icon.sizes.emplace_back(size_proto.width(), size_proto.height());
81 }
82 instrument->icons.emplace_back(icon);
gogeraldd8c5af342017-06-14 02:22:3683 }
Jinho Bang91dc1b52018-04-06 12:34:3884 instrument->method = instrument_proto.method();
jinho.bang0e7bbf12017-04-17 17:03:0385
86 return instrument;
87}
88
Sahel Sharify9edd7402019-10-11 20:57:0589SupportedDelegations ToSupportedDelegations(
Sahel Sharify1a149fbd2019-09-11 01:25:4490 const content::SupportedDelegationsProto& supported_delegations_proto) {
Sahel Sharify9edd7402019-10-11 20:57:0591 SupportedDelegations supported_delegations;
Sahel Sharify1a149fbd2019-09-11 01:25:4492 if (supported_delegations_proto.has_shipping_address()) {
93 supported_delegations.shipping_address =
94 supported_delegations_proto.shipping_address();
95 }
96 if (supported_delegations_proto.has_payer_name()) {
97 supported_delegations.payer_name = supported_delegations_proto.payer_name();
98 }
99 if (supported_delegations_proto.has_payer_email()) {
100 supported_delegations.payer_email =
101 supported_delegations_proto.payer_email();
102 }
103 if (supported_delegations_proto.has_payer_phone()) {
104 supported_delegations.payer_phone =
105 supported_delegations_proto.payer_phone();
106 }
107
108 return supported_delegations;
109}
110
gogerald70b9dcb2017-07-05 05:28:49111std::unique_ptr<StoredPaymentApp> ToStoredPaymentApp(const std::string& input) {
112 StoredPaymentAppProto app_proto;
113 if (!app_proto.ParseFromString(input))
Lei Zhangdf291f62021-04-14 17:23:44114 return nullptr;
gogerald70b9dcb2017-07-05 05:28:49115
Jeremy Roman04f27c372017-10-27 15:20:55116 std::unique_ptr<StoredPaymentApp> app = std::make_unique<StoredPaymentApp>();
gogerald70b9dcb2017-07-05 05:28:49117 app->registration_id = app_proto.registration_id();
gogerald9a8cdc42017-08-24 22:36:54118 app->scope = GURL(app_proto.scope());
gogerald70b9dcb2017-07-05 05:28:49119 app->name = app_proto.name();
gogeraldc85db412017-08-07 23:46:42120 app->prefer_related_applications = app_proto.prefer_related_applications();
121 for (const auto& related_app : app_proto.related_applications()) {
122 app->related_applications.emplace_back(StoredRelatedApplication());
123 app->related_applications.back().platform = related_app.platform();
124 app->related_applications.back().id = related_app.id();
125 }
gogeraldbc03a52bf2017-09-05 02:31:42126 app->user_hint = app_proto.user_hint();
Sahel Sharify1a149fbd2019-09-11 01:25:44127 app->supported_delegations =
Sahel Sharify9edd7402019-10-11 20:57:05128 ToSupportedDelegations(app_proto.supported_delegations());
gogerald70b9dcb2017-07-05 05:28:49129
130 if (!app_proto.icon().empty()) {
Avi Drissman02553b82024-10-16 16:14:16131 std::optional<std::vector<uint8_t>> icon_raw_data =
132 base::Base64Decode(app_proto.icon());
gogerald7b13c532018-08-24 19:37:15133 app->icon = std::make_unique<SkBitmap>();
gogerald70b9dcb2017-07-05 05:28:49134 // Note that the icon has been decoded to PNG raw data regardless of the
135 // original icon format that was downloaded.
Avi Drissman02553b82024-10-16 16:14:16136 *app->icon = gfx::PNGCodec::Decode(icon_raw_data.value());
137 CHECK(!app->icon->isNull());
gogerald70b9dcb2017-07-05 05:28:49138 }
139
140 return app;
141}
142
jinho.bangab430572016-12-16 14:33:58143} // namespace
144
145PaymentAppDatabase::PaymentAppDatabase(
146 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context)
Jeremy Roman3bca4bf2019-07-11 03:41:25147 : service_worker_context_(service_worker_context) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21148 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangab430572016-12-16 14:33:58149}
150
151PaymentAppDatabase::~PaymentAppDatabase() {
Matt Falkenhagendb5d03e2021-09-28 10:14:21152 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangab430572016-12-16 14:33:58153}
154
jinho.bang5f5a9b492017-05-13 07:55:13155void PaymentAppDatabase::ReadAllPaymentApps(
156 ReadAllPaymentAppsCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bang5f5a9b492017-05-13 07:55:13158
159 service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix(
tzikff02d282018-02-22 06:11:08160 kPaymentAppPrefix,
161 base::BindOnce(&PaymentAppDatabase::DidReadAllPaymentApps,
tzik983fb232018-04-06 15:47:50162 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bang5f5a9b492017-05-13 07:55:13163}
164
jinho.bangbd27d5f2017-04-26 12:09:34165void PaymentAppDatabase::DeletePaymentInstrument(
166 const GURL& scope,
167 const std::string& instrument_key,
168 DeletePaymentInstrumentCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21169 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangbd27d5f2017-04-26 12:09:34170
Alison Gale770f3fc2024-04-27 00:39:58171 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21172 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00173 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57174 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08175 base::BindOnce(
jinho.bangbd27d5f2017-04-26 12:09:34176 &PaymentAppDatabase::DidFindRegistrationToDeletePaymentInstrument,
tzik983fb232018-04-06 15:47:50177 weak_ptr_factory_.GetWeakPtr(), instrument_key, std::move(callback)));
jinho.bangbd27d5f2017-04-26 12:09:34178}
179
jinho.bang0e7bbf12017-04-17 17:03:03180void PaymentAppDatabase::ReadPaymentInstrument(
181 const GURL& scope,
jinho.bangbd27d5f2017-04-26 12:09:34182 const std::string& instrument_key,
jinho.bang0e7bbf12017-04-17 17:03:03183 ReadPaymentInstrumentCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21184 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bang0e7bbf12017-04-17 17:03:03185
Alison Gale770f3fc2024-04-27 00:39:58186 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21187 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00188 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57189 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08190 base::BindOnce(
jinho.bang0e7bbf12017-04-17 17:03:03191 &PaymentAppDatabase::DidFindRegistrationToReadPaymentInstrument,
tzik983fb232018-04-06 15:47:50192 weak_ptr_factory_.GetWeakPtr(), instrument_key, std::move(callback)));
jinho.bang0e7bbf12017-04-17 17:03:03193}
194
jinho.bangf7742a22017-05-04 01:31:59195void PaymentAppDatabase::KeysOfPaymentInstruments(
196 const GURL& scope,
197 KeysOfPaymentInstrumentsCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21198 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangf7742a22017-05-04 01:31:59199
Alison Gale770f3fc2024-04-27 00:39:58200 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21201 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00202 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57203 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzik983fb232018-04-06 15:47:50204 base::BindOnce(&PaymentAppDatabase::DidFindRegistrationToGetKeys,
205 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bangf7742a22017-05-04 01:31:59206}
207
jinho.bang8f5656542017-04-27 16:15:20208void PaymentAppDatabase::HasPaymentInstrument(
209 const GURL& scope,
210 const std::string& instrument_key,
211 HasPaymentInstrumentCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21212 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bang8f5656542017-04-27 16:15:20213
Alison Gale770f3fc2024-04-27 00:39:58214 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21215 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00216 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57217 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzik983fb232018-04-06 15:47:50218 base::BindOnce(
219 &PaymentAppDatabase::DidFindRegistrationToHasPaymentInstrument,
220 weak_ptr_factory_.GetWeakPtr(), instrument_key, std::move(callback)));
jinho.bang8f5656542017-04-27 16:15:20221}
222
jinho.bang0e7bbf12017-04-17 17:03:03223void PaymentAppDatabase::WritePaymentInstrument(
224 const GURL& scope,
jinho.bangbd27d5f2017-04-26 12:09:34225 const std::string& instrument_key,
jinho.bang0e7bbf12017-04-17 17:03:03226 PaymentInstrumentPtr instrument,
227 WritePaymentInstrumentCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21228 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bang0e7bbf12017-04-17 17:03:03229
Alison Gale770f3fc2024-04-27 00:39:58230 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21231 // implements StorageKey.
gogeraldd8c5af342017-06-14 02:22:36232 if (instrument->icons.size() > 0) {
Rayan Kanso393cb2232018-06-06 09:34:05233 std::vector<blink::Manifest::ImageResource> icons(instrument->icons);
Jinho Bang55bacf12017-09-13 10:45:30234 PaymentInstrumentIconFetcher::Start(
Hiroki Nakagawa0bbc0622019-12-02 03:28:17235 scope,
236 service_worker_context_->GetWindowClientFrameRoutingIds(
Ari Chivukulac81e13e2023-02-15 20:44:57237 blink::StorageKey::CreateFirstParty(url::Origin::Create(scope))),
Jinho Bang850aa4842017-09-20 02:03:19238 icons,
tzik9ebf61b32017-08-23 13:05:40239 base::BindOnce(&PaymentAppDatabase::DidFetchedPaymentInstrumentIcon,
240 weak_ptr_factory_.GetWeakPtr(), scope, instrument_key,
tzikccf160c2018-02-20 12:43:13241 std::move(instrument), std::move(callback)));
gogeraldd8c5af342017-06-14 02:22:36242 } else {
Zhuoyu Qian2266251f2018-10-13 02:59:00243 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57244 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08245 base::BindOnce(
gogeraldd8c5af342017-06-14 02:22:36246 &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
247 weak_ptr_factory_.GetWeakPtr(), instrument_key,
tzik983fb232018-04-06 15:47:50248 std::move(instrument), std::string(), std::move(callback)));
gogeraldd8c5af342017-06-14 02:22:36249 }
250}
251
252void PaymentAppDatabase::DidFetchedPaymentInstrumentIcon(
253 const GURL& scope,
254 const std::string& instrument_key,
255 payments::mojom::PaymentInstrumentPtr instrument,
256 WritePaymentInstrumentCallback callback,
257 const std::string& icon) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21258 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogeraldd8c5af342017-06-14 02:22:36259
gogeraldd8c5af342017-06-14 02:22:36260 if (icon.empty()) {
261 std::move(callback).Run(PaymentHandlerStatus::FETCH_INSTRUMENT_ICON_FAILED);
262 return;
263 }
264
Alison Gale770f3fc2024-04-27 00:39:58265 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21266 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00267 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57268 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08269 base::BindOnce(
jinho.bang0e7bbf12017-04-17 17:03:03270 &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
tzik983fb232018-04-06 15:47:50271 weak_ptr_factory_.GetWeakPtr(), instrument_key, std::move(instrument),
272 icon, std::move(callback)));
jinho.bang0e7bbf12017-04-17 17:03:03273}
274
gogerald3ce93992018-04-02 21:28:53275void PaymentAppDatabase::FetchAndUpdatePaymentAppInfo(
gogerald70b9dcb2017-07-05 05:28:49276 const GURL& context,
277 const GURL& scope,
gogerald3ce93992018-04-02 21:28:53278 FetchAndUpdatePaymentAppInfoCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21279 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald70b9dcb2017-07-05 05:28:49280
Jinho Bangfd61042af2017-12-19 16:59:23281 PaymentAppInfoFetcher::Start(
gogerald70b9dcb2017-07-05 05:28:49282 context, service_worker_context_,
283 base::BindOnce(&PaymentAppDatabase::FetchPaymentAppInfoCallback,
gogerald3ce93992018-04-02 21:28:53284 weak_ptr_factory_.GetWeakPtr(), scope,
gogerald70b9dcb2017-07-05 05:28:49285 std::move(callback)));
286}
287
288void PaymentAppDatabase::FetchPaymentAppInfoCallback(
289 const GURL& scope,
gogerald3ce93992018-04-02 21:28:53290 FetchAndUpdatePaymentAppInfoCallback callback,
gogeraldc85db412017-08-07 23:46:42291 std::unique_ptr<PaymentAppInfoFetcher::PaymentAppInfo> app_info) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21292 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald70b9dcb2017-07-05 05:28:49293
Alison Gale770f3fc2024-04-27 00:39:58294 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21295 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00296 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57297 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
Steven Bingler0a17038b2021-05-20 02:47:21298 base::BindOnce(
299 &PaymentAppDatabase::DidFindRegistrationToUpdatePaymentAppInfo,
300 weak_ptr_factory_.GetWeakPtr(), std::move(callback),
301 std::move(app_info)));
gogerald70b9dcb2017-07-05 05:28:49302}
303
gogerald3ce93992018-04-02 21:28:53304void PaymentAppDatabase::DidFindRegistrationToUpdatePaymentAppInfo(
305 FetchAndUpdatePaymentAppInfoCallback callback,
gogeraldc85db412017-08-07 23:46:42306 std::unique_ptr<PaymentAppInfoFetcher::PaymentAppInfo> app_info,
Han Leon90aedd862018-06-27 02:13:06307 blink::ServiceWorkerStatusCode status,
gogerald70b9dcb2017-07-05 05:28:49308 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21309 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02310 if (status != blink::ServiceWorkerStatusCode::kOk) {
gogerald70b9dcb2017-07-05 05:28:49311 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
312 return;
313 }
314
gogerald3ce93992018-04-02 21:28:53315 service_worker_context_->GetRegistrationUserDataByKeyPrefix(
Zhuoyu Qian2266251f2018-10-13 02:59:00316 registration->id(), CreatePaymentAppKey(registration->scope().spec()),
gogerald3ce93992018-04-02 21:28:53317 base::BindOnce(
318 &PaymentAppDatabase::DidGetPaymentAppInfoToUpdatePaymentAppInfo,
tzik983fb232018-04-06 15:47:50319 weak_ptr_factory_.GetWeakPtr(), std::move(callback),
320 std::move(app_info), registration));
gogerald3ce93992018-04-02 21:28:53321}
322
323void PaymentAppDatabase::DidGetPaymentAppInfoToUpdatePaymentAppInfo(
324 FetchAndUpdatePaymentAppInfoCallback callback,
325 std::unique_ptr<PaymentAppInfoFetcher::PaymentAppInfo> app_info,
326 scoped_refptr<ServiceWorkerRegistration> registration,
327 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06328 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21329 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02330 if (status != blink::ServiceWorkerStatusCode::kOk) {
gogerald3ce93992018-04-02 21:28:53331 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
332 return;
333 }
334
335 DCHECK_LE(data.size(), 1U);
gogerald70b9dcb2017-07-05 05:28:49336 StoredPaymentAppProto payment_app_proto;
gogerald3ce93992018-04-02 21:28:53337 if (data.size() == 1U) {
338 payment_app_proto.ParseFromString(data[0]);
339 }
gogerald70b9dcb2017-07-05 05:28:49340 payment_app_proto.set_registration_id(registration->id());
Zhuoyu Qian2266251f2018-10-13 02:59:00341 payment_app_proto.set_scope(registration->scope().spec());
gogerald3ce93992018-04-02 21:28:53342 // Do not override name and icon if they are invalid.
343 if (!app_info->name.empty()) {
344 payment_app_proto.set_name(app_info->name);
345 }
346 if (!app_info->icon.empty()) {
347 payment_app_proto.set_icon(app_info->icon);
348 }
gogeraldc85db412017-08-07 23:46:42349 payment_app_proto.set_prefer_related_applications(
350 app_info->prefer_related_applications);
351 for (const auto& related_app : app_info->related_applications) {
352 StoredRelatedApplicationProto* related_app_proto =
353 payment_app_proto.add_related_applications();
354 related_app_proto->set_platform(related_app.platform);
355 related_app_proto->set_id(related_app.id);
356 }
gogerald70b9dcb2017-07-05 05:28:49357
358 std::string serialized_payment_app;
359 bool success = payment_app_proto.SerializeToString(&serialized_payment_app);
360 DCHECK(success);
361
362 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59363 registration->id(), registration->key(),
Zhuoyu Qian2266251f2018-10-13 02:59:00364 {{CreatePaymentAppKey(registration->scope().spec()),
gogerald70b9dcb2017-07-05 05:28:49365 serialized_payment_app}},
tzik983fb232018-04-06 15:47:50366 base::BindOnce(&PaymentAppDatabase::DidUpdatePaymentApp,
367 weak_ptr_factory_.GetWeakPtr(), std::move(callback),
Nico Weber7237c57e2021-10-08 19:03:25368 app_info->name.empty() || app_info->icon.empty()));
gogerald70b9dcb2017-07-05 05:28:49369}
370
gogerald3ce93992018-04-02 21:28:53371void PaymentAppDatabase::DidUpdatePaymentApp(
372 FetchAndUpdatePaymentAppInfoCallback callback,
gogerald70b9dcb2017-07-05 05:28:49373 bool fetch_app_info_failed,
Han Leon90aedd862018-06-27 02:13:06374 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21375 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald70b9dcb2017-07-05 05:28:49376
377 PaymentHandlerStatus handler_status =
378 fetch_app_info_failed
379 ? PaymentHandlerStatus::FETCH_PAYMENT_APP_INFO_FAILED
380 : PaymentHandlerStatus::SUCCESS;
Han Leon51e125a2018-07-04 04:21:02381 handler_status = status == blink::ServiceWorkerStatusCode::kOk
gogerald70b9dcb2017-07-05 05:28:49382 ? handler_status
383 : PaymentHandlerStatus::STORAGE_OPERATION_FAILED;
384 return std::move(callback).Run(handler_status);
385}
386
jinho.bangaf28f772017-05-05 12:22:11387void PaymentAppDatabase::ClearPaymentInstruments(
388 const GURL& scope,
389 ClearPaymentInstrumentsCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21390 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangaf28f772017-05-05 12:22:11391
Alison Gale770f3fc2024-04-27 00:39:58392 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21393 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00394 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57395 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08396 base::BindOnce(
jinho.bangaf28f772017-05-05 12:22:11397 &PaymentAppDatabase::DidFindRegistrationToClearPaymentInstruments,
tzik983fb232018-04-06 15:47:50398 weak_ptr_factory_.GetWeakPtr(), scope, std::move(callback)));
jinho.bangaf28f772017-05-05 12:22:11399}
400
gogeraldbc03a52bf2017-09-05 02:31:42401void PaymentAppDatabase::SetPaymentAppUserHint(const GURL& scope,
402 const std::string& user_hint) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21403 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogeraldbc03a52bf2017-09-05 02:31:42404
Alison Gale770f3fc2024-04-27 00:39:58405 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21406 // implements StorageKey.
Zhuoyu Qian2266251f2018-10-13 02:59:00407 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57408 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
tzikff02d282018-02-22 06:11:08409 base::BindOnce(
gogeraldbc03a52bf2017-09-05 02:31:42410 &PaymentAppDatabase::DidFindRegistrationToSetPaymentAppUserHint,
411 weak_ptr_factory_.GetWeakPtr(), user_hint));
412}
413
Sahel Sharify1a149fbd2019-09-11 01:25:44414void PaymentAppDatabase::EnablePaymentAppDelegations(
415 const GURL& scope,
416 const std::vector<PaymentDelegation>& delegations,
417 EnableDelegationsCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21418 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Sahel Sharify1a149fbd2019-09-11 01:25:44419
Alison Gale770f3fc2024-04-27 00:39:58420 // TODO(crbug.com/40177656): Update this when PaymentManager
Steven Bingler0a17038b2021-05-20 02:47:21421 // implements StorageKey.
Sahel Sharify1a149fbd2019-09-11 01:25:44422 service_worker_context_->FindReadyRegistrationForScope(
Ari Chivukulac81e13e2023-02-15 20:44:57423 scope, blink::StorageKey::CreateFirstParty(url::Origin::Create(scope)),
Sahel Sharify1a149fbd2019-09-11 01:25:44424 base::BindOnce(
425 &PaymentAppDatabase::DidFindRegistrationToEnablePaymentAppDelegations,
426 weak_ptr_factory_.GetWeakPtr(), delegations, std::move(callback)));
427}
428
429void PaymentAppDatabase::DidFindRegistrationToEnablePaymentAppDelegations(
430 const std::vector<PaymentDelegation>& delegations,
431 EnableDelegationsCallback callback,
432 blink::ServiceWorkerStatusCode status,
433 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21434 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Sahel Sharify1a149fbd2019-09-11 01:25:44435 if (status != blink::ServiceWorkerStatusCode::kOk) {
436 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
437 return;
438 }
439
Steven Bingler0ae23d52021-05-25 15:17:59440 // Constructing registration_id and payment_app_key before
441 // moving registration.
442 int64_t registration_id = registration->id();
443 std::string payment_app_key =
444 CreatePaymentAppKey(registration->scope().spec());
Sahel Sharify1a149fbd2019-09-11 01:25:44445 service_worker_context_->GetRegistrationUserDataByKeyPrefix(
Steven Bingler0ae23d52021-05-25 15:17:59446 registration_id, payment_app_key,
Sahel Sharify1a149fbd2019-09-11 01:25:44447 base::BindOnce(
448 &PaymentAppDatabase::DidGetPaymentAppInfoToEnableDelegations,
449 weak_ptr_factory_.GetWeakPtr(), delegations, std::move(callback),
Steven Bingler0ae23d52021-05-25 15:17:59450 std::move(registration)));
Sahel Sharify1a149fbd2019-09-11 01:25:44451}
452
453void PaymentAppDatabase::DidGetPaymentAppInfoToEnableDelegations(
454 const std::vector<PaymentDelegation>& delegations,
455 EnableDelegationsCallback callback,
Steven Bingler0ae23d52021-05-25 15:17:59456 scoped_refptr<ServiceWorkerRegistration> registration,
Sahel Sharify1a149fbd2019-09-11 01:25:44457 const std::vector<std::string>& data,
458 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21459 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Sahel Sharify1a149fbd2019-09-11 01:25:44460 if (status != blink::ServiceWorkerStatusCode::kOk) {
461 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND);
462 return;
463 }
464
465 DCHECK_LE(data.size(), 1U);
466 StoredPaymentAppProto app_proto;
467 if (data.size() == 1U) {
468 app_proto.ParseFromString(data[0]);
469 }
470
471 auto supported_delegations_proto =
472 std::make_unique<SupportedDelegationsProto>();
473 for (auto delegation : delegations) {
474 switch (delegation) {
475 case PaymentDelegation::SHIPPING_ADDRESS:
476 supported_delegations_proto->set_shipping_address(true);
477 break;
478 case PaymentDelegation::PAYER_NAME:
479 supported_delegations_proto->set_payer_name(true);
480 break;
481 case PaymentDelegation::PAYER_PHONE:
482 supported_delegations_proto->set_payer_phone(true);
483 break;
484 case PaymentDelegation::PAYER_EMAIL:
485 supported_delegations_proto->set_payer_email(true);
486 break;
487 }
488 }
489 app_proto.set_allocated_supported_delegations(
490 supported_delegations_proto.release());
491
492 std::string serialized_payment_app;
493 bool success = app_proto.SerializeToString(&serialized_payment_app);
494 DCHECK(success);
495
496 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59497 registration->id(), registration->key(),
498 {{CreatePaymentAppKey(registration->scope().spec()),
499 serialized_payment_app}},
Sahel Sharify1a149fbd2019-09-11 01:25:44500 base::BindOnce(&PaymentAppDatabase::DidEnablePaymentAppDelegations,
501 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
502}
503
504void PaymentAppDatabase::DidEnablePaymentAppDelegations(
505 EnableDelegationsCallback callback,
506 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21507 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Sahel Sharify1a149fbd2019-09-11 01:25:44508 return std::move(callback).Run(
509 status == blink::ServiceWorkerStatusCode::kOk
510 ? PaymentHandlerStatus::SUCCESS
511 : PaymentHandlerStatus::STORAGE_OPERATION_FAILED);
512}
513
gogeraldbc03a52bf2017-09-05 02:31:42514void PaymentAppDatabase::DidFindRegistrationToSetPaymentAppUserHint(
515 const std::string& user_hint,
Han Leon90aedd862018-06-27 02:13:06516 blink::ServiceWorkerStatusCode status,
gogeraldbc03a52bf2017-09-05 02:31:42517 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21518 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02519 if (status != blink::ServiceWorkerStatusCode::kOk)
gogeraldbc03a52bf2017-09-05 02:31:42520 return;
521
Steven Bingler0ae23d52021-05-25 15:17:59522 // Constructing registration_id and payment_app_key before
523 // moving registration.
524 int64_t registration_id = registration->id();
525 std::string payment_app_key =
526 CreatePaymentAppKey(registration->scope().spec());
gogeraldbc03a52bf2017-09-05 02:31:42527 service_worker_context_->GetRegistrationUserDataByKeyPrefix(
Steven Bingler0ae23d52021-05-25 15:17:59528 registration_id, payment_app_key,
tzikff02d282018-02-22 06:11:08529 base::BindOnce(&PaymentAppDatabase::DidGetPaymentAppInfoToSetUserHint,
530 weak_ptr_factory_.GetWeakPtr(), user_hint,
Steven Bingler0ae23d52021-05-25 15:17:59531 std::move(registration)));
gogeraldbc03a52bf2017-09-05 02:31:42532}
533
534void PaymentAppDatabase::DidGetPaymentAppInfoToSetUserHint(
535 const std::string& user_hint,
Steven Bingler0ae23d52021-05-25 15:17:59536 scoped_refptr<ServiceWorkerRegistration> registration,
gogeraldbc03a52bf2017-09-05 02:31:42537 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06538 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21539 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02540 if (status != blink::ServiceWorkerStatusCode::kOk)
gogeraldbc03a52bf2017-09-05 02:31:42541 return;
542
543 DCHECK_LE(data.size(), 1U);
544 StoredPaymentAppProto app_proto;
545 if (data.size() == 1U) {
546 app_proto.ParseFromString(data[0]);
547 }
548 app_proto.set_user_hint(user_hint);
549
550 std::string serialized_payment_app;
551 bool success = app_proto.SerializeToString(&serialized_payment_app);
552 DCHECK(success);
553
554 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59555 registration->id(), registration->key(),
556 {{CreatePaymentAppKey(registration->scope().spec()),
557 serialized_payment_app}},
tzik983fb232018-04-06 15:47:50558 base::BindOnce(&PaymentAppDatabase::DidSetPaymentAppUserHint,
559 weak_ptr_factory_.GetWeakPtr()));
gogeraldbc03a52bf2017-09-05 02:31:42560}
561
562void PaymentAppDatabase::DidSetPaymentAppUserHint(
Han Leon90aedd862018-06-27 02:13:06563 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21564 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02565 DCHECK(status == blink::ServiceWorkerStatusCode::kOk);
gogeraldbc03a52bf2017-09-05 02:31:42566}
567
gogerald84ae6262018-02-06 06:21:46568void PaymentAppDatabase::SetPaymentAppInfoForRegisteredServiceWorker(
569 int64_t registration_id,
570 const std::string& instrument_key,
571 const std::string& name,
gogeralde21a1972018-03-06 00:11:30572 const std::string& icon,
Jinho Bang91dc1b52018-04-06 12:34:38573 const std::string& method,
Sahel Sharify9edd7402019-10-11 20:57:05574 const SupportedDelegations& supported_delegations,
gogerald84ae6262018-02-06 06:21:46575 SetPaymentAppInfoCallback callback) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21576 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald84ae6262018-02-06 06:21:46577
578 service_worker_context_->FindReadyRegistrationForIdOnly(
579 registration_id,
580 base::BindOnce(&PaymentAppDatabase::DidFindRegistrationToSetPaymentApp,
gogeralde21a1972018-03-06 00:11:30581 weak_ptr_factory_.GetWeakPtr(), instrument_key, name, icon,
Sahel Sharify9edd7402019-10-11 20:57:05582 method, supported_delegations, std::move(callback)));
gogerald84ae6262018-02-06 06:21:46583}
584
585void PaymentAppDatabase::DidFindRegistrationToSetPaymentApp(
586 const std::string& instrument_key,
587 const std::string& name,
gogeralde21a1972018-03-06 00:11:30588 const std::string& icon,
Jinho Bang91dc1b52018-04-06 12:34:38589 const std::string& method,
Sahel Sharify9edd7402019-10-11 20:57:05590 const SupportedDelegations& supported_delegations,
gogerald84ae6262018-02-06 06:21:46591 SetPaymentAppInfoCallback callback,
Han Leon90aedd862018-06-27 02:13:06592 blink::ServiceWorkerStatusCode status,
gogerald84ae6262018-02-06 06:21:46593 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21594 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald84ae6262018-02-06 06:21:46595
Han Leon51e125a2018-07-04 04:21:02596 if (status != blink::ServiceWorkerStatusCode::kOk) {
gogerald84ae6262018-02-06 06:21:46597 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
598 return;
599 }
600
601 StoredPaymentAppProto payment_app_proto;
602 payment_app_proto.set_registration_id(registration->id());
Zhuoyu Qian2266251f2018-10-13 02:59:00603 payment_app_proto.set_scope(registration->scope().spec());
gogerald84ae6262018-02-06 06:21:46604 payment_app_proto.set_name(name);
gogeralde21a1972018-03-06 00:11:30605 payment_app_proto.set_icon(icon);
gogerald84ae6262018-02-06 06:21:46606
Sahel Sharify9edd7402019-10-11 20:57:05607 // Set supported delegations.
608 auto supported_delegations_proto =
609 std::make_unique<SupportedDelegationsProto>();
610 supported_delegations_proto->set_shipping_address(
611 supported_delegations.shipping_address);
612 supported_delegations_proto->set_payer_name(supported_delegations.payer_name);
613 supported_delegations_proto->set_payer_phone(
614 supported_delegations.payer_phone);
615 supported_delegations_proto->set_payer_email(
616 supported_delegations.payer_email);
617 payment_app_proto.set_allocated_supported_delegations(
618 supported_delegations_proto.release());
619
gogerald84ae6262018-02-06 06:21:46620 std::string serialized_payment_app;
621 bool success = payment_app_proto.SerializeToString(&serialized_payment_app);
622 DCHECK(success);
623
Steven Bingler0ae23d52021-05-25 15:17:59624 // Constructing registration_id, registration_key and storage_key before
gogerald01aed35982018-05-02 00:03:35625 // moving registration.
626 int64_t registration_id = registration->id();
Steven Binglerfdc1ded2021-05-27 19:02:15627 blink::StorageKey registration_key = registration->key();
Zhuoyu Qian2266251f2018-10-13 02:59:00628 std::string storage_key = CreatePaymentAppKey(registration->scope().spec());
gogerald84ae6262018-02-06 06:21:46629 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59630 registration_id, registration_key,
gogerald01aed35982018-05-02 00:03:35631 {{storage_key, serialized_payment_app}},
tzik983fb232018-04-06 15:47:50632 base::BindOnce(&PaymentAppDatabase::DidWritePaymentAppForSetPaymentApp,
633 weak_ptr_factory_.GetWeakPtr(), instrument_key, method,
634 std::move(callback), std::move(registration)));
gogerald84ae6262018-02-06 06:21:46635
636 return;
637}
638
639void PaymentAppDatabase::DidWritePaymentAppForSetPaymentApp(
640 const std::string& instrument_key,
Jinho Bang91dc1b52018-04-06 12:34:38641 const std::string& method,
gogerald84ae6262018-02-06 06:21:46642 SetPaymentAppInfoCallback callback,
643 scoped_refptr<ServiceWorkerRegistration> registration,
Han Leon90aedd862018-06-27 02:13:06644 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21645 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald84ae6262018-02-06 06:21:46646
Han Leon51e125a2018-07-04 04:21:02647 if (status != blink::ServiceWorkerStatusCode::kOk) {
gogerald84ae6262018-02-06 06:21:46648 std::move(callback).Run(PaymentHandlerStatus::STORAGE_OPERATION_FAILED);
649 return;
650 }
651
652 StoredPaymentInstrumentProto instrument_proto;
653 instrument_proto.set_registration_id(registration->id());
654 instrument_proto.set_instrument_key(instrument_key);
Jinho Bang91dc1b52018-04-06 12:34:38655 instrument_proto.set_method(method);
gogerald84ae6262018-02-06 06:21:46656
657 std::string serialized_instrument;
658 bool success = instrument_proto.SerializeToString(&serialized_instrument);
659 DCHECK(success);
660
661 StoredPaymentInstrumentKeyInfoProto key_info_proto;
662 key_info_proto.set_key(instrument_key);
663 key_info_proto.set_insertion_order(base::Time::Now().ToInternalValue());
664
665 std::string serialized_key_info;
666 success = key_info_proto.SerializeToString(&serialized_key_info);
667 DCHECK(success);
668
669 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59670 registration->id(), registration->key(),
gogerald84ae6262018-02-06 06:21:46671 {{CreatePaymentInstrumentKey(instrument_key), serialized_instrument},
672 {CreatePaymentInstrumentKeyInfoKey(instrument_key),
673 serialized_key_info}},
tzik983fb232018-04-06 15:47:50674 base::BindOnce(
675 &PaymentAppDatabase::DidWritePaymentInstrumentForSetPaymentApp,
676 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
gogerald84ae6262018-02-06 06:21:46677}
678
679void PaymentAppDatabase::DidWritePaymentInstrumentForSetPaymentApp(
680 SetPaymentAppInfoCallback callback,
Han Leon90aedd862018-06-27 02:13:06681 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21682 DCHECK_CURRENTLY_ON(BrowserThread::UI);
gogerald84ae6262018-02-06 06:21:46683 return std::move(callback).Run(
Han Leon51e125a2018-07-04 04:21:02684 status == blink::ServiceWorkerStatusCode::kOk
gogerald84ae6262018-02-06 06:21:46685 ? PaymentHandlerStatus::SUCCESS
686 : PaymentHandlerStatus::STORAGE_OPERATION_FAILED);
687}
688
jinho.bang5f5a9b492017-05-13 07:55:13689void PaymentAppDatabase::DidReadAllPaymentApps(
690 ReadAllPaymentAppsCallback callback,
691 const std::vector<std::pair<int64_t, std::string>>& raw_data,
Han Leon90aedd862018-06-27 02:13:06692 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21693 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02694 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bang5f5a9b492017-05-13 07:55:13695 std::move(callback).Run(PaymentApps());
696 return;
697 }
698
699 PaymentApps apps;
700 for (const auto& item_of_raw_data : raw_data) {
gogerald70b9dcb2017-07-05 05:28:49701 std::unique_ptr<StoredPaymentApp> app =
702 ToStoredPaymentApp(item_of_raw_data.second);
703 if (app)
gogerald29b88092017-08-03 15:22:19704 apps[app->registration_id] = std::move(app);
gogerald70b9dcb2017-07-05 05:28:49705 }
706
707 if (apps.size() == 0U) {
708 std::move(callback).Run(PaymentApps());
709 return;
710 }
711
712 service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix(
713 kPaymentInstrumentPrefix,
tzikff02d282018-02-22 06:11:08714 base::BindOnce(&PaymentAppDatabase::DidReadAllPaymentInstruments,
tzik983fb232018-04-06 15:47:50715 weak_ptr_factory_.GetWeakPtr(), std::move(apps),
716 std::move(callback)));
gogerald70b9dcb2017-07-05 05:28:49717}
718
719void PaymentAppDatabase::DidReadAllPaymentInstruments(
720 PaymentApps apps,
721 ReadAllPaymentAppsCallback callback,
722 const std::vector<std::pair<int64_t, std::string>>& raw_data,
Han Leon90aedd862018-06-27 02:13:06723 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21724 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02725 if (status != blink::ServiceWorkerStatusCode::kOk) {
Liquan (Max) Guabfb8972022-01-10 21:24:28726 std::move(callback).Run(PaymentApps());
gogerald70b9dcb2017-07-05 05:28:49727 return;
728 }
729
730 for (const auto& item_of_raw_data : raw_data) {
gogeraldad5b9e52017-07-05 23:08:32731 StoredPaymentInstrumentProto instrument_proto;
732 if (!instrument_proto.ParseFromString(item_of_raw_data.second))
jinho.bang5f5a9b492017-05-13 07:55:13733 continue;
gogeraldad5b9e52017-07-05 23:08:32734
gogerald29b88092017-08-03 15:22:19735 int64_t id = instrument_proto.registration_id();
Jan Wilken Dörrie77c581a2019-06-07 16:25:06736 if (!base::Contains(apps, id))
gogeraldad5b9e52017-07-05 23:08:32737 continue;
738
Jinho Bang91dc1b52018-04-06 12:34:38739 apps[id]->enabled_methods.emplace_back(instrument_proto.method());
jinho.bang5f5a9b492017-05-13 07:55:13740 }
741
742 std::move(callback).Run(std::move(apps));
743}
744
jinho.bangbd27d5f2017-04-26 12:09:34745void PaymentAppDatabase::DidFindRegistrationToDeletePaymentInstrument(
746 const std::string& instrument_key,
747 DeletePaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06748 blink::ServiceWorkerStatusCode status,
jinho.bangbd27d5f2017-04-26 12:09:34749 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21750 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02751 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bangbd27d5f2017-04-26 12:09:34752 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
753 return;
754 }
755
756 service_worker_context_->GetRegistrationUserData(
jinho.bange052a49f2017-04-27 17:56:58757 registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
tzikff02d282018-02-22 06:11:08758 base::BindOnce(&PaymentAppDatabase::DidFindPaymentInstrument,
759 weak_ptr_factory_.GetWeakPtr(), registration->id(),
tzik983fb232018-04-06 15:47:50760 instrument_key, std::move(callback)));
jinho.bangbd27d5f2017-04-26 12:09:34761}
762
763void PaymentAppDatabase::DidFindPaymentInstrument(
764 int64_t registration_id,
765 const std::string& instrument_key,
766 DeletePaymentInstrumentCallback callback,
767 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06768 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21769 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02770 if (status != blink::ServiceWorkerStatusCode::kOk || data.size() != 1) {
jinho.bangbd27d5f2017-04-26 12:09:34771 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND);
772 return;
773 }
774
775 service_worker_context_->ClearRegistrationUserData(
jinho.bangf7742a22017-05-04 01:31:59776 registration_id,
777 {CreatePaymentInstrumentKey(instrument_key),
778 CreatePaymentInstrumentKeyInfoKey(instrument_key)},
tzik983fb232018-04-06 15:47:50779 base::BindOnce(&PaymentAppDatabase::DidDeletePaymentInstrument,
780 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bangbd27d5f2017-04-26 12:09:34781}
782
783void PaymentAppDatabase::DidDeletePaymentInstrument(
784 DeletePaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06785 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21786 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02787 return std::move(callback).Run(status == blink::ServiceWorkerStatusCode::kOk
jinho.bangbd27d5f2017-04-26 12:09:34788 ? PaymentHandlerStatus::SUCCESS
789 : PaymentHandlerStatus::NOT_FOUND);
790}
791
jinho.bang0e7bbf12017-04-17 17:03:03792void PaymentAppDatabase::DidFindRegistrationToReadPaymentInstrument(
jinho.bangbd27d5f2017-04-26 12:09:34793 const std::string& instrument_key,
jinho.bang0e7bbf12017-04-17 17:03:03794 ReadPaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06795 blink::ServiceWorkerStatusCode status,
jinho.bang0e7bbf12017-04-17 17:03:03796 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21797 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02798 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bang0e7bbf12017-04-17 17:03:03799 std::move(callback).Run(PaymentInstrument::New(),
800 PaymentHandlerStatus::NO_ACTIVE_WORKER);
801 return;
802 }
803
804 service_worker_context_->GetRegistrationUserData(
jinho.bange052a49f2017-04-27 17:56:58805 registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
tzikff02d282018-02-22 06:11:08806 base::BindOnce(&PaymentAppDatabase::DidReadPaymentInstrument,
tzik983fb232018-04-06 15:47:50807 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bang0e7bbf12017-04-17 17:03:03808}
809
810void PaymentAppDatabase::DidReadPaymentInstrument(
811 ReadPaymentInstrumentCallback callback,
812 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06813 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21814 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02815 if (status != blink::ServiceWorkerStatusCode::kOk || data.size() != 1) {
jinho.bang0e7bbf12017-04-17 17:03:03816 std::move(callback).Run(PaymentInstrument::New(),
817 PaymentHandlerStatus::NOT_FOUND);
818 return;
819 }
820
jinho.bang5f5a9b492017-05-13 07:55:13821 PaymentInstrumentPtr instrument = ToPaymentInstrumentForMojo(data[0]);
jinho.bang0e7bbf12017-04-17 17:03:03822 if (!instrument) {
823 std::move(callback).Run(PaymentInstrument::New(),
824 PaymentHandlerStatus::STORAGE_OPERATION_FAILED);
825 return;
826 }
827
828 std::move(callback).Run(std::move(instrument), PaymentHandlerStatus::SUCCESS);
829}
830
jinho.bangf7742a22017-05-04 01:31:59831void PaymentAppDatabase::DidFindRegistrationToGetKeys(
832 KeysOfPaymentInstrumentsCallback callback,
Han Leon90aedd862018-06-27 02:13:06833 blink::ServiceWorkerStatusCode status,
jinho.bangf7742a22017-05-04 01:31:59834 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21835 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02836 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bangf7742a22017-05-04 01:31:59837 std::move(callback).Run(std::vector<std::string>(),
838 PaymentHandlerStatus::NO_ACTIVE_WORKER);
839 return;
840 }
841
842 service_worker_context_->GetRegistrationUserDataByKeyPrefix(
843 registration->id(), {kPaymentInstrumentKeyInfoPrefix},
tzikff02d282018-02-22 06:11:08844 base::BindOnce(&PaymentAppDatabase::DidGetKeysOfPaymentInstruments,
tzik983fb232018-04-06 15:47:50845 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bangf7742a22017-05-04 01:31:59846}
847
848void PaymentAppDatabase::DidGetKeysOfPaymentInstruments(
849 KeysOfPaymentInstrumentsCallback callback,
850 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06851 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21852 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02853 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bangf7742a22017-05-04 01:31:59854 std::move(callback).Run(std::vector<std::string>(),
855 PaymentHandlerStatus::NOT_FOUND);
856 return;
857 }
858
859 std::vector<std::string> keys;
jinho.bang5f5a9b492017-05-13 07:55:13860 for (const auto& key_info : ToStoredPaymentInstrumentKeyInfos(data)) {
jinho.bangf7742a22017-05-04 01:31:59861 keys.push_back(key_info.second);
862 }
863
864 std::move(callback).Run(keys, PaymentHandlerStatus::SUCCESS);
865}
866
jinho.bang8f5656542017-04-27 16:15:20867void PaymentAppDatabase::DidFindRegistrationToHasPaymentInstrument(
868 const std::string& instrument_key,
869 HasPaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06870 blink::ServiceWorkerStatusCode status,
jinho.bang8f5656542017-04-27 16:15:20871 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21872 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02873 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bang8f5656542017-04-27 16:15:20874 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
875 return;
876 }
877
878 service_worker_context_->GetRegistrationUserData(
jinho.bange052a49f2017-04-27 17:56:58879 registration->id(), {CreatePaymentInstrumentKey(instrument_key)},
tzikff02d282018-02-22 06:11:08880 base::BindOnce(&PaymentAppDatabase::DidHasPaymentInstrument,
tzik983fb232018-04-06 15:47:50881 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bang8f5656542017-04-27 16:15:20882}
883
884void PaymentAppDatabase::DidHasPaymentInstrument(
jinho.bang8f5656542017-04-27 16:15:20885 DeletePaymentInstrumentCallback callback,
886 const std::vector<std::string>& data,
Han Leon90aedd862018-06-27 02:13:06887 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21888 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02889 if (status != blink::ServiceWorkerStatusCode::kOk || data.size() != 1) {
jinho.bang8f5656542017-04-27 16:15:20890 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND);
891 return;
892 }
893
894 std::move(callback).Run(PaymentHandlerStatus::SUCCESS);
895}
896
jinho.bang0e7bbf12017-04-17 17:03:03897void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
jinho.bangbd27d5f2017-04-26 12:09:34898 const std::string& instrument_key,
jinho.bang0e7bbf12017-04-17 17:03:03899 PaymentInstrumentPtr instrument,
gogeraldd8c5af342017-06-14 02:22:36900 const std::string& decoded_instrument_icon,
jinho.bang0e7bbf12017-04-17 17:03:03901 WritePaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06902 blink::ServiceWorkerStatusCode status,
jinho.bang0e7bbf12017-04-17 17:03:03903 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21904 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:02905 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bang0e7bbf12017-04-17 17:03:03906 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
907 return;
908 }
909
jinho.bang5f5a9b492017-05-13 07:55:13910 StoredPaymentInstrumentProto instrument_proto;
gogerald29b88092017-08-03 15:22:19911 instrument_proto.set_registration_id(registration->id());
gogeraldd8c5af342017-06-14 02:22:36912 instrument_proto.set_decoded_instrument_icon(decoded_instrument_icon);
jinho.bang5f5a9b492017-05-13 07:55:13913 instrument_proto.set_instrument_key(instrument_key);
jinho.bang0e7bbf12017-04-17 17:03:03914 instrument_proto.set_name(instrument->name);
Jinho Bang91dc1b52018-04-06 12:34:38915 instrument_proto.set_method(instrument->method);
Jinho Bang850aa4842017-09-20 02:03:19916 for (const auto& icon : instrument->icons) {
gogeraldd8c5af342017-06-14 02:22:36917 StoredPaymentInstrumentImageObject* image_object_proto =
918 instrument_proto.add_icons();
Jinho Bang850aa4842017-09-20 02:03:19919 image_object_proto->set_src(icon.src.spec());
920 image_object_proto->set_type(base::UTF16ToUTF8(icon.type));
921 for (const auto& size : icon.sizes) {
922 ImageSizeProto* size_proto = image_object_proto->add_sizes();
923 size_proto->set_width(size.width());
924 size_proto->set_height(size.height());
925 }
gogeraldd8c5af342017-06-14 02:22:36926 }
jinho.bang0e7bbf12017-04-17 17:03:03927
jinho.bangf7742a22017-05-04 01:31:59928 std::string serialized_instrument;
929 bool success = instrument_proto.SerializeToString(&serialized_instrument);
930 DCHECK(success);
931
jinho.bang5f5a9b492017-05-13 07:55:13932 StoredPaymentInstrumentKeyInfoProto key_info_proto;
jinho.bangf7742a22017-05-04 01:31:59933 key_info_proto.set_key(instrument_key);
934 key_info_proto.set_insertion_order(base::Time::Now().ToInternalValue());
935
936 std::string serialized_key_info;
937 success = key_info_proto.SerializeToString(&serialized_key_info);
adithyas9d3c221b2017-05-02 21:20:40938 DCHECK(success);
jinho.bang0e7bbf12017-04-17 17:03:03939
940 service_worker_context_->StoreRegistrationUserData(
Steven Bingler0ae23d52021-05-25 15:17:59941 registration->id(), registration->key(),
jinho.bangf7742a22017-05-04 01:31:59942 {{CreatePaymentInstrumentKey(instrument_key), serialized_instrument},
943 {CreatePaymentInstrumentKeyInfoKey(instrument_key),
944 serialized_key_info}},
tzik983fb232018-04-06 15:47:50945 base::BindOnce(&PaymentAppDatabase::DidWritePaymentInstrument,
946 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bang0e7bbf12017-04-17 17:03:03947}
948
949void PaymentAppDatabase::DidWritePaymentInstrument(
950 WritePaymentInstrumentCallback callback,
Han Leon90aedd862018-06-27 02:13:06951 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21952 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bang0e7bbf12017-04-17 17:03:03953 return std::move(callback).Run(
Han Leon51e125a2018-07-04 04:21:02954 status == blink::ServiceWorkerStatusCode::kOk
jinho.bang0e7bbf12017-04-17 17:03:03955 ? PaymentHandlerStatus::SUCCESS
956 : PaymentHandlerStatus::STORAGE_OPERATION_FAILED);
957}
958
jinho.bangaf28f772017-05-05 12:22:11959void PaymentAppDatabase::DidFindRegistrationToClearPaymentInstruments(
960 const GURL& scope,
961 ClearPaymentInstrumentsCallback callback,
Han Leon90aedd862018-06-27 02:13:06962 blink::ServiceWorkerStatusCode status,
jinho.bangaf28f772017-05-05 12:22:11963 scoped_refptr<ServiceWorkerRegistration> registration) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21964 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangaf28f772017-05-05 12:22:11965
Han Leon51e125a2018-07-04 04:21:02966 if (status != blink::ServiceWorkerStatusCode::kOk) {
jinho.bangaf28f772017-05-05 12:22:11967 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
968 return;
969 }
970
971 KeysOfPaymentInstruments(
972 scope,
973 base::BindOnce(&PaymentAppDatabase::DidGetKeysToClearPaymentInstruments,
gogerald70b9dcb2017-07-05 05:28:49974 weak_ptr_factory_.GetWeakPtr(), std::move(registration),
jinho.bangaf28f772017-05-05 12:22:11975 std::move(callback)));
976}
977
978void PaymentAppDatabase::DidGetKeysToClearPaymentInstruments(
gogerald70b9dcb2017-07-05 05:28:49979 scoped_refptr<ServiceWorkerRegistration> registration,
jinho.bangaf28f772017-05-05 12:22:11980 ClearPaymentInstrumentsCallback callback,
981 const std::vector<std::string>& keys,
982 PaymentHandlerStatus status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:21983 DCHECK_CURRENTLY_ON(BrowserThread::UI);
jinho.bangaf28f772017-05-05 12:22:11984
985 if (status != PaymentHandlerStatus::SUCCESS) {
986 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND);
987 return;
988 }
989
990 std::vector<std::string> keys_with_prefix;
991 for (const auto& key : keys) {
992 keys_with_prefix.push_back(CreatePaymentInstrumentKey(key));
993 keys_with_prefix.push_back(CreatePaymentInstrumentKeyInfoKey(key));
994 }
995
gogerald70b9dcb2017-07-05 05:28:49996 // Clear payment app info after clearing all payment instruments.
Zhuoyu Qian2266251f2018-10-13 02:59:00997 keys_with_prefix.push_back(CreatePaymentAppKey(registration->scope().spec()));
gogerald70b9dcb2017-07-05 05:28:49998
jinho.bangaf28f772017-05-05 12:22:11999 service_worker_context_->ClearRegistrationUserData(
gogerald70b9dcb2017-07-05 05:28:491000 registration->id(), keys_with_prefix,
tzik983fb232018-04-06 15:47:501001 base::BindOnce(&PaymentAppDatabase::DidClearPaymentInstruments,
1002 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
jinho.bangaf28f772017-05-05 12:22:111003}
1004
1005void PaymentAppDatabase::DidClearPaymentInstruments(
1006 ClearPaymentInstrumentsCallback callback,
Han Leon90aedd862018-06-27 02:13:061007 blink::ServiceWorkerStatusCode status) {
Matt Falkenhagendb5d03e2021-09-28 10:14:211008 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Han Leon51e125a2018-07-04 04:21:021009 return std::move(callback).Run(status == blink::ServiceWorkerStatusCode::kOk
jinho.bangaf28f772017-05-05 12:22:111010 ? PaymentHandlerStatus::SUCCESS
1011 : PaymentHandlerStatus::NOT_FOUND);
1012}
1013
jinho.bangab430572016-12-16 14:33:581014} // namespace content