Bug 1480872 - paymentDetails attributes should default to an empty arrays. r=edenchuang

This commit is contained in:
Marcos Cáceres 2018-08-19 19:11:00 +03:00
parent 21585b6498
commit 8f0ff24be1
7 changed files with 124 additions and 136 deletions

View File

@ -365,58 +365,52 @@ PaymentDetails::Create(const IPCPaymentDetails& aIPCDetails,
}
nsCOMPtr<nsIArray> displayItems;
if (aIPCDetails.displayItemsPassed()) {
nsCOMPtr<nsIMutableArray> items = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(items);
for (const IPCPaymentItem& displayItem : aIPCDetails.displayItems()) {
nsCOMPtr<nsIPaymentItem> 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;
}
nsCOMPtr<nsIMutableArray> items = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(items);
for (const IPCPaymentItem& displayItem : aIPCDetails.displayItems()) {
nsCOMPtr<nsIPaymentItem> 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<nsIArray> shippingOptions;
if (aIPCDetails.shippingOptionsPassed()) {
nsCOMPtr<nsIMutableArray> options = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(options);
for (const IPCPaymentShippingOption& shippingOption : aIPCDetails.shippingOptions()) {
nsCOMPtr<nsIPaymentShippingOption> 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;
}
nsCOMPtr<nsIMutableArray> options = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(options);
for (const IPCPaymentShippingOption& shippingOption : aIPCDetails.shippingOptions()) {
nsCOMPtr<nsIPaymentShippingOption> 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<nsIArray> modifiers;
if (aIPCDetails.modifiersPassed()) {
nsCOMPtr<nsIMutableArray> detailsModifiers = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(detailsModifiers);
for (const IPCPaymentDetailsModifier& modifier : aIPCDetails.modifiers()) {
nsCOMPtr<nsIPaymentDetailsModifier> 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;
}
nsCOMPtr<nsIMutableArray> detailsModifiers = do_CreateInstance(NS_ARRAY_CONTRACTID);
MOZ_ASSERT(detailsModifiers);
for (const IPCPaymentDetailsModifier& modifier : aIPCDetails.modifiers()) {
nsCOMPtr<nsIPaymentDetailsModifier> 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<nsIPaymentDetails> details =
new PaymentDetails(aIPCDetails.id(), total, displayItems, shippingOptions,

View File

@ -178,10 +178,7 @@ ConvertDetailsInit(JSContext* aCx,
shippingOptions,
modifiers,
EmptyString(), // error message
EmptyString(), // shippingAddressErrors
aDetails.mDisplayItems.WasPassed(),
aDetails.mShippingOptions.WasPassed(),
aDetails.mModifiers.WasPassed());
EmptyString()); // shippingAddressErrors
return NS_OK;
}
@ -223,10 +220,7 @@ ConvertDetailsUpdate(JSContext* aCx,
shippingOptions,
modifiers,
error,
shippingAddressErrors,
aDetails.mDisplayItems.WasPassed(),
aDetails.mShippingOptions.WasPassed(),
aDetails.mModifiers.WasPassed());
shippingAddressErrors);
return NS_OK;
}

View File

@ -56,9 +56,6 @@ struct IPCPaymentDetails
IPCPaymentDetailsModifier[] modifiers;
nsString error;
nsString shippingAddressErrors;
bool displayItemsPassed;
bool shippingOptionsPassed;
bool modifiersPassed;
};
struct IPCPaymentOptions

View File

@ -45,14 +45,14 @@ function checkSimplestRequest(payRequest) {
emitTestFail("total item's value should be '1.00'.");
}
if (details.displayItems) {
emitTestFail("details.displayItems should be undefined.");
if (details.displayItems.length !== 0) {
emitTestFail("details.displayItems should be an empty array.");
}
if (details.modifiers) {
emitTestFail("details.displayItems should be undefined.");
if (details.modifiers.length !== 0) {
emitTestFail("details.modifiers should be an empty array.");
}
if (details.shippingOptions) {
emitTestFail("details.shippingOptions should be undefined.");
if (details.shippingOptions.length !== 0) {
emitTestFail("details.shippingOptions should be an empty array.");
}
// 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) {
emitTestFail("details.displayItems should be undefined.");
if (details.displayItems.length !== 0) {
emitTestFail("details.displayItems should be an zero length array.");
}
if (details.modifiers) {
emitTestFail("details.displayItems should be undefined.");
if (details.displayItems.length !== 0) {
emitTestFail("details.modifiers should be an zero length array.");
}
if (details.shippingOptions) {
emitTestFail("details.shippingOptions should be undefined.");
if (details.displayItems.length !== 0) {
emitTestFail("details.shippingOptions should be an zero length array.");
}
// checking the default generated PaymentOptions parameter

View File

@ -2,30 +2,38 @@
// kTestRoot is from head.js
const kTestPage = kTestRoot + "simple_payment_request.html";
add_task(async function() {
const TABS_TO_OPEN = 5;
add_task(async () => {
Services.prefs.setBoolPref("dom.payments.request.enabled", true);
await BrowserTestUtils.withNewTab(kTestPage,
async function(browser) {
await BrowserTestUtils.withNewTab(kTestPage,
function(browser) {
const paymentSrv = Cc["@mozilla.org/dom/payments/payment-request-service;1"].getService(Ci.nsIPaymentRequestService);
ok(paymentSrv, "Fail to get PaymentRequestService.");
const paymentEnum = paymentSrv.enumerate();
ok(paymentEnum.hasMoreElements(), "PaymentRequestService should have at least one payment request.");
let tabIds = [];
while (paymentEnum.hasMoreElements()) {
let payment = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
ok(payment, "Fail to get existing payment request.");
checkSimplePayment(payment);
tabIds.push(payment.tabId);
}
is(tabIds.length, 2, "TabId array length should be 2.");
ok(tabIds[0] != tabIds[1], "TabIds should be different.");
Services.prefs.setBoolPref("dom.payments.request.enabled", false);
}
);
}
const tabs = [];
const options = {
gBrowser: Services.wm.getMostRecentWindow("navigator:browser").gBrowser,
url: kTestPage,
};
for (let i = 0; i < TABS_TO_OPEN; i++) {
const tab = await BrowserTestUtils.openNewForegroundTab(options);
tabs.push(tab);
}
const paymentSrv = Cc[
"@mozilla.org/dom/payments/payment-request-service;1"
].getService(Ci.nsIPaymentRequestService);
ok(paymentSrv, "Fail to get PaymentRequestService.");
const paymentEnum = paymentSrv.enumerate();
ok(
paymentEnum.hasMoreElements(),
"PaymentRequestService should have at least one payment request."
);
const payments = new Set();
while (paymentEnum.hasMoreElements()) {
const payment = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
ok(payment, "Fail to get existing payment request.");
checkSimplePayment(payment);
payments.add(payment);
}
is(payments.size, TABS_TO_OPEN, `Should be ${TABS_TO_OPEN} unique objects.`);
tabs.forEach(async tab => {
await TestUtils.waitForTick();
BrowserTestUtils.removeTab(tab);
});
Services.prefs.setBoolPref("dom.payments.request.enabled", false);
});

View File

@ -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, "details.displayItems should be undefined.");
ok(!details.modifiers, "details.modifiers should be undefined.");
ok(!details.shippingOptions, "details.shippingOptions should be undefined.");
is(details.displayItems.length, 0, "details.displayItems should be a zero length array.");
is(details.modifiers.length, 0, "details.modifiers should be a zero length array.");
is(details.shippingOptions.length, 0, "details.shippingOptions should be a zero length array.");
// checking the default generated PaymentOptions parameter
const paymentOptions = aSimplePayment.paymentOptions;

View File

@ -1,47 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>Payment Request Testing</title>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
</head>
<body>
<h1>simple payment request.html</h1>
<script type="text/javascript">
<!doctype html>
<meta charset="utf-8">
<title>Payment Request Testing</title>
<script>
const methods = [
{
supportedMethods: "basic-card",
},
];
const details = {
id: "simple details",
total: {
label: "Donation",
amount: { currency: "USD", value: "55.00" },
},
};
const supportedInstruments = [{
supportedMethods: "basic-card",
}];
const details = {
id: "simple details",
total: {
label: "Donation",
amount: { currency: "USD", value: "55.00" }
},
};
let request;
let msg = "successful";
try {
request = new PaymentRequest(methods, details);
} catch (err) {
msg = err.name;
}
window.parent.postMessage(msg, "*");
try {
const payRequest = new PaymentRequest(supportedInstruments, details);
window.onmessage = async (e) => {
if (e.data === "show PaymentRequest") {
if (payRequest) {
payRequest.show();
window.parent.postMessage("successful", '*');
} else {
window.parent.postMessage("PaymentRequest does not exist", "*");
}
}
}
if(window.parent) {
window.parent.postMessage("successful", '*');
}
} catch(err) {
if(window.parent) {
window.parent.postMessage(err.name, '*');
}
if (request) {
window.onmessage = async ({ data: action }) => {
switch (action) {
case "show PaymentRequest":
const responsePromise = request.show();
window.parent.postMessage("successful", "*");
try {
await responsePromise;
} catch (err) { /* graceful abort */ }
break;
default:
window.parent.postMessage(`fail - unknown postmessage action: ${action}`, "*");
}
</script>
</body>
</html>
};
}
</script>