| 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 5c58b9b6e1f1f51970b90e4895b2c6ec4bd27bd5..c1c1bf8e694a67c72f6f11cc5ab0f1f02f290cfd 100644
|
| --- a/content/browser/payments/payment_app_database.cc
|
| +++ b/content/browser/payments/payment_app_database.cc
|
| @@ -7,6 +7,7 @@
|
| #include <map>
|
| #include <utility>
|
|
|
| +#include "base/base64.h"
|
| #include "base/bind.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/optional.h"
|
| @@ -16,6 +17,8 @@
|
| #include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| #include "content/browser/service_worker/service_worker_registration.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "ui/gfx/image/image.h"
|
|
|
| namespace content {
|
| namespace {
|
| @@ -58,6 +61,10 @@ PaymentInstrumentPtr ToPaymentInstrumentForMojo(const std::string& input) {
|
|
|
| PaymentInstrumentPtr instrument = PaymentInstrument::New();
|
| instrument->name = instrument_proto.name();
|
| + for (const auto& icon : instrument_proto.icons()) {
|
| + instrument->icons.emplace_back(
|
| + payments::mojom::ImageObject::New(GURL(icon.src())));
|
| + }
|
| for (const auto& method : instrument_proto.enabled_methods())
|
| instrument->enabled_methods.push_back(method);
|
| instrument->stringified_capabilities =
|
| @@ -78,6 +85,18 @@ std::unique_ptr<StoredPaymentInstrument> ToStoredPaymentInstrument(
|
| instrument->instrument_key = instrument_proto.instrument_key();
|
| instrument->origin = GURL(instrument_proto.origin());
|
| instrument->name = instrument_proto.name();
|
| +
|
| + if (!instrument_proto.decoded_instrument_icon().empty()) {
|
| + std::string icon_raw_data;
|
| + base::Base64Decode(instrument_proto.decoded_instrument_icon(),
|
| + &icon_raw_data);
|
| + // Note that the icon has been decoded to PNG raw data regardless of the
|
| + // original icon format that was downloaded.
|
| + gfx::Image icon_image = gfx::Image::CreateFrom1xPNGBytes(
|
| + reinterpret_cast<const unsigned char*>(icon_raw_data.data()),
|
| + icon_raw_data.size());
|
| + instrument->icon = base::MakeUnique<SkBitmap>(icon_image.AsBitmap());
|
| + }
|
| for (const auto& method : instrument_proto.enabled_methods())
|
| instrument->enabled_methods.push_back(method);
|
|
|
| @@ -166,12 +185,46 @@ void PaymentAppDatabase::WritePaymentInstrument(
|
| WritePaymentInstrumentCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
| + if (instrument->icons.size() > 0) {
|
| + instrument_icon_fetcher_ =
|
| + base::MakeRefCounted<PaymentInstrumentIconFetcher>();
|
| + instrument_icon_fetcher_->Start(
|
| + instrument->icons, service_worker_context_,
|
| + base::Bind(&PaymentAppDatabase::DidFetchedPaymentInstrumentIcon,
|
| + weak_ptr_factory_.GetWeakPtr(), scope, instrument_key,
|
| + base::Passed(std::move(instrument)),
|
| + base::Passed(std::move(callback))));
|
| + } else {
|
| + service_worker_context_->FindReadyRegistrationForPattern(
|
| + scope,
|
| + base::Bind(
|
| + &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
|
| + weak_ptr_factory_.GetWeakPtr(), instrument_key,
|
| + base::Passed(std::move(instrument)), std::string(),
|
| + base::Passed(std::move(callback))));
|
| + }
|
| +}
|
| +
|
| +void PaymentAppDatabase::DidFetchedPaymentInstrumentIcon(
|
| + const GURL& scope,
|
| + const std::string& instrument_key,
|
| + payments::mojom::PaymentInstrumentPtr instrument,
|
| + WritePaymentInstrumentCallback callback,
|
| + const std::string& icon) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| + instrument_icon_fetcher_ = nullptr;
|
| + if (icon.empty()) {
|
| + std::move(callback).Run(PaymentHandlerStatus::FETCH_INSTRUMENT_ICON_FAILED);
|
| + return;
|
| + }
|
| +
|
| service_worker_context_->FindReadyRegistrationForPattern(
|
| scope,
|
| base::Bind(
|
| &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
|
| weak_ptr_factory_.GetWeakPtr(), instrument_key,
|
| - base::Passed(std::move(instrument)),
|
| + base::Passed(std::move(instrument)), icon,
|
| base::Passed(std::move(callback))));
|
| }
|
|
|
| @@ -371,6 +424,7 @@ void PaymentAppDatabase::DidHasPaymentInstrument(
|
| void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
|
| const std::string& instrument_key,
|
| PaymentInstrumentPtr instrument,
|
| + const std::string& decoded_instrument_icon,
|
| WritePaymentInstrumentCallback callback,
|
| ServiceWorkerStatusCode status,
|
| scoped_refptr<ServiceWorkerRegistration> registration) {
|
| @@ -381,6 +435,7 @@ void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
|
| }
|
|
|
| StoredPaymentInstrumentProto instrument_proto;
|
| + instrument_proto.set_decoded_instrument_icon(decoded_instrument_icon);
|
| instrument_proto.set_registration_id(registration->id());
|
| instrument_proto.set_instrument_key(instrument_key);
|
| instrument_proto.set_origin(registration->pattern().GetOrigin().spec());
|
| @@ -388,6 +443,11 @@ void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
|
| for (const auto& method : instrument->enabled_methods) {
|
| instrument_proto.add_enabled_methods(method);
|
| }
|
| + for (const auto& image_object : instrument->icons) {
|
| + StoredPaymentInstrumentImageObject* image_object_proto =
|
| + instrument_proto.add_icons();
|
| + image_object_proto->set_src(image_object->src.spec());
|
| + }
|
| instrument_proto.set_stringified_capabilities(
|
| instrument->stringified_capabilities);
|
|
|
|
|