mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 10:44:56 +00:00
Bug 1480872 - paymentDetails attributes should default to an empty arrays. r=edenchuang
This commit is contained in:
parent
21585b6498
commit
8f0ff24be1
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -56,9 +56,6 @@ struct IPCPaymentDetails
|
||||
IPCPaymentDetailsModifier[] modifiers;
|
||||
nsString error;
|
||||
nsString shippingAddressErrors;
|
||||
bool displayItemsPassed;
|
||||
bool shippingOptionsPassed;
|
||||
bool modifiersPassed;
|
||||
};
|
||||
|
||||
struct IPCPaymentOptions
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user