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/. */
7 #include "mozilla/dom/PaymentRequestBinding.h"
8 #include "mozilla/dom/ToJSValue.h"
9 #include "nsArrayUtils.h"
10 #include "nsComponentManagerUtils.h"
11 #include "nsIMutableArray.h"
12 #include "nsUnicharUtils.h"
13 #include "PaymentRequestData.h"
14 #include "PaymentRequestUtils.h"
16 namespace mozilla::dom::payments
{
18 /* PaymentMethodData */
20 NS_IMPL_ISUPPORTS(PaymentMethodData
, nsIPaymentMethodData
)
22 PaymentMethodData::PaymentMethodData(const nsAString
& aSupportedMethods
,
23 const nsAString
& aData
)
24 : mSupportedMethods(aSupportedMethods
), mData(aData
) {}
26 nsresult
PaymentMethodData::Create(const IPCPaymentMethodData
& aIPCMethodData
,
27 nsIPaymentMethodData
** aMethodData
) {
28 NS_ENSURE_ARG_POINTER(aMethodData
);
29 nsCOMPtr
<nsIPaymentMethodData
> methodData
= new PaymentMethodData(
30 aIPCMethodData
.supportedMethods(), aIPCMethodData
.data());
31 methodData
.forget(aMethodData
);
36 PaymentMethodData::GetSupportedMethods(nsAString
& aSupportedMethods
) {
37 aSupportedMethods
= mSupportedMethods
;
42 PaymentMethodData::GetData(JSContext
* aCx
, JS::MutableHandle
<JS::Value
> aData
) {
43 if (mData
.IsEmpty()) {
44 aData
.set(JS::NullValue());
47 nsresult rv
= DeserializeToJSValue(mData
, aCx
, aData
);
48 if (NS_WARN_IF(NS_FAILED(rv
))) {
54 /* PaymentCurrencyAmount */
56 NS_IMPL_ISUPPORTS(PaymentCurrencyAmount
, nsIPaymentCurrencyAmount
)
58 PaymentCurrencyAmount::PaymentCurrencyAmount(const nsAString
& aCurrency
,
59 const nsAString
& aValue
)
62 * According to the spec
63 * https://w3c.github.io/payment-request/#validity-checkers
64 * Set amount.currency to the result of ASCII uppercasing amount.currency.
66 ToUpperCase(aCurrency
, mCurrency
);
69 nsresult
PaymentCurrencyAmount::Create(
70 const IPCPaymentCurrencyAmount
& aIPCAmount
,
71 nsIPaymentCurrencyAmount
** aAmount
) {
72 NS_ENSURE_ARG_POINTER(aAmount
);
73 nsCOMPtr
<nsIPaymentCurrencyAmount
> amount
=
74 new PaymentCurrencyAmount(aIPCAmount
.currency(), aIPCAmount
.value());
75 amount
.forget(aAmount
);
80 PaymentCurrencyAmount::GetCurrency(nsAString
& aCurrency
) {
81 aCurrency
= mCurrency
;
86 PaymentCurrencyAmount::GetValue(nsAString
& aValue
) {
93 NS_IMPL_ISUPPORTS(PaymentItem
, nsIPaymentItem
)
95 PaymentItem::PaymentItem(const nsAString
& aLabel
,
96 nsIPaymentCurrencyAmount
* aAmount
, const bool aPending
)
97 : mLabel(aLabel
), mAmount(aAmount
), mPending(aPending
) {}
99 nsresult
PaymentItem::Create(const IPCPaymentItem
& aIPCItem
,
100 nsIPaymentItem
** aItem
) {
101 NS_ENSURE_ARG_POINTER(aItem
);
102 nsCOMPtr
<nsIPaymentCurrencyAmount
> amount
;
104 PaymentCurrencyAmount::Create(aIPCItem
.amount(), getter_AddRefs(amount
));
105 if (NS_WARN_IF(NS_FAILED(rv
))) {
108 nsCOMPtr
<nsIPaymentItem
> item
=
109 new PaymentItem(aIPCItem
.label(), amount
, aIPCItem
.pending());
115 PaymentItem::GetLabel(nsAString
& aLabel
) {
121 PaymentItem::GetAmount(nsIPaymentCurrencyAmount
** aAmount
) {
122 NS_ENSURE_ARG_POINTER(aAmount
);
124 nsCOMPtr
<nsIPaymentCurrencyAmount
> amount
= mAmount
;
125 amount
.forget(aAmount
);
130 PaymentItem::GetPending(bool* aPending
) {
131 NS_ENSURE_ARG_POINTER(aPending
);
132 *aPending
= mPending
;
136 /* PaymentDetailsModifier */
138 NS_IMPL_ISUPPORTS(PaymentDetailsModifier
, nsIPaymentDetailsModifier
)
140 PaymentDetailsModifier::PaymentDetailsModifier(
141 const nsAString
& aSupportedMethods
, nsIPaymentItem
* aTotal
,
142 nsIArray
* aAdditionalDisplayItems
, const nsAString
& aData
)
143 : mSupportedMethods(aSupportedMethods
),
145 mAdditionalDisplayItems(aAdditionalDisplayItems
),
148 nsresult
PaymentDetailsModifier::Create(
149 const IPCPaymentDetailsModifier
& aIPCModifier
,
150 nsIPaymentDetailsModifier
** aModifier
) {
151 NS_ENSURE_ARG_POINTER(aModifier
);
152 nsCOMPtr
<nsIPaymentItem
> total
;
154 PaymentItem::Create(aIPCModifier
.total(), getter_AddRefs(total
));
155 if (NS_WARN_IF(NS_FAILED(rv
))) {
159 nsCOMPtr
<nsIArray
> displayItems
;
160 if (aIPCModifier
.additionalDisplayItemsPassed()) {
161 nsCOMPtr
<nsIMutableArray
> items
= do_CreateInstance(NS_ARRAY_CONTRACTID
);
163 for (const IPCPaymentItem
& item
: aIPCModifier
.additionalDisplayItems()) {
164 nsCOMPtr
<nsIPaymentItem
> additionalItem
;
165 rv
= PaymentItem::Create(item
, getter_AddRefs(additionalItem
));
166 if (NS_WARN_IF(NS_FAILED(rv
))) {
169 rv
= items
->AppendElement(additionalItem
);
170 if (NS_WARN_IF(NS_FAILED(rv
))) {
174 displayItems
= std::move(items
);
176 nsCOMPtr
<nsIPaymentDetailsModifier
> modifier
=
177 new PaymentDetailsModifier(aIPCModifier
.supportedMethods(), total
,
178 displayItems
, aIPCModifier
.data());
179 modifier
.forget(aModifier
);
184 PaymentDetailsModifier::GetSupportedMethods(nsAString
& aSupportedMethods
) {
185 aSupportedMethods
= mSupportedMethods
;
190 PaymentDetailsModifier::GetTotal(nsIPaymentItem
** aTotal
) {
191 NS_ENSURE_ARG_POINTER(aTotal
);
193 nsCOMPtr
<nsIPaymentItem
> total
= mTotal
;
194 total
.forget(aTotal
);
199 PaymentDetailsModifier::GetAdditionalDisplayItems(
200 nsIArray
** aAdditionalDisplayItems
) {
201 NS_ENSURE_ARG_POINTER(aAdditionalDisplayItems
);
202 nsCOMPtr
<nsIArray
> additionalItems
= mAdditionalDisplayItems
;
203 additionalItems
.forget(aAdditionalDisplayItems
);
208 PaymentDetailsModifier::GetData(JSContext
* aCx
,
209 JS::MutableHandle
<JS::Value
> aData
) {
210 if (mData
.IsEmpty()) {
211 aData
.set(JS::NullValue());
214 nsresult rv
= DeserializeToJSValue(mData
, aCx
, aData
);
215 if (NS_WARN_IF(NS_FAILED(rv
))) {
221 /* PaymentShippingOption */
223 NS_IMPL_ISUPPORTS(PaymentShippingOption
, nsIPaymentShippingOption
)
225 PaymentShippingOption::PaymentShippingOption(const nsAString
& aId
,
226 const nsAString
& aLabel
,
227 nsIPaymentCurrencyAmount
* aAmount
,
228 const bool aSelected
)
229 : mId(aId
), mLabel(aLabel
), mAmount(aAmount
), mSelected(aSelected
) {}
231 nsresult
PaymentShippingOption::Create(
232 const IPCPaymentShippingOption
& aIPCOption
,
233 nsIPaymentShippingOption
** aOption
) {
234 NS_ENSURE_ARG_POINTER(aOption
);
235 nsCOMPtr
<nsIPaymentCurrencyAmount
> amount
;
236 nsresult rv
= PaymentCurrencyAmount::Create(aIPCOption
.amount(),
237 getter_AddRefs(amount
));
238 if (NS_WARN_IF(NS_FAILED(rv
))) {
241 nsCOMPtr
<nsIPaymentShippingOption
> option
= new PaymentShippingOption(
242 aIPCOption
.id(), aIPCOption
.label(), amount
, aIPCOption
.selected());
243 option
.forget(aOption
);
248 PaymentShippingOption::GetId(nsAString
& aId
) {
254 PaymentShippingOption::GetLabel(nsAString
& aLabel
) {
260 PaymentShippingOption::GetAmount(nsIPaymentCurrencyAmount
** aAmount
) {
261 NS_ENSURE_ARG_POINTER(aAmount
);
263 nsCOMPtr
<nsIPaymentCurrencyAmount
> amount
= mAmount
;
264 amount
.forget(aAmount
);
269 PaymentShippingOption::GetSelected(bool* aSelected
) {
270 NS_ENSURE_ARG_POINTER(aSelected
);
271 *aSelected
= mSelected
;
276 PaymentShippingOption::SetSelected(bool aSelected
) {
277 mSelected
= aSelected
;
283 NS_IMPL_ISUPPORTS(PaymentDetails
, nsIPaymentDetails
)
285 PaymentDetails::PaymentDetails(const nsAString
& aId
, nsIPaymentItem
* aTotalItem
,
286 nsIArray
* aDisplayItems
,
287 nsIArray
* aShippingOptions
, nsIArray
* aModifiers
,
288 const nsAString
& aError
,
289 const nsAString
& aShippingAddressErrors
,
290 const nsAString
& aPayerErrors
,
291 const nsAString
& aPaymentMethodErrors
)
293 mTotalItem(aTotalItem
),
294 mDisplayItems(aDisplayItems
),
295 mShippingOptions(aShippingOptions
),
296 mModifiers(aModifiers
),
298 mShippingAddressErrors(aShippingAddressErrors
),
299 mPayerErrors(aPayerErrors
),
300 mPaymentMethodErrors(aPaymentMethodErrors
) {}
302 nsresult
PaymentDetails::Create(const IPCPaymentDetails
& aIPCDetails
,
303 nsIPaymentDetails
** aDetails
) {
304 NS_ENSURE_ARG_POINTER(aDetails
);
306 nsCOMPtr
<nsIPaymentItem
> total
;
307 nsresult rv
= PaymentItem::Create(aIPCDetails
.total(), getter_AddRefs(total
));
308 if (NS_WARN_IF(NS_FAILED(rv
))) {
312 nsCOMPtr
<nsIArray
> displayItems
;
313 nsCOMPtr
<nsIMutableArray
> items
= do_CreateInstance(NS_ARRAY_CONTRACTID
);
315 for (const IPCPaymentItem
& displayItem
: aIPCDetails
.displayItems()) {
316 nsCOMPtr
<nsIPaymentItem
> item
;
317 rv
= PaymentItem::Create(displayItem
, getter_AddRefs(item
));
318 if (NS_WARN_IF(NS_FAILED(rv
))) {
321 rv
= items
->AppendElement(item
);
322 if (NS_WARN_IF(NS_FAILED(rv
))) {
326 displayItems
= std::move(items
);
328 nsCOMPtr
<nsIArray
> shippingOptions
;
329 nsCOMPtr
<nsIMutableArray
> options
= do_CreateInstance(NS_ARRAY_CONTRACTID
);
331 for (const IPCPaymentShippingOption
& shippingOption
:
332 aIPCDetails
.shippingOptions()) {
333 nsCOMPtr
<nsIPaymentShippingOption
> option
;
334 rv
= PaymentShippingOption::Create(shippingOption
, getter_AddRefs(option
));
335 if (NS_WARN_IF(NS_FAILED(rv
))) {
338 rv
= options
->AppendElement(option
);
339 if (NS_WARN_IF(NS_FAILED(rv
))) {
343 shippingOptions
= std::move(options
);
345 nsCOMPtr
<nsIArray
> modifiers
;
346 nsCOMPtr
<nsIMutableArray
> detailsModifiers
=
347 do_CreateInstance(NS_ARRAY_CONTRACTID
);
348 MOZ_ASSERT(detailsModifiers
);
349 for (const IPCPaymentDetailsModifier
& modifier
: aIPCDetails
.modifiers()) {
350 nsCOMPtr
<nsIPaymentDetailsModifier
> detailsModifier
;
351 rv
= PaymentDetailsModifier::Create(modifier
,
352 getter_AddRefs(detailsModifier
));
353 if (NS_WARN_IF(NS_FAILED(rv
))) {
356 rv
= detailsModifiers
->AppendElement(detailsModifier
);
357 if (NS_WARN_IF(NS_FAILED(rv
))) {
361 modifiers
= std::move(detailsModifiers
);
363 nsCOMPtr
<nsIPaymentDetails
> details
= new PaymentDetails(
364 aIPCDetails
.id(), total
, displayItems
, shippingOptions
, modifiers
,
365 aIPCDetails
.error(), aIPCDetails
.shippingAddressErrors(),
366 aIPCDetails
.payerErrors(), aIPCDetails
.paymentMethodErrors());
368 details
.forget(aDetails
);
373 PaymentDetails::GetId(nsAString
& aId
) {
379 PaymentDetails::GetTotalItem(nsIPaymentItem
** aTotalItem
) {
380 NS_ENSURE_ARG_POINTER(aTotalItem
);
381 MOZ_ASSERT(mTotalItem
);
382 nsCOMPtr
<nsIPaymentItem
> total
= mTotalItem
;
383 total
.forget(aTotalItem
);
388 PaymentDetails::GetDisplayItems(nsIArray
** aDisplayItems
) {
389 NS_ENSURE_ARG_POINTER(aDisplayItems
);
390 nsCOMPtr
<nsIArray
> displayItems
= mDisplayItems
;
391 displayItems
.forget(aDisplayItems
);
396 PaymentDetails::GetShippingOptions(nsIArray
** aShippingOptions
) {
397 NS_ENSURE_ARG_POINTER(aShippingOptions
);
398 nsCOMPtr
<nsIArray
> options
= mShippingOptions
;
399 options
.forget(aShippingOptions
);
404 PaymentDetails::GetModifiers(nsIArray
** aModifiers
) {
405 NS_ENSURE_ARG_POINTER(aModifiers
);
406 nsCOMPtr
<nsIArray
> modifiers
= mModifiers
;
407 modifiers
.forget(aModifiers
);
412 PaymentDetails::GetError(nsAString
& aError
) {
418 PaymentDetails::GetShippingAddressErrors(JSContext
* aCx
,
419 JS::MutableHandle
<JS::Value
> aErrors
) {
420 AddressErrors errors
;
421 errors
.Init(mShippingAddressErrors
);
422 if (!ToJSValue(aCx
, errors
, aErrors
)) {
423 return NS_ERROR_FAILURE
;
429 PaymentDetails::GetPayerErrors(JSContext
* aCx
,
430 JS::MutableHandle
<JS::Value
> aErrors
) {
432 errors
.Init(mPayerErrors
);
433 if (!ToJSValue(aCx
, errors
, aErrors
)) {
434 return NS_ERROR_FAILURE
;
440 PaymentDetails::GetPaymentMethodErrors(JSContext
* aCx
,
441 JS::MutableHandle
<JS::Value
> aErrors
) {
442 if (mPaymentMethodErrors
.IsEmpty()) {
443 aErrors
.set(JS::NullValue());
446 nsresult rv
= DeserializeToJSValue(mPaymentMethodErrors
, aCx
, aErrors
);
447 if (NS_WARN_IF(NS_FAILED(rv
))) {
453 nsresult
PaymentDetails::Update(nsIPaymentDetails
* aDetails
,
454 const bool aRequestShipping
) {
455 MOZ_ASSERT(aDetails
);
457 * According to the spec [1], update the attributes if they present in new
458 * details (i.e., PaymentDetailsUpdate); otherwise, keep original value.
459 * Note |id| comes only from initial details (i.e., PaymentDetailsInit) and
460 * |error| only from new details.
462 * [1] https://www.w3.org/TR/payment-request/#updatewith-method
465 nsresult rv
= aDetails
->GetTotalItem(getter_AddRefs(mTotalItem
));
466 if (NS_WARN_IF(NS_FAILED(rv
))) {
470 nsCOMPtr
<nsIArray
> displayItems
;
471 rv
= aDetails
->GetDisplayItems(getter_AddRefs(displayItems
));
472 if (NS_WARN_IF(NS_FAILED(rv
))) {
476 mDisplayItems
= displayItems
;
479 if (aRequestShipping
) {
480 nsCOMPtr
<nsIArray
> shippingOptions
;
481 rv
= aDetails
->GetShippingOptions(getter_AddRefs(shippingOptions
));
482 if (NS_WARN_IF(NS_FAILED(rv
))) {
485 mShippingOptions
= shippingOptions
;
488 nsCOMPtr
<nsIArray
> modifiers
;
489 rv
= aDetails
->GetModifiers(getter_AddRefs(modifiers
));
490 if (NS_WARN_IF(NS_FAILED(rv
))) {
494 mModifiers
= modifiers
;
497 rv
= aDetails
->GetError(mError
);
498 if (NS_WARN_IF(NS_FAILED(rv
))) {
502 PaymentDetails
* rowDetails
= static_cast<PaymentDetails
*>(aDetails
);
503 MOZ_ASSERT(rowDetails
);
504 mShippingAddressErrors
= rowDetails
->GetShippingAddressErrors();
505 mPayerErrors
= rowDetails
->GetPayerErrors();
506 mPaymentMethodErrors
= rowDetails
->GetPaymentMethodErrors();
511 const nsString
& PaymentDetails::GetShippingAddressErrors() const {
512 return mShippingAddressErrors
;
515 const nsString
& PaymentDetails::GetPayerErrors() const { return mPayerErrors
; }
517 const nsString
& PaymentDetails::GetPaymentMethodErrors() const {
518 return mPaymentMethodErrors
;
521 nsresult
PaymentDetails::UpdateErrors(const nsAString
& aError
,
522 const nsAString
& aPayerErrors
,
523 const nsAString
& aPaymentMethodErrors
,
524 const nsAString
& aShippingAddressErrors
) {
526 mPayerErrors
= aPayerErrors
;
527 mPaymentMethodErrors
= aPaymentMethodErrors
;
528 mShippingAddressErrors
= aShippingAddressErrors
;
534 NS_IMPL_ISUPPORTS(PaymentOptions
, nsIPaymentOptions
)
536 PaymentOptions::PaymentOptions(const bool aRequestPayerName
,
537 const bool aRequestPayerEmail
,
538 const bool aRequestPayerPhone
,
539 const bool aRequestShipping
,
540 const bool aRequestBillingAddress
,
541 const nsAString
& aShippingType
)
542 : mRequestPayerName(aRequestPayerName
),
543 mRequestPayerEmail(aRequestPayerEmail
),
544 mRequestPayerPhone(aRequestPayerPhone
),
545 mRequestShipping(aRequestShipping
),
546 mRequestBillingAddress(aRequestBillingAddress
),
547 mShippingType(aShippingType
) {}
549 nsresult
PaymentOptions::Create(const IPCPaymentOptions
& aIPCOptions
,
550 nsIPaymentOptions
** aOptions
) {
551 NS_ENSURE_ARG_POINTER(aOptions
);
553 nsCOMPtr
<nsIPaymentOptions
> options
= new PaymentOptions(
554 aIPCOptions
.requestPayerName(), aIPCOptions
.requestPayerEmail(),
555 aIPCOptions
.requestPayerPhone(), aIPCOptions
.requestShipping(),
556 aIPCOptions
.requestBillingAddress(), aIPCOptions
.shippingType());
557 options
.forget(aOptions
);
562 PaymentOptions::GetRequestPayerName(bool* aRequestPayerName
) {
563 NS_ENSURE_ARG_POINTER(aRequestPayerName
);
564 *aRequestPayerName
= mRequestPayerName
;
569 PaymentOptions::GetRequestPayerEmail(bool* aRequestPayerEmail
) {
570 NS_ENSURE_ARG_POINTER(aRequestPayerEmail
);
571 *aRequestPayerEmail
= mRequestPayerEmail
;
576 PaymentOptions::GetRequestPayerPhone(bool* aRequestPayerPhone
) {
577 NS_ENSURE_ARG_POINTER(aRequestPayerPhone
);
578 *aRequestPayerPhone
= mRequestPayerPhone
;
583 PaymentOptions::GetRequestShipping(bool* aRequestShipping
) {
584 NS_ENSURE_ARG_POINTER(aRequestShipping
);
585 *aRequestShipping
= mRequestShipping
;
590 PaymentOptions::GetRequestBillingAddress(bool* aRequestBillingAddress
) {
591 NS_ENSURE_ARG_POINTER(aRequestBillingAddress
);
592 *aRequestBillingAddress
= mRequestBillingAddress
;
597 PaymentOptions::GetShippingType(nsAString
& aShippingType
) {
598 aShippingType
= mShippingType
;
604 NS_IMPL_ISUPPORTS(PaymentRequest
, nsIPaymentRequest
)
606 PaymentRequest::PaymentRequest(const uint64_t aTopOuterWindowId
,
607 const nsAString
& aRequestId
,
608 nsIPrincipal
* aTopLevelPrincipal
,
609 nsIArray
* aPaymentMethods
,
610 nsIPaymentDetails
* aPaymentDetails
,
611 nsIPaymentOptions
* aPaymentOptions
,
612 const nsAString
& aShippingOption
)
613 : mTopOuterWindowId(aTopOuterWindowId
),
614 mRequestId(aRequestId
),
615 mTopLevelPrincipal(aTopLevelPrincipal
),
616 mPaymentMethods(aPaymentMethods
),
617 mPaymentDetails(aPaymentDetails
),
618 mPaymentOptions(aPaymentOptions
),
619 mShippingOption(aShippingOption
),
623 PaymentRequest::GetTopOuterWindowId(uint64_t* aTopOuterWindowId
) {
624 NS_ENSURE_ARG_POINTER(aTopOuterWindowId
);
625 *aTopOuterWindowId
= mTopOuterWindowId
;
630 PaymentRequest::GetTopLevelPrincipal(nsIPrincipal
** aTopLevelPrincipal
) {
631 NS_ENSURE_ARG_POINTER(aTopLevelPrincipal
);
632 MOZ_ASSERT(mTopLevelPrincipal
);
633 nsCOMPtr
<nsIPrincipal
> principal
= mTopLevelPrincipal
;
634 principal
.forget(aTopLevelPrincipal
);
639 PaymentRequest::GetRequestId(nsAString
& aRequestId
) {
640 aRequestId
= mRequestId
;
645 PaymentRequest::GetPaymentMethods(nsIArray
** aPaymentMethods
) {
646 NS_ENSURE_ARG_POINTER(aPaymentMethods
);
647 MOZ_ASSERT(mPaymentMethods
);
648 nsCOMPtr
<nsIArray
> methods
= mPaymentMethods
;
649 methods
.forget(aPaymentMethods
);
654 PaymentRequest::GetPaymentDetails(nsIPaymentDetails
** aPaymentDetails
) {
655 NS_ENSURE_ARG_POINTER(aPaymentDetails
);
656 MOZ_ASSERT(mPaymentDetails
);
657 nsCOMPtr
<nsIPaymentDetails
> details
= mPaymentDetails
;
658 details
.forget(aPaymentDetails
);
663 PaymentRequest::GetPaymentOptions(nsIPaymentOptions
** aPaymentOptions
) {
664 NS_ENSURE_ARG_POINTER(aPaymentOptions
);
665 MOZ_ASSERT(mPaymentOptions
);
666 nsCOMPtr
<nsIPaymentOptions
> options
= mPaymentOptions
;
667 options
.forget(aPaymentOptions
);
672 PaymentRequest::GetShippingOption(nsAString
& aShippingOption
) {
673 aShippingOption
= mShippingOption
;
677 nsresult
PaymentRequest::UpdatePaymentDetails(
678 nsIPaymentDetails
* aPaymentDetails
, const nsAString
& aShippingOption
) {
679 MOZ_ASSERT(aPaymentDetails
);
680 bool requestShipping
;
681 nsresult rv
= mPaymentOptions
->GetRequestShipping(&requestShipping
);
682 if (NS_WARN_IF(NS_FAILED(rv
))) {
685 mShippingOption
= aShippingOption
;
687 PaymentDetails
* rowDetails
=
688 static_cast<PaymentDetails
*>(mPaymentDetails
.get());
689 MOZ_ASSERT(rowDetails
);
690 return rowDetails
->Update(aPaymentDetails
, requestShipping
);
693 void PaymentRequest::SetCompleteStatus(const nsAString
& aCompleteStatus
) {
694 mCompleteStatus
= aCompleteStatus
;
697 nsresult
PaymentRequest::UpdateErrors(const nsAString
& aError
,
698 const nsAString
& aPayerErrors
,
699 const nsAString
& aPaymentMethodErrors
,
700 const nsAString
& aShippingAddressErrors
) {
701 PaymentDetails
* rowDetails
=
702 static_cast<PaymentDetails
*>(mPaymentDetails
.get());
703 MOZ_ASSERT(rowDetails
);
704 return rowDetails
->UpdateErrors(aError
, aPayerErrors
, aPaymentMethodErrors
,
705 aShippingAddressErrors
);
709 PaymentRequest::GetCompleteStatus(nsAString
& aCompleteStatus
) {
710 aCompleteStatus
= mCompleteStatus
;
716 NS_IMPL_ISUPPORTS(PaymentAddress
, nsIPaymentAddress
)
719 PaymentAddress::Init(const nsAString
& aCountry
, nsIArray
* aAddressLine
,
720 const nsAString
& aRegion
, const nsAString
& aRegionCode
,
721 const nsAString
& aCity
,
722 const nsAString
& aDependentLocality
,
723 const nsAString
& aPostalCode
,
724 const nsAString
& aSortingCode
,
725 const nsAString
& aOrganization
,
726 const nsAString
& aRecipient
, const nsAString
& aPhone
) {
728 mAddressLine
= aAddressLine
;
730 mRegionCode
= aRegionCode
;
732 mDependentLocality
= aDependentLocality
;
733 mPostalCode
= aPostalCode
;
734 mSortingCode
= aSortingCode
;
735 mOrganization
= aOrganization
;
736 mRecipient
= aRecipient
;
742 PaymentAddress::GetCountry(nsAString
& aCountry
) {
748 PaymentAddress::GetAddressLine(nsIArray
** aAddressLine
) {
749 NS_ENSURE_ARG_POINTER(aAddressLine
);
750 nsCOMPtr
<nsIArray
> addressLine
= mAddressLine
;
751 addressLine
.forget(aAddressLine
);
756 PaymentAddress::GetRegion(nsAString
& aRegion
) {
762 PaymentAddress::GetRegionCode(nsAString
& aRegionCode
) {
763 aRegionCode
= mRegionCode
;
768 PaymentAddress::GetCity(nsAString
& aCity
) {
774 PaymentAddress::GetDependentLocality(nsAString
& aDependentLocality
) {
775 aDependentLocality
= mDependentLocality
;
780 PaymentAddress::GetPostalCode(nsAString
& aPostalCode
) {
781 aPostalCode
= mPostalCode
;
786 PaymentAddress::GetSortingCode(nsAString
& aSortingCode
) {
787 aSortingCode
= mSortingCode
;
792 PaymentAddress::GetOrganization(nsAString
& aOrganization
) {
793 aOrganization
= mOrganization
;
798 PaymentAddress::GetRecipient(nsAString
& aRecipient
) {
799 aRecipient
= mRecipient
;
804 PaymentAddress::GetPhone(nsAString
& aPhone
) {
809 } // namespace mozilla::dom::payments