Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(313)

Side by Side Diff: content/browser/payments/payment_app_database.cc

Issue 2925063003: [Payments] Implement payment instrument icons (Closed)
Patch Set: resolve url based on execution context Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/payments/payment_app_database.h" 5 #include "content/browser/payments/payment_app_database.h"
6 6
7 #include <map> 7 #include <map>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/base64.h"
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
12 #include "base/optional.h" 13 #include "base/optional.h"
13 #include "base/time/time.h" 14 #include "base/time/time.h"
14 #include "content/browser/payments/payment_app.pb.h" 15 #include "content/browser/payments/payment_app.pb.h"
15 #include "content/browser/payments/payment_app_context_impl.h" 16 #include "content/browser/payments/payment_app_context_impl.h"
16 #include "content/browser/service_worker/service_worker_context_wrapper.h" 17 #include "content/browser/service_worker/service_worker_context_wrapper.h"
17 #include "content/browser/service_worker/service_worker_registration.h" 18 #include "content/browser/service_worker/service_worker_registration.h"
18 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
20 #include "third_party/skia/include/core/SkBitmap.h"
21 #include "ui/gfx/image/image.h"
19 22
20 namespace content { 23 namespace content {
21 namespace { 24 namespace {
22 25
23 using ::payments::mojom::PaymentHandlerStatus; 26 using ::payments::mojom::PaymentHandlerStatus;
24 using ::payments::mojom::PaymentInstrument; 27 using ::payments::mojom::PaymentInstrument;
25 using ::payments::mojom::PaymentInstrumentPtr; 28 using ::payments::mojom::PaymentInstrumentPtr;
26 29
27 const char kPaymentInstrumentPrefix[] = "PaymentInstrument:"; 30 const char kPaymentInstrumentPrefix[] = "PaymentInstrument:";
28 const char kPaymentInstrumentKeyInfoPrefix[] = "PaymentInstrumentKeyInfo:"; 31 const char kPaymentInstrumentKeyInfoPrefix[] = "PaymentInstrumentKeyInfo:";
(...skipping 22 matching lines...) Expand all
51 return key_info; 54 return key_info;
52 } 55 }
53 56
54 PaymentInstrumentPtr ToPaymentInstrumentForMojo(const std::string& input) { 57 PaymentInstrumentPtr ToPaymentInstrumentForMojo(const std::string& input) {
55 StoredPaymentInstrumentProto instrument_proto; 58 StoredPaymentInstrumentProto instrument_proto;
56 if (!instrument_proto.ParseFromString(input)) 59 if (!instrument_proto.ParseFromString(input))
57 return nullptr; 60 return nullptr;
58 61
59 PaymentInstrumentPtr instrument = PaymentInstrument::New(); 62 PaymentInstrumentPtr instrument = PaymentInstrument::New();
60 instrument->name = instrument_proto.name(); 63 instrument->name = instrument_proto.name();
64 for (const auto& icon : instrument_proto.icons()) {
65 payments::mojom::ImageObjectPtr image_object =
66 payments::mojom::ImageObject::New();
67 image_object->src = GURL(icon.src());
dcheng 2017/06/10 00:37:10 I'm a bit confused about how the payment flow work
gogerald1 2017/06/12 16:19:43 PaymentInstrument was registered from renderer, bu
68 instrument->icons.emplace_back(std::move(image_object));
dcheng 2017/06/10 00:37:10 Note: New() has an overload that takes arguments,
gogerald1 2017/06/12 16:19:43 Done.
69 }
61 for (const auto& method : instrument_proto.enabled_methods()) 70 for (const auto& method : instrument_proto.enabled_methods())
62 instrument->enabled_methods.push_back(method); 71 instrument->enabled_methods.push_back(method);
63 instrument->stringified_capabilities = 72 instrument->stringified_capabilities =
64 instrument_proto.stringified_capabilities(); 73 instrument_proto.stringified_capabilities();
65 74
66 return instrument; 75 return instrument;
67 } 76 }
68 77
69 std::unique_ptr<StoredPaymentInstrument> ToStoredPaymentInstrument( 78 std::unique_ptr<StoredPaymentInstrument> ToStoredPaymentInstrument(
70 const std::string& input) { 79 const std::string& input) {
71 StoredPaymentInstrumentProto instrument_proto; 80 StoredPaymentInstrumentProto instrument_proto;
72 if (!instrument_proto.ParseFromString(input)) 81 if (!instrument_proto.ParseFromString(input))
73 return std::unique_ptr<StoredPaymentInstrument>(); 82 return std::unique_ptr<StoredPaymentInstrument>();
74 83
75 std::unique_ptr<StoredPaymentInstrument> instrument = 84 std::unique_ptr<StoredPaymentInstrument> instrument =
76 base::MakeUnique<StoredPaymentInstrument>(); 85 base::MakeUnique<StoredPaymentInstrument>();
77 instrument->registration_id = instrument_proto.registration_id(); 86 instrument->registration_id = instrument_proto.registration_id();
78 instrument->instrument_key = instrument_proto.instrument_key(); 87 instrument->instrument_key = instrument_proto.instrument_key();
79 instrument->origin = GURL(instrument_proto.origin()); 88 instrument->origin = GURL(instrument_proto.origin());
80 instrument->name = instrument_proto.name(); 89 instrument->name = instrument_proto.name();
90
91 if (!instrument_proto.decoded_instrument_icon().empty()) {
92 std::string icon_raw_data;
93 base::Base64Decode(instrument_proto.decoded_instrument_icon(),
94 &icon_raw_data);
95 // Note that the icon has been decoded to PNG raw data regardless of the
96 // original icon format that was downloaded.
97 gfx::Image icon_image = gfx::Image::CreateFrom1xPNGBytes(
98 reinterpret_cast<const unsigned char*>(icon_raw_data.data()),
99 icon_raw_data.size());
100 instrument->icon = base::MakeUnique<SkBitmap>(icon_image.AsBitmap());
101 }
81 for (const auto& method : instrument_proto.enabled_methods()) 102 for (const auto& method : instrument_proto.enabled_methods())
82 instrument->enabled_methods.push_back(method); 103 instrument->enabled_methods.push_back(method);
83 104
84 return instrument; 105 return instrument;
85 } 106 }
86 107
87 } // namespace 108 } // namespace
88 109
89 PaymentAppDatabase::PaymentAppDatabase( 110 PaymentAppDatabase::PaymentAppDatabase(
90 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) 111 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context)
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 base::Passed(std::move(callback)))); 180 base::Passed(std::move(callback))));
160 } 181 }
161 182
162 void PaymentAppDatabase::WritePaymentInstrument( 183 void PaymentAppDatabase::WritePaymentInstrument(
163 const GURL& scope, 184 const GURL& scope,
164 const std::string& instrument_key, 185 const std::string& instrument_key,
165 PaymentInstrumentPtr instrument, 186 PaymentInstrumentPtr instrument,
166 WritePaymentInstrumentCallback callback) { 187 WritePaymentInstrumentCallback callback) {
167 DCHECK_CURRENTLY_ON(BrowserThread::IO); 188 DCHECK_CURRENTLY_ON(BrowserThread::IO);
168 189
190 if (instrument->icons.size() > 0) {
191 instrument_icon_fetcher_ = base::MakeUnique<PaymentInstrumentIconFetcher>();
192 instrument_icon_fetcher_->Start(
193 instrument->icons, service_worker_context_,
194 base::Bind(&PaymentAppDatabase::DidFetchedPaymentInstrumentIcon,
195 weak_ptr_factory_.GetWeakPtr(), scope, instrument_key,
196 base::Passed(std::move(instrument)),
197 base::Passed(std::move(callback))));
198 } else {
199 service_worker_context_->FindReadyRegistrationForPattern(
200 scope,
201 base::Bind(
202 &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
203 weak_ptr_factory_.GetWeakPtr(), instrument_key,
204 base::Passed(std::move(instrument)), "",
dcheng 2017/06/10 00:37:10 Nit: prefer std::string() instead of "" (there's a
gogerald1 2017/06/12 16:19:43 Done.
205 base::Passed(std::move(callback))));
206 }
207 }
208
209 void PaymentAppDatabase::DidFetchedPaymentInstrumentIcon(
210 const GURL& scope,
211 const std::string& instrument_key,
212 payments::mojom::PaymentInstrumentPtr instrument,
213 WritePaymentInstrumentCallback callback,
214 const std::string& icon) {
215 DCHECK_CURRENTLY_ON(BrowserThread::IO);
216
217 instrument_icon_fetcher_.reset(nullptr);
218 if (icon.empty()) {
219 std::move(callback).Run(PaymentHandlerStatus::FETCH_INSTRUMENT_ICON_FAILED);
220 return;
221 }
222
169 service_worker_context_->FindReadyRegistrationForPattern( 223 service_worker_context_->FindReadyRegistrationForPattern(
170 scope, 224 scope,
171 base::Bind( 225 base::Bind(
172 &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument, 226 &PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument,
173 weak_ptr_factory_.GetWeakPtr(), instrument_key, 227 weak_ptr_factory_.GetWeakPtr(), instrument_key,
174 base::Passed(std::move(instrument)), 228 base::Passed(std::move(instrument)), icon,
175 base::Passed(std::move(callback)))); 229 base::Passed(std::move(callback))));
176 } 230 }
177 231
178 void PaymentAppDatabase::ClearPaymentInstruments( 232 void PaymentAppDatabase::ClearPaymentInstruments(
179 const GURL& scope, 233 const GURL& scope,
180 ClearPaymentInstrumentsCallback callback) { 234 ClearPaymentInstrumentsCallback callback) {
181 DCHECK_CURRENTLY_ON(BrowserThread::IO); 235 DCHECK_CURRENTLY_ON(BrowserThread::IO);
182 236
183 service_worker_context_->FindReadyRegistrationForPattern( 237 service_worker_context_->FindReadyRegistrationForPattern(
184 scope, 238 scope,
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND); 418 std::move(callback).Run(PaymentHandlerStatus::NOT_FOUND);
365 return; 419 return;
366 } 420 }
367 421
368 std::move(callback).Run(PaymentHandlerStatus::SUCCESS); 422 std::move(callback).Run(PaymentHandlerStatus::SUCCESS);
369 } 423 }
370 424
371 void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument( 425 void PaymentAppDatabase::DidFindRegistrationToWritePaymentInstrument(
372 const std::string& instrument_key, 426 const std::string& instrument_key,
373 PaymentInstrumentPtr instrument, 427 PaymentInstrumentPtr instrument,
428 const std::string& decoded_instrument_icon,
374 WritePaymentInstrumentCallback callback, 429 WritePaymentInstrumentCallback callback,
375 ServiceWorkerStatusCode status, 430 ServiceWorkerStatusCode status,
376 scoped_refptr<ServiceWorkerRegistration> registration) { 431 scoped_refptr<ServiceWorkerRegistration> registration) {
377 DCHECK_CURRENTLY_ON(BrowserThread::IO); 432 DCHECK_CURRENTLY_ON(BrowserThread::IO);
378 if (status != SERVICE_WORKER_OK) { 433 if (status != SERVICE_WORKER_OK) {
379 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER); 434 std::move(callback).Run(PaymentHandlerStatus::NO_ACTIVE_WORKER);
380 return; 435 return;
381 } 436 }
382 437
383 StoredPaymentInstrumentProto instrument_proto; 438 StoredPaymentInstrumentProto instrument_proto;
439 instrument_proto.set_decoded_instrument_icon(decoded_instrument_icon);
384 instrument_proto.set_registration_id(registration->id()); 440 instrument_proto.set_registration_id(registration->id());
385 instrument_proto.set_instrument_key(instrument_key); 441 instrument_proto.set_instrument_key(instrument_key);
386 instrument_proto.set_origin(registration->pattern().GetOrigin().spec()); 442 instrument_proto.set_origin(registration->pattern().GetOrigin().spec());
387 instrument_proto.set_name(instrument->name); 443 instrument_proto.set_name(instrument->name);
388 for (const auto& method : instrument->enabled_methods) { 444 for (const auto& method : instrument->enabled_methods) {
389 instrument_proto.add_enabled_methods(method); 445 instrument_proto.add_enabled_methods(method);
390 } 446 }
447 for (const auto& image_object : instrument->icons) {
448 StoredPaymentInstrumentImageObject* image_object_proto =
449 instrument_proto.add_icons();
450 image_object_proto->set_src(image_object->src.spec());
451 }
391 instrument_proto.set_stringified_capabilities( 452 instrument_proto.set_stringified_capabilities(
392 instrument->stringified_capabilities); 453 instrument->stringified_capabilities);
393 454
394 std::string serialized_instrument; 455 std::string serialized_instrument;
395 bool success = instrument_proto.SerializeToString(&serialized_instrument); 456 bool success = instrument_proto.SerializeToString(&serialized_instrument);
396 DCHECK(success); 457 DCHECK(success);
397 458
398 StoredPaymentInstrumentKeyInfoProto key_info_proto; 459 StoredPaymentInstrumentKeyInfoProto key_info_proto;
399 key_info_proto.set_key(instrument_key); 460 key_info_proto.set_key(instrument_key);
400 key_info_proto.set_insertion_order(base::Time::Now().ToInternalValue()); 461 key_info_proto.set_insertion_order(base::Time::Now().ToInternalValue());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 void PaymentAppDatabase::DidClearPaymentInstruments( 531 void PaymentAppDatabase::DidClearPaymentInstruments(
471 ClearPaymentInstrumentsCallback callback, 532 ClearPaymentInstrumentsCallback callback,
472 ServiceWorkerStatusCode status) { 533 ServiceWorkerStatusCode status) {
473 DCHECK_CURRENTLY_ON(BrowserThread::IO); 534 DCHECK_CURRENTLY_ON(BrowserThread::IO);
474 return std::move(callback).Run(status == SERVICE_WORKER_OK 535 return std::move(callback).Run(status == SERVICE_WORKER_OK
475 ? PaymentHandlerStatus::SUCCESS 536 ? PaymentHandlerStatus::SUCCESS
476 : PaymentHandlerStatus::NOT_FOUND); 537 : PaymentHandlerStatus::NOT_FOUND);
477 } 538 }
478 539
479 } // namespace content 540 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698