Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |