diff --git a/dom/payments/PaymentRequestData.cpp b/dom/payments/PaymentRequestData.cpp index ba23836a072f..498f08f82d87 100644 --- a/dom/payments/PaymentRequestData.cpp +++ b/dom/payments/PaymentRequestData.cpp @@ -365,52 +365,58 @@ PaymentDetails::Create(const IPCPaymentDetails& aIPCDetails, } nsCOMPtr displayItems; - nsCOMPtr items = do_CreateInstance(NS_ARRAY_CONTRACTID); - MOZ_ASSERT(items); - for (const IPCPaymentItem& displayItem : aIPCDetails.displayItems()) { - nsCOMPtr item; - rv = PaymentItem::Create(displayItem, getter_AddRefs(item)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - rv = items->AppendElement(item); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; + if (aIPCDetails.displayItemsPassed()) { + nsCOMPtr items = do_CreateInstance(NS_ARRAY_CONTRACTID); + MOZ_ASSERT(items); + for (const IPCPaymentItem& displayItem : aIPCDetails.displayItems()) { + nsCOMPtr item; + rv = PaymentItem::Create(displayItem, getter_AddRefs(item)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + rv = items->AppendElement(item); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } } + displayItems = items.forget(); } - displayItems = items.forget(); nsCOMPtr shippingOptions; - nsCOMPtr options = do_CreateInstance(NS_ARRAY_CONTRACTID); - MOZ_ASSERT(options); - for (const IPCPaymentShippingOption& shippingOption : aIPCDetails.shippingOptions()) { - nsCOMPtr option; - rv = PaymentShippingOption::Create(shippingOption, getter_AddRefs(option)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - rv = options->AppendElement(option); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; + if (aIPCDetails.shippingOptionsPassed()) { + nsCOMPtr options = do_CreateInstance(NS_ARRAY_CONTRACTID); + MOZ_ASSERT(options); + for (const IPCPaymentShippingOption& shippingOption : aIPCDetails.shippingOptions()) { + nsCOMPtr option; + rv = PaymentShippingOption::Create(shippingOption, getter_AddRefs(option)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + rv = options->AppendElement(option); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } } + shippingOptions = options.forget(); } - shippingOptions = options.forget(); nsCOMPtr modifiers; - nsCOMPtr detailsModifiers = do_CreateInstance(NS_ARRAY_CONTRACTID); - MOZ_ASSERT(detailsModifiers); - for (const IPCPaymentDetailsModifier& modifier : aIPCDetails.modifiers()) { - nsCOMPtr detailsModifier; - rv = PaymentDetailsModifier::Create(modifier, getter_AddRefs(detailsModifier)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - rv = detailsModifiers->AppendElement(detailsModifier); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; + if (aIPCDetails.modifiersPassed()) { + nsCOMPtr detailsModifiers = do_CreateInstance(NS_ARRAY_CONTRACTID); + MOZ_ASSERT(detailsModifiers); + for (const IPCPaymentDetailsModifier& modifier : aIPCDetails.modifiers()) { + nsCOMPtr detailsModifier; + rv = PaymentDetailsModifier::Create(modifier, getter_AddRefs(detailsModifier)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + rv = detailsModifiers->AppendElement(detailsModifier); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } } + modifiers = detailsModifiers.forget(); } - modifiers = detailsModifiers.forget(); nsCOMPtr details = new PaymentDetails(aIPCDetails.id(), total, displayItems, shippingOptions, diff --git a/dom/payments/PaymentRequestManager.cpp b/dom/payments/PaymentRequestManager.cpp index 0ba6fba878b1..03d708fc84c7 100644 --- a/dom/payments/PaymentRequestManager.cpp +++ b/dom/payments/PaymentRequestManager.cpp @@ -178,7 +178,10 @@ ConvertDetailsInit(JSContext* aCx, shippingOptions, modifiers, EmptyString(), // error message - EmptyString()); // shippingAddressErrors + EmptyString(), // shippingAddressErrors + aDetails.mDisplayItems.WasPassed(), + aDetails.mShippingOptions.WasPassed(), + aDetails.mModifiers.WasPassed()); return NS_OK; } @@ -220,7 +223,10 @@ ConvertDetailsUpdate(JSContext* aCx, shippingOptions, modifiers, error, - shippingAddressErrors); + shippingAddressErrors, + aDetails.mDisplayItems.WasPassed(), + aDetails.mShippingOptions.WasPassed(), + aDetails.mModifiers.WasPassed()); return NS_OK; } diff --git a/dom/payments/ipc/PPaymentRequest.ipdl b/dom/payments/ipc/PPaymentRequest.ipdl index 7f2f1311f810..f4b54fac8cf7 100644 --- a/dom/payments/ipc/PPaymentRequest.ipdl +++ b/dom/payments/ipc/PPaymentRequest.ipdl @@ -56,6 +56,9 @@ struct IPCPaymentDetails IPCPaymentDetailsModifier[] modifiers; nsString error; nsString shippingAddressErrors; + bool displayItemsPassed; + bool shippingOptionsPassed; + bool modifiersPassed; }; struct IPCPaymentOptions diff --git a/dom/payments/test/ConstructorChromeScript.js b/dom/payments/test/ConstructorChromeScript.js index bb1990425b62..69ca86702d24 100644 --- a/dom/payments/test/ConstructorChromeScript.js +++ b/dom/payments/test/ConstructorChromeScript.js @@ -45,14 +45,14 @@ function checkSimplestRequest(payRequest) { emitTestFail("total item's value should be '1.00'."); } - if (details.displayItems.length !== 0) { - emitTestFail("details.displayItems should be an empty array."); + if (details.displayItems) { + emitTestFail("details.displayItems should be undefined."); } - if (details.modifiers.length !== 0) { - emitTestFail("details.modifiers should be an empty array."); + if (details.modifiers) { + emitTestFail("details.displayItems should be undefined."); } - if (details.shippingOptions.length !== 0) { - emitTestFail("details.shippingOptions should be an empty array."); + if (details.shippingOptions) { + emitTestFail("details.shippingOptions should be undefined."); } // checking the default generated PaymentOptions parameter @@ -319,14 +319,14 @@ function checkNonBasicCardRequest(payRequest) { emitTestFail("total item's value should be '1.00'."); } - if (details.displayItems.length !== 0) { - emitTestFail("details.displayItems should be an zero length array."); + if (details.displayItems) { + emitTestFail("details.displayItems should be undefined."); } - if (details.displayItems.length !== 0) { - emitTestFail("details.modifiers should be an zero length array."); + if (details.modifiers) { + emitTestFail("details.displayItems should be undefined."); } - if (details.displayItems.length !== 0) { - emitTestFail("details.shippingOptions should be an zero length array."); + if (details.shippingOptions) { + emitTestFail("details.shippingOptions should be undefined."); } // checking the default generated PaymentOptions parameter diff --git a/dom/payments/test/head.js b/dom/payments/test/head.js index a5e1c53f2671..8f5dde97a054 100644 --- a/dom/payments/test/head.js +++ b/dom/payments/test/head.js @@ -17,9 +17,9 @@ function checkSimplePayment(aSimplePayment) { is(details.totalItem.amount.currency, "USD", "total item's currency should be 'USD'."); is(details.totalItem.amount.value, "55.00", "total item's value should be '55.00'."); - ok(details.displayItems.length, 0, "details.displayItems should be a zero length array."); - ok(details.modifiers.length, 0, "details.modifiers should be a zero length array."); - ok(details.shippingOptions.length, 0, "details.shippingOptions should be a zero length array."); + ok(!details.displayItems, "details.displayItems should be undefined."); + ok(!details.modifiers, "details.modifiers should be undefined."); + ok(!details.shippingOptions, "details.shippingOptions should be undefined."); // checking the default generated PaymentOptions parameter const paymentOptions = aSimplePayment.paymentOptions;