| Index: content/browser/payments/payment_app_database.cc
|
| diff --git a/content/browser/payments/payment_app_database.cc b/content/browser/payments/payment_app_database.cc
|
| index d59277459d731f3e0ed8395c5e28f157b4816990..9adcb8b2fa70aceb806ef925f999355b9b5aa0fc 100644
|
| --- a/content/browser/payments/payment_app_database.cc
|
| +++ b/content/browser/payments/payment_app_database.cc
|
| @@ -4,10 +4,12 @@
|
|
|
| #include "content/browser/payments/payment_app_database.h"
|
|
|
| +#include <map>
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| #include "base/optional.h"
|
| +#include "base/time/time.h"
|
| #include "content/browser/payments/payment_app.pb.h"
|
| #include "content/browser/payments/payment_app_context_impl.h"
|
| #include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| @@ -22,10 +24,16 @@ using ::payments::mojom::PaymentInstrument;
|
| using ::payments::mojom::PaymentInstrumentPtr;
|
|
|
| const char kPaymentAppManifestDataKey[] = "PaymentAppManifestData";
|
| -const char kPaymentInstrumentKeyPrefix[] = "PaymentInstrument:";
|
| +const char kPaymentInstrumentPrefix[] = "PaymentInstrument:";
|
| +const char kPaymentInstrumentKeyInfoPrefix[] = "PaymentInstrumentKeyInfo:";
|
|
|
| std::string CreatePaymentInstrumentKey(const std::string& instrument_key) {
|
| - return kPaymentInstrumentKeyPrefix + instrument_key;
|
| + return kPaymentInstrumentPrefix + instrument_key;
|
| +}
|
| +
|
| +std::string CreatePaymentInstrumentKeyInfoKey(
|
| + const std::string& instrument_key) {
|
| + return kPaymentInstrumentKeyInfoPrefix + instrument_key;
|
| }
|
|
|
| payments::mojom::PaymentAppManifestPtr DeserializePaymentAppManifest(
|
| @@ -54,6 +62,21 @@ payments::mojom::PaymentAppManifestPtr DeserializePaymentAppManifest(
|
| return manifest;
|
| }
|
|
|
| +std::map<uint64_t, std::string> DeserializePaymentInstrumentKeyInfo(
|
| + const std::vector<std::string>& inputs) {
|
| + std::map<uint64_t, std::string> key_info;
|
| + for (const auto& input : inputs) {
|
| + PaymentInstrumentKeyInfoProto key_info_proto;
|
| + if (!key_info_proto.ParseFromString(input))
|
| + return std::map<uint64_t, std::string>();
|
| +
|
| + key_info.insert(std::pair<uint64_t, std::string>(
|
| + key_info_proto.insertion_order(), key_info_proto.key()));
|
| + }
|
| +
|
| + return key_info;
|
| +}
|
| +
|
| PaymentInstrumentPtr DeserializePaymentInstrument(const std::string& input) {
|
| PaymentInstrumentProto instrument_proto;
|
| if (!instrument_proto.ParseFromString(input))
|
| @@ -140,6 +163,17 @@ void PaymentAppDatabase::ReadPaymentInstrument(
|
| base::Passed(std::move(callback))));
|
| }
|
|
|
| +void PaymentAppDatabase::KeysOfPaymentInstruments(
|
| + const GURL& scope,
|
| + KeysOfPaymentInstrumentsCallback callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + service_worker_context_->FindReadyRegistrationForPattern(
|
| + scope, base::Bind(&PaymentAppDatabase::DidFindRegistrationToGetKeys,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(std::move(callback))));
|
| +}
|
| +
|
| void PaymentAppDatabase::HasPaymentInstrument(
|
| const GURL& scope,
|
| const std::string& instrument_key,
|
| @@ -312,7 +346,9 @@ void PaymentAppDatabase::DidFindPaymentInstrument(
|
| }
|
|
|
| service_worker_context_->ClearRegistrationUserData(
|
| - registration_id, {CreatePaymentInstrumentKey(instrument_key)},
|
| + registration_id,
|
| + {CreatePaymentInstrumentKey(instrument_key),
|
| + CreatePaymentInstrumentKeyInfoKey(instrument_key)},
|
| base::Bind(&PaymentAppDatabase::DidDeletePaymentInstrument,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| base::Passed(std::move(callback))));
|
| @@ -367,6 +403,43 @@ void PaymentAppDatabase::DidReadPaymentInstrument(
|
| std::move(callback).Run(std::move(instrument), PaymentHandlerStatus::SUCCESS);
|
| }
|
|
|
| +void PaymentAppDatabase::DidFindRegistrationToGetKeys(
|
| + KeysOfPaymentInstrumentsCallback callback,
|
| + ServiceWorkerStatusCode status,
|
| + scoped_refptr<ServiceWorkerRegistration> registration) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (status != SERVICE_WORKER_OK) {
|
| + std::move(callback).Run(std::vector<std::string>(),
|
| + PaymentHandlerStatus::NO_ACTIVE_WORKER);
|
| + return;
|
| + }
|
| +
|
| + service_worker_context_->GetRegistrationUserDataByKeyPrefix(
|
| + registration->id(), {kPaymentInstrumentKeyInfoPrefix},
|
| + base::Bind(&PaymentAppDatabase::DidGetKeysOfPaymentInstruments,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(std::move(callback))));
|
| +}
|
| +
|
| +void PaymentAppDatabase::DidGetKeysOfPaymentInstruments(
|
| + KeysOfPaymentInstrumentsCallback callback,
|
| + const std::vector<std::string>& data,
|
| + ServiceWorkerStatusCode status) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (status != SERVICE_WORKER_OK) {
|
| + std::move(callback).Run(std::vector<std::string>(),
|
| + PaymentHandlerStatus::NOT_FOUND);
|
| + return;
|
| + }
|
| +
|
| + std::vector<std::string> keys;
|
| + for (const auto& key_info : DeserializePaymentInstrumentKeyInfo(data)) {
|
| + keys.push_back(key_info.second);
|
| + }
|
| +
|
| + std::move(callback).Run(keys, PaymentHandlerStatus::SUCCESS);
|
| +}
|
| +
|
| void PaymentAppDatabase::DidFindRegistrationToHasPaymentInstrument(
|
| const std::string& instrument_key,
|
| HasPaymentInstrumentCallback callback,
|
| @@ -420,13 +493,21 @@ void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
|
| instrument_proto.set_stringified_capabilities(
|
| instrument->stringified_capabilities);
|
|
|
| - std::string serialized;
|
| - bool success = instrument_proto.SerializeToString(&serialized);
|
| - DCHECK(success);
|
| + std::string serialized_instrument;
|
| + DCHECK(instrument_proto.SerializeToString(&serialized_instrument));
|
| +
|
| + PaymentInstrumentKeyInfoProto key_info_proto;
|
| + key_info_proto.set_key(instrument_key);
|
| + key_info_proto.set_insertion_order(base::Time::Now().ToInternalValue());
|
| +
|
| + std::string serialized_key_info;
|
| + DCHECK(key_info_proto.SerializeToString(&serialized_key_info));
|
|
|
| service_worker_context_->StoreRegistrationUserData(
|
| registration->id(), registration->pattern().GetOrigin(),
|
| - {{CreatePaymentInstrumentKey(instrument_key), serialized}},
|
| + {{CreatePaymentInstrumentKey(instrument_key), serialized_instrument},
|
| + {CreatePaymentInstrumentKeyInfoKey(instrument_key),
|
| + serialized_key_info}},
|
| base::Bind(&PaymentAppDatabase::DidWritePaymentInstrument,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| base::Passed(std::move(callback))));
|
|
|