PaymentRequestData.cpp (24264B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "PaymentRequestData.h" 8 9 #include "PaymentRequestUtils.h" 10 #include "mozilla/dom/PaymentRequestBinding.h" 11 #include "mozilla/dom/ToJSValue.h" 12 #include "nsArrayUtils.h" 13 #include "nsComponentManagerUtils.h" 14 #include "nsIMutableArray.h" 15 #include "nsUnicharUtils.h" 16 17 namespace mozilla::dom::payments { 18 19 /* PaymentMethodData */ 20 21 NS_IMPL_ISUPPORTS(PaymentMethodData, nsIPaymentMethodData) 22 23 PaymentMethodData::PaymentMethodData(const nsAString& aSupportedMethods, 24 const nsAString& aData) 25 : mSupportedMethods(aSupportedMethods), mData(aData) {} 26 27 nsresult PaymentMethodData::Create(const IPCPaymentMethodData& aIPCMethodData, 28 nsIPaymentMethodData** aMethodData) { 29 NS_ENSURE_ARG_POINTER(aMethodData); 30 nsCOMPtr<nsIPaymentMethodData> methodData = new PaymentMethodData( 31 aIPCMethodData.supportedMethods(), aIPCMethodData.data()); 32 methodData.forget(aMethodData); 33 return NS_OK; 34 } 35 36 NS_IMETHODIMP 37 PaymentMethodData::GetSupportedMethods(nsAString& aSupportedMethods) { 38 aSupportedMethods = mSupportedMethods; 39 return NS_OK; 40 } 41 42 NS_IMETHODIMP 43 PaymentMethodData::GetData(JSContext* aCx, JS::MutableHandle<JS::Value> aData) { 44 if (mData.IsEmpty()) { 45 aData.set(JS::NullValue()); 46 return NS_OK; 47 } 48 nsresult rv = DeserializeToJSValue(mData, aCx, aData); 49 if (NS_WARN_IF(NS_FAILED(rv))) { 50 return rv; 51 } 52 return NS_OK; 53 } 54 55 /* PaymentCurrencyAmount */ 56 57 NS_IMPL_ISUPPORTS(PaymentCurrencyAmount, nsIPaymentCurrencyAmount) 58 59 PaymentCurrencyAmount::PaymentCurrencyAmount(const nsAString& aCurrency, 60 const nsAString& aValue) 61 : mValue(aValue) { 62 /* 63 * According to the spec 64 * https://w3c.github.io/payment-request/#validity-checkers 65 * Set amount.currency to the result of ASCII uppercasing amount.currency. 66 */ 67 ToUpperCase(aCurrency, mCurrency); 68 } 69 70 nsresult PaymentCurrencyAmount::Create( 71 const IPCPaymentCurrencyAmount& aIPCAmount, 72 nsIPaymentCurrencyAmount** aAmount) { 73 NS_ENSURE_ARG_POINTER(aAmount); 74 nsCOMPtr<nsIPaymentCurrencyAmount> amount = 75 new PaymentCurrencyAmount(aIPCAmount.currency(), aIPCAmount.value()); 76 amount.forget(aAmount); 77 return NS_OK; 78 } 79 80 NS_IMETHODIMP 81 PaymentCurrencyAmount::GetCurrency(nsAString& aCurrency) { 82 aCurrency = mCurrency; 83 return NS_OK; 84 } 85 86 NS_IMETHODIMP 87 PaymentCurrencyAmount::GetValue(nsAString& aValue) { 88 aValue = mValue; 89 return NS_OK; 90 } 91 92 /* PaymentItem */ 93 94 NS_IMPL_ISUPPORTS(PaymentItem, nsIPaymentItem) 95 96 PaymentItem::PaymentItem(const nsAString& aLabel, 97 nsIPaymentCurrencyAmount* aAmount, const bool aPending) 98 : mLabel(aLabel), mAmount(aAmount), mPending(aPending) {} 99 100 nsresult PaymentItem::Create(const IPCPaymentItem& aIPCItem, 101 nsIPaymentItem** aItem) { 102 NS_ENSURE_ARG_POINTER(aItem); 103 nsCOMPtr<nsIPaymentCurrencyAmount> amount; 104 nsresult rv = 105 PaymentCurrencyAmount::Create(aIPCItem.amount(), getter_AddRefs(amount)); 106 if (NS_WARN_IF(NS_FAILED(rv))) { 107 return rv; 108 } 109 nsCOMPtr<nsIPaymentItem> item = 110 new PaymentItem(aIPCItem.label(), amount, aIPCItem.pending()); 111 item.forget(aItem); 112 return NS_OK; 113 } 114 115 NS_IMETHODIMP 116 PaymentItem::GetLabel(nsAString& aLabel) { 117 aLabel = mLabel; 118 return NS_OK; 119 } 120 121 NS_IMETHODIMP 122 PaymentItem::GetAmount(nsIPaymentCurrencyAmount** aAmount) { 123 NS_ENSURE_ARG_POINTER(aAmount); 124 MOZ_ASSERT(mAmount); 125 nsCOMPtr<nsIPaymentCurrencyAmount> amount = mAmount; 126 amount.forget(aAmount); 127 return NS_OK; 128 } 129 130 NS_IMETHODIMP 131 PaymentItem::GetPending(bool* aPending) { 132 NS_ENSURE_ARG_POINTER(aPending); 133 *aPending = mPending; 134 return NS_OK; 135 } 136 137 /* PaymentDetailsModifier */ 138 139 NS_IMPL_ISUPPORTS(PaymentDetailsModifier, nsIPaymentDetailsModifier) 140 141 PaymentDetailsModifier::PaymentDetailsModifier( 142 const nsAString& aSupportedMethods, nsIPaymentItem* aTotal, 143 nsIArray* aAdditionalDisplayItems, const nsAString& aData) 144 : mSupportedMethods(aSupportedMethods), 145 mTotal(aTotal), 146 mAdditionalDisplayItems(aAdditionalDisplayItems), 147 mData(aData) {} 148 149 nsresult PaymentDetailsModifier::Create( 150 const IPCPaymentDetailsModifier& aIPCModifier, 151 nsIPaymentDetailsModifier** aModifier) { 152 NS_ENSURE_ARG_POINTER(aModifier); 153 nsCOMPtr<nsIPaymentItem> total; 154 nsresult rv = 155 PaymentItem::Create(aIPCModifier.total(), getter_AddRefs(total)); 156 if (NS_WARN_IF(NS_FAILED(rv))) { 157 return rv; 158 } 159 160 nsCOMPtr<nsIArray> displayItems; 161 if (aIPCModifier.additionalDisplayItemsPassed()) { 162 nsCOMPtr<nsIMutableArray> items = do_CreateInstance(NS_ARRAY_CONTRACTID); 163 MOZ_ASSERT(items); 164 for (const IPCPaymentItem& item : aIPCModifier.additionalDisplayItems()) { 165 nsCOMPtr<nsIPaymentItem> additionalItem; 166 rv = PaymentItem::Create(item, getter_AddRefs(additionalItem)); 167 if (NS_WARN_IF(NS_FAILED(rv))) { 168 return rv; 169 } 170 rv = items->AppendElement(additionalItem); 171 if (NS_WARN_IF(NS_FAILED(rv))) { 172 return rv; 173 } 174 } 175 displayItems = std::move(items); 176 } 177 nsCOMPtr<nsIPaymentDetailsModifier> modifier = 178 new PaymentDetailsModifier(aIPCModifier.supportedMethods(), total, 179 displayItems, aIPCModifier.data()); 180 modifier.forget(aModifier); 181 return NS_OK; 182 } 183 184 NS_IMETHODIMP 185 PaymentDetailsModifier::GetSupportedMethods(nsAString& aSupportedMethods) { 186 aSupportedMethods = mSupportedMethods; 187 return NS_OK; 188 } 189 190 NS_IMETHODIMP 191 PaymentDetailsModifier::GetTotal(nsIPaymentItem** aTotal) { 192 NS_ENSURE_ARG_POINTER(aTotal); 193 MOZ_ASSERT(mTotal); 194 nsCOMPtr<nsIPaymentItem> total = mTotal; 195 total.forget(aTotal); 196 return NS_OK; 197 } 198 199 NS_IMETHODIMP 200 PaymentDetailsModifier::GetAdditionalDisplayItems( 201 nsIArray** aAdditionalDisplayItems) { 202 NS_ENSURE_ARG_POINTER(aAdditionalDisplayItems); 203 nsCOMPtr<nsIArray> additionalItems = mAdditionalDisplayItems; 204 additionalItems.forget(aAdditionalDisplayItems); 205 return NS_OK; 206 } 207 208 NS_IMETHODIMP 209 PaymentDetailsModifier::GetData(JSContext* aCx, 210 JS::MutableHandle<JS::Value> aData) { 211 if (mData.IsEmpty()) { 212 aData.set(JS::NullValue()); 213 return NS_OK; 214 } 215 nsresult rv = DeserializeToJSValue(mData, aCx, aData); 216 if (NS_WARN_IF(NS_FAILED(rv))) { 217 return rv; 218 } 219 return NS_OK; 220 } 221 222 /* PaymentShippingOption */ 223 224 NS_IMPL_ISUPPORTS(PaymentShippingOption, nsIPaymentShippingOption) 225 226 PaymentShippingOption::PaymentShippingOption(const nsAString& aId, 227 const nsAString& aLabel, 228 nsIPaymentCurrencyAmount* aAmount, 229 const bool aSelected) 230 : mId(aId), mLabel(aLabel), mAmount(aAmount), mSelected(aSelected) {} 231 232 nsresult PaymentShippingOption::Create( 233 const IPCPaymentShippingOption& aIPCOption, 234 nsIPaymentShippingOption** aOption) { 235 NS_ENSURE_ARG_POINTER(aOption); 236 nsCOMPtr<nsIPaymentCurrencyAmount> amount; 237 nsresult rv = PaymentCurrencyAmount::Create(aIPCOption.amount(), 238 getter_AddRefs(amount)); 239 if (NS_WARN_IF(NS_FAILED(rv))) { 240 return rv; 241 } 242 nsCOMPtr<nsIPaymentShippingOption> option = new PaymentShippingOption( 243 aIPCOption.id(), aIPCOption.label(), amount, aIPCOption.selected()); 244 option.forget(aOption); 245 return NS_OK; 246 } 247 248 NS_IMETHODIMP 249 PaymentShippingOption::GetId(nsAString& aId) { 250 aId = mId; 251 return NS_OK; 252 } 253 254 NS_IMETHODIMP 255 PaymentShippingOption::GetLabel(nsAString& aLabel) { 256 aLabel = mLabel; 257 return NS_OK; 258 } 259 260 NS_IMETHODIMP 261 PaymentShippingOption::GetAmount(nsIPaymentCurrencyAmount** aAmount) { 262 NS_ENSURE_ARG_POINTER(aAmount); 263 MOZ_ASSERT(mAmount); 264 nsCOMPtr<nsIPaymentCurrencyAmount> amount = mAmount; 265 amount.forget(aAmount); 266 return NS_OK; 267 } 268 269 NS_IMETHODIMP 270 PaymentShippingOption::GetSelected(bool* aSelected) { 271 NS_ENSURE_ARG_POINTER(aSelected); 272 *aSelected = mSelected; 273 return NS_OK; 274 } 275 276 NS_IMETHODIMP 277 PaymentShippingOption::SetSelected(bool aSelected) { 278 mSelected = aSelected; 279 return NS_OK; 280 } 281 282 /* PaymentDetails */ 283 284 NS_IMPL_ISUPPORTS(PaymentDetails, nsIPaymentDetails) 285 286 PaymentDetails::PaymentDetails(const nsAString& aId, nsIPaymentItem* aTotalItem, 287 nsIArray* aDisplayItems, 288 nsIArray* aShippingOptions, nsIArray* aModifiers, 289 const nsAString& aError, 290 const nsAString& aShippingAddressErrors, 291 const nsAString& aPayerErrors, 292 const nsAString& aPaymentMethodErrors) 293 : mId(aId), 294 mTotalItem(aTotalItem), 295 mDisplayItems(aDisplayItems), 296 mShippingOptions(aShippingOptions), 297 mModifiers(aModifiers), 298 mError(aError), 299 mShippingAddressErrors(aShippingAddressErrors), 300 mPayerErrors(aPayerErrors), 301 mPaymentMethodErrors(aPaymentMethodErrors) {} 302 303 nsresult PaymentDetails::Create(const IPCPaymentDetails& aIPCDetails, 304 nsIPaymentDetails** aDetails) { 305 NS_ENSURE_ARG_POINTER(aDetails); 306 307 nsCOMPtr<nsIPaymentItem> total; 308 nsresult rv = PaymentItem::Create(aIPCDetails.total(), getter_AddRefs(total)); 309 if (NS_WARN_IF(NS_FAILED(rv))) { 310 return rv; 311 } 312 313 nsCOMPtr<nsIArray> displayItems; 314 nsCOMPtr<nsIMutableArray> items = do_CreateInstance(NS_ARRAY_CONTRACTID); 315 MOZ_ASSERT(items); 316 for (const IPCPaymentItem& displayItem : aIPCDetails.displayItems()) { 317 nsCOMPtr<nsIPaymentItem> item; 318 rv = PaymentItem::Create(displayItem, getter_AddRefs(item)); 319 if (NS_WARN_IF(NS_FAILED(rv))) { 320 return rv; 321 } 322 rv = items->AppendElement(item); 323 if (NS_WARN_IF(NS_FAILED(rv))) { 324 return rv; 325 } 326 } 327 displayItems = std::move(items); 328 329 nsCOMPtr<nsIArray> shippingOptions; 330 nsCOMPtr<nsIMutableArray> options = do_CreateInstance(NS_ARRAY_CONTRACTID); 331 MOZ_ASSERT(options); 332 for (const IPCPaymentShippingOption& shippingOption : 333 aIPCDetails.shippingOptions()) { 334 nsCOMPtr<nsIPaymentShippingOption> option; 335 rv = PaymentShippingOption::Create(shippingOption, getter_AddRefs(option)); 336 if (NS_WARN_IF(NS_FAILED(rv))) { 337 return rv; 338 } 339 rv = options->AppendElement(option); 340 if (NS_WARN_IF(NS_FAILED(rv))) { 341 return rv; 342 } 343 } 344 shippingOptions = std::move(options); 345 346 nsCOMPtr<nsIArray> modifiers; 347 nsCOMPtr<nsIMutableArray> detailsModifiers = 348 do_CreateInstance(NS_ARRAY_CONTRACTID); 349 MOZ_ASSERT(detailsModifiers); 350 for (const IPCPaymentDetailsModifier& modifier : aIPCDetails.modifiers()) { 351 nsCOMPtr<nsIPaymentDetailsModifier> detailsModifier; 352 rv = PaymentDetailsModifier::Create(modifier, 353 getter_AddRefs(detailsModifier)); 354 if (NS_WARN_IF(NS_FAILED(rv))) { 355 return rv; 356 } 357 rv = detailsModifiers->AppendElement(detailsModifier); 358 if (NS_WARN_IF(NS_FAILED(rv))) { 359 return rv; 360 } 361 } 362 modifiers = std::move(detailsModifiers); 363 364 nsCOMPtr<nsIPaymentDetails> details = new PaymentDetails( 365 aIPCDetails.id(), total, displayItems, shippingOptions, modifiers, 366 aIPCDetails.error(), aIPCDetails.shippingAddressErrors(), 367 aIPCDetails.payerErrors(), aIPCDetails.paymentMethodErrors()); 368 369 details.forget(aDetails); 370 return NS_OK; 371 } 372 373 NS_IMETHODIMP 374 PaymentDetails::GetId(nsAString& aId) { 375 aId = mId; 376 return NS_OK; 377 } 378 379 NS_IMETHODIMP 380 PaymentDetails::GetTotalItem(nsIPaymentItem** aTotalItem) { 381 NS_ENSURE_ARG_POINTER(aTotalItem); 382 MOZ_ASSERT(mTotalItem); 383 nsCOMPtr<nsIPaymentItem> total = mTotalItem; 384 total.forget(aTotalItem); 385 return NS_OK; 386 } 387 388 NS_IMETHODIMP 389 PaymentDetails::GetDisplayItems(nsIArray** aDisplayItems) { 390 NS_ENSURE_ARG_POINTER(aDisplayItems); 391 nsCOMPtr<nsIArray> displayItems = mDisplayItems; 392 displayItems.forget(aDisplayItems); 393 return NS_OK; 394 } 395 396 NS_IMETHODIMP 397 PaymentDetails::GetShippingOptions(nsIArray** aShippingOptions) { 398 NS_ENSURE_ARG_POINTER(aShippingOptions); 399 nsCOMPtr<nsIArray> options = mShippingOptions; 400 options.forget(aShippingOptions); 401 return NS_OK; 402 } 403 404 NS_IMETHODIMP 405 PaymentDetails::GetModifiers(nsIArray** aModifiers) { 406 NS_ENSURE_ARG_POINTER(aModifiers); 407 nsCOMPtr<nsIArray> modifiers = mModifiers; 408 modifiers.forget(aModifiers); 409 return NS_OK; 410 } 411 412 NS_IMETHODIMP 413 PaymentDetails::GetError(nsAString& aError) { 414 aError = mError; 415 return NS_OK; 416 } 417 418 NS_IMETHODIMP 419 PaymentDetails::GetShippingAddressErrors(JSContext* aCx, 420 JS::MutableHandle<JS::Value> aErrors) { 421 AddressErrors errors; 422 errors.Init(mShippingAddressErrors); 423 if (!ToJSValue(aCx, errors, aErrors)) { 424 return NS_ERROR_FAILURE; 425 } 426 return NS_OK; 427 } 428 429 NS_IMETHODIMP 430 PaymentDetails::GetPayerErrors(JSContext* aCx, 431 JS::MutableHandle<JS::Value> aErrors) { 432 PayerErrors errors; 433 errors.Init(mPayerErrors); 434 if (!ToJSValue(aCx, errors, aErrors)) { 435 return NS_ERROR_FAILURE; 436 } 437 return NS_OK; 438 } 439 440 NS_IMETHODIMP 441 PaymentDetails::GetPaymentMethodErrors(JSContext* aCx, 442 JS::MutableHandle<JS::Value> aErrors) { 443 if (mPaymentMethodErrors.IsEmpty()) { 444 aErrors.set(JS::NullValue()); 445 return NS_OK; 446 } 447 nsresult rv = DeserializeToJSValue(mPaymentMethodErrors, aCx, aErrors); 448 if (NS_WARN_IF(NS_FAILED(rv))) { 449 return rv; 450 } 451 return NS_OK; 452 } 453 454 nsresult PaymentDetails::Update(nsIPaymentDetails* aDetails, 455 const bool aRequestShipping) { 456 MOZ_ASSERT(aDetails); 457 /* 458 * According to the spec [1], update the attributes if they present in new 459 * details (i.e., PaymentDetailsUpdate); otherwise, keep original value. 460 * Note |id| comes only from initial details (i.e., PaymentDetailsInit) and 461 * |error| only from new details. 462 * 463 * [1] https://www.w3.org/TR/payment-request/#updatewith-method 464 */ 465 466 nsresult rv = aDetails->GetTotalItem(getter_AddRefs(mTotalItem)); 467 if (NS_WARN_IF(NS_FAILED(rv))) { 468 return rv; 469 } 470 471 nsCOMPtr<nsIArray> displayItems; 472 rv = aDetails->GetDisplayItems(getter_AddRefs(displayItems)); 473 if (NS_WARN_IF(NS_FAILED(rv))) { 474 return rv; 475 } 476 if (displayItems) { 477 mDisplayItems = displayItems; 478 } 479 480 if (aRequestShipping) { 481 nsCOMPtr<nsIArray> shippingOptions; 482 rv = aDetails->GetShippingOptions(getter_AddRefs(shippingOptions)); 483 if (NS_WARN_IF(NS_FAILED(rv))) { 484 return rv; 485 } 486 mShippingOptions = shippingOptions; 487 } 488 489 nsCOMPtr<nsIArray> modifiers; 490 rv = aDetails->GetModifiers(getter_AddRefs(modifiers)); 491 if (NS_WARN_IF(NS_FAILED(rv))) { 492 return rv; 493 } 494 if (modifiers) { 495 mModifiers = modifiers; 496 } 497 498 rv = aDetails->GetError(mError); 499 if (NS_WARN_IF(NS_FAILED(rv))) { 500 return rv; 501 } 502 503 PaymentDetails* rowDetails = static_cast<PaymentDetails*>(aDetails); 504 MOZ_ASSERT(rowDetails); 505 mShippingAddressErrors = rowDetails->GetShippingAddressErrors(); 506 mPayerErrors = rowDetails->GetPayerErrors(); 507 mPaymentMethodErrors = rowDetails->GetPaymentMethodErrors(); 508 509 return NS_OK; 510 } 511 512 const nsString& PaymentDetails::GetShippingAddressErrors() const { 513 return mShippingAddressErrors; 514 } 515 516 const nsString& PaymentDetails::GetPayerErrors() const { return mPayerErrors; } 517 518 const nsString& PaymentDetails::GetPaymentMethodErrors() const { 519 return mPaymentMethodErrors; 520 } 521 522 nsresult PaymentDetails::UpdateErrors(const nsAString& aError, 523 const nsAString& aPayerErrors, 524 const nsAString& aPaymentMethodErrors, 525 const nsAString& aShippingAddressErrors) { 526 mError = aError; 527 mPayerErrors = aPayerErrors; 528 mPaymentMethodErrors = aPaymentMethodErrors; 529 mShippingAddressErrors = aShippingAddressErrors; 530 return NS_OK; 531 } 532 533 /* PaymentOptions */ 534 535 NS_IMPL_ISUPPORTS(PaymentOptions, nsIPaymentOptions) 536 537 PaymentOptions::PaymentOptions(const bool aRequestPayerName, 538 const bool aRequestPayerEmail, 539 const bool aRequestPayerPhone, 540 const bool aRequestShipping, 541 const bool aRequestBillingAddress, 542 const nsAString& aShippingType) 543 : mRequestPayerName(aRequestPayerName), 544 mRequestPayerEmail(aRequestPayerEmail), 545 mRequestPayerPhone(aRequestPayerPhone), 546 mRequestShipping(aRequestShipping), 547 mRequestBillingAddress(aRequestBillingAddress), 548 mShippingType(aShippingType) {} 549 550 nsresult PaymentOptions::Create(const IPCPaymentOptions& aIPCOptions, 551 nsIPaymentOptions** aOptions) { 552 NS_ENSURE_ARG_POINTER(aOptions); 553 554 nsCOMPtr<nsIPaymentOptions> options = new PaymentOptions( 555 aIPCOptions.requestPayerName(), aIPCOptions.requestPayerEmail(), 556 aIPCOptions.requestPayerPhone(), aIPCOptions.requestShipping(), 557 aIPCOptions.requestBillingAddress(), aIPCOptions.shippingType()); 558 options.forget(aOptions); 559 return NS_OK; 560 } 561 562 NS_IMETHODIMP 563 PaymentOptions::GetRequestPayerName(bool* aRequestPayerName) { 564 NS_ENSURE_ARG_POINTER(aRequestPayerName); 565 *aRequestPayerName = mRequestPayerName; 566 return NS_OK; 567 } 568 569 NS_IMETHODIMP 570 PaymentOptions::GetRequestPayerEmail(bool* aRequestPayerEmail) { 571 NS_ENSURE_ARG_POINTER(aRequestPayerEmail); 572 *aRequestPayerEmail = mRequestPayerEmail; 573 return NS_OK; 574 } 575 576 NS_IMETHODIMP 577 PaymentOptions::GetRequestPayerPhone(bool* aRequestPayerPhone) { 578 NS_ENSURE_ARG_POINTER(aRequestPayerPhone); 579 *aRequestPayerPhone = mRequestPayerPhone; 580 return NS_OK; 581 } 582 583 NS_IMETHODIMP 584 PaymentOptions::GetRequestShipping(bool* aRequestShipping) { 585 NS_ENSURE_ARG_POINTER(aRequestShipping); 586 *aRequestShipping = mRequestShipping; 587 return NS_OK; 588 } 589 590 NS_IMETHODIMP 591 PaymentOptions::GetRequestBillingAddress(bool* aRequestBillingAddress) { 592 NS_ENSURE_ARG_POINTER(aRequestBillingAddress); 593 *aRequestBillingAddress = mRequestBillingAddress; 594 return NS_OK; 595 } 596 597 NS_IMETHODIMP 598 PaymentOptions::GetShippingType(nsAString& aShippingType) { 599 aShippingType = mShippingType; 600 return NS_OK; 601 } 602 603 /* PaymentReqeust */ 604 605 NS_IMPL_ISUPPORTS(PaymentRequest, nsIPaymentRequest) 606 607 PaymentRequest::PaymentRequest(const uint64_t aTopOuterWindowId, 608 const nsAString& aRequestId, 609 nsIPrincipal* aTopLevelPrincipal, 610 nsIArray* aPaymentMethods, 611 nsIPaymentDetails* aPaymentDetails, 612 nsIPaymentOptions* aPaymentOptions, 613 const nsAString& aShippingOption) 614 : mTopOuterWindowId(aTopOuterWindowId), 615 mRequestId(aRequestId), 616 mTopLevelPrincipal(aTopLevelPrincipal), 617 mPaymentMethods(aPaymentMethods), 618 mPaymentDetails(aPaymentDetails), 619 mPaymentOptions(aPaymentOptions), 620 mShippingOption(aShippingOption), 621 mState(eCreated) {} 622 623 NS_IMETHODIMP 624 PaymentRequest::GetTopOuterWindowId(uint64_t* aTopOuterWindowId) { 625 NS_ENSURE_ARG_POINTER(aTopOuterWindowId); 626 *aTopOuterWindowId = mTopOuterWindowId; 627 return NS_OK; 628 } 629 630 NS_IMETHODIMP 631 PaymentRequest::GetTopLevelPrincipal(nsIPrincipal** aTopLevelPrincipal) { 632 NS_ENSURE_ARG_POINTER(aTopLevelPrincipal); 633 MOZ_ASSERT(mTopLevelPrincipal); 634 nsCOMPtr<nsIPrincipal> principal = mTopLevelPrincipal; 635 principal.forget(aTopLevelPrincipal); 636 return NS_OK; 637 } 638 639 NS_IMETHODIMP 640 PaymentRequest::GetRequestId(nsAString& aRequestId) { 641 aRequestId = mRequestId; 642 return NS_OK; 643 } 644 645 NS_IMETHODIMP 646 PaymentRequest::GetPaymentMethods(nsIArray** aPaymentMethods) { 647 NS_ENSURE_ARG_POINTER(aPaymentMethods); 648 MOZ_ASSERT(mPaymentMethods); 649 nsCOMPtr<nsIArray> methods = mPaymentMethods; 650 methods.forget(aPaymentMethods); 651 return NS_OK; 652 } 653 654 NS_IMETHODIMP 655 PaymentRequest::GetPaymentDetails(nsIPaymentDetails** aPaymentDetails) { 656 NS_ENSURE_ARG_POINTER(aPaymentDetails); 657 MOZ_ASSERT(mPaymentDetails); 658 nsCOMPtr<nsIPaymentDetails> details = mPaymentDetails; 659 details.forget(aPaymentDetails); 660 return NS_OK; 661 } 662 663 NS_IMETHODIMP 664 PaymentRequest::GetPaymentOptions(nsIPaymentOptions** aPaymentOptions) { 665 NS_ENSURE_ARG_POINTER(aPaymentOptions); 666 MOZ_ASSERT(mPaymentOptions); 667 nsCOMPtr<nsIPaymentOptions> options = mPaymentOptions; 668 options.forget(aPaymentOptions); 669 return NS_OK; 670 } 671 672 NS_IMETHODIMP 673 PaymentRequest::GetShippingOption(nsAString& aShippingOption) { 674 aShippingOption = mShippingOption; 675 return NS_OK; 676 } 677 678 nsresult PaymentRequest::UpdatePaymentDetails( 679 nsIPaymentDetails* aPaymentDetails, const nsAString& aShippingOption) { 680 MOZ_ASSERT(aPaymentDetails); 681 bool requestShipping; 682 nsresult rv = mPaymentOptions->GetRequestShipping(&requestShipping); 683 if (NS_WARN_IF(NS_FAILED(rv))) { 684 return rv; 685 } 686 mShippingOption = aShippingOption; 687 688 PaymentDetails* rowDetails = 689 static_cast<PaymentDetails*>(mPaymentDetails.get()); 690 MOZ_ASSERT(rowDetails); 691 return rowDetails->Update(aPaymentDetails, requestShipping); 692 } 693 694 void PaymentRequest::SetCompleteStatus(const nsAString& aCompleteStatus) { 695 mCompleteStatus = aCompleteStatus; 696 } 697 698 nsresult PaymentRequest::UpdateErrors(const nsAString& aError, 699 const nsAString& aPayerErrors, 700 const nsAString& aPaymentMethodErrors, 701 const nsAString& aShippingAddressErrors) { 702 PaymentDetails* rowDetails = 703 static_cast<PaymentDetails*>(mPaymentDetails.get()); 704 MOZ_ASSERT(rowDetails); 705 return rowDetails->UpdateErrors(aError, aPayerErrors, aPaymentMethodErrors, 706 aShippingAddressErrors); 707 } 708 709 NS_IMETHODIMP 710 PaymentRequest::GetCompleteStatus(nsAString& aCompleteStatus) { 711 aCompleteStatus = mCompleteStatus; 712 return NS_OK; 713 } 714 715 /* PaymentAddress */ 716 717 NS_IMPL_ISUPPORTS(PaymentAddress, nsIPaymentAddress) 718 719 NS_IMETHODIMP 720 PaymentAddress::Init(const nsAString& aCountry, nsIArray* aAddressLine, 721 const nsAString& aRegion, const nsAString& aRegionCode, 722 const nsAString& aCity, 723 const nsAString& aDependentLocality, 724 const nsAString& aPostalCode, 725 const nsAString& aSortingCode, 726 const nsAString& aOrganization, 727 const nsAString& aRecipient, const nsAString& aPhone) { 728 mCountry = aCountry; 729 mAddressLine = aAddressLine; 730 mRegion = aRegion; 731 mRegionCode = aRegionCode; 732 mCity = aCity; 733 mDependentLocality = aDependentLocality; 734 mPostalCode = aPostalCode; 735 mSortingCode = aSortingCode; 736 mOrganization = aOrganization; 737 mRecipient = aRecipient; 738 mPhone = aPhone; 739 return NS_OK; 740 } 741 742 NS_IMETHODIMP 743 PaymentAddress::GetCountry(nsAString& aCountry) { 744 aCountry = mCountry; 745 return NS_OK; 746 } 747 748 NS_IMETHODIMP 749 PaymentAddress::GetAddressLine(nsIArray** aAddressLine) { 750 NS_ENSURE_ARG_POINTER(aAddressLine); 751 nsCOMPtr<nsIArray> addressLine = mAddressLine; 752 addressLine.forget(aAddressLine); 753 return NS_OK; 754 } 755 756 NS_IMETHODIMP 757 PaymentAddress::GetRegion(nsAString& aRegion) { 758 aRegion = mRegion; 759 return NS_OK; 760 } 761 762 NS_IMETHODIMP 763 PaymentAddress::GetRegionCode(nsAString& aRegionCode) { 764 aRegionCode = mRegionCode; 765 return NS_OK; 766 } 767 768 NS_IMETHODIMP 769 PaymentAddress::GetCity(nsAString& aCity) { 770 aCity = mCity; 771 return NS_OK; 772 } 773 774 NS_IMETHODIMP 775 PaymentAddress::GetDependentLocality(nsAString& aDependentLocality) { 776 aDependentLocality = mDependentLocality; 777 return NS_OK; 778 } 779 780 NS_IMETHODIMP 781 PaymentAddress::GetPostalCode(nsAString& aPostalCode) { 782 aPostalCode = mPostalCode; 783 return NS_OK; 784 } 785 786 NS_IMETHODIMP 787 PaymentAddress::GetSortingCode(nsAString& aSortingCode) { 788 aSortingCode = mSortingCode; 789 return NS_OK; 790 } 791 792 NS_IMETHODIMP 793 PaymentAddress::GetOrganization(nsAString& aOrganization) { 794 aOrganization = mOrganization; 795 return NS_OK; 796 } 797 798 NS_IMETHODIMP 799 PaymentAddress::GetRecipient(nsAString& aRecipient) { 800 aRecipient = mRecipient; 801 return NS_OK; 802 } 803 804 NS_IMETHODIMP 805 PaymentAddress::GetPhone(nsAString& aPhone) { 806 aPhone = mPhone; 807 return NS_OK; 808 } 809 810 } // namespace mozilla::dom::payments