/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ /* eslint-env mozilla/chrome-script */ "use strict"; const { XPCOMUtils } = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ); const paymentSrv = Cc[ "@mozilla.org/dom/payments/payment-request-service;1" ].getService(Ci.nsIPaymentRequestService); function emitTestFail(message) { sendAsyncMessage("test-fail", `${DummyUIService.testName}: ${message}`); } function emitTestPass(message) { sendAsyncMessage("test-pass", `${DummyUIService.testName}: ${message}`); } addMessageListener("close-check", function () { const paymentEnum = paymentSrv.enumerate(); if (paymentEnum.hasMoreElements()) { emitTestFail("Non-empty PaymentRequest queue in PaymentRequestService."); } else { emitTestPass("Got empty PaymentRequest queue in PaymentRequestService."); } sendAsyncMessage("close-check-complete"); }); var setPaymentNums = 0; addMessageListener("payment-num-set", function () { setPaymentNums = 0; const paymentEnum = paymentSrv.enumerate(); while (paymentEnum.hasMoreElements()) { setPaymentNums = setPaymentNums + 1; paymentEnum.getNext(); } sendAsyncMessage("payment-num-set-complete"); }); addMessageListener("payment-num-check", function (expectedNumPayments) { const paymentEnum = paymentSrv.enumerate(); let numPayments = 0; while (paymentEnum.hasMoreElements()) { numPayments = numPayments + 1; paymentEnum.getNext(); } if (numPayments !== expectedNumPayments + setPaymentNums) { emitTestFail( "Expected '" + expectedNumPayments + "' PaymentRequests in PaymentRequestService" + ", but got '" + numPayments + "'." ); } else { emitTestPass( "Got expected '" + numPayments + "' PaymentRequests in PaymentRequestService." ); } // force cleanup PaymentRequests for clear environment to next testcase. paymentSrv.cleanup(); sendAsyncMessage("payment-num-check-complete"); }); addMessageListener("test-setup", testName => { DummyUIService.testName = testName; sendAsyncMessage("test-setup-complete"); }); addMessageListener("reject-payment", expectedError => { try { const responseData = Cc[ "@mozilla.org/dom/payments/general-response-data;1" ].createInstance(Ci.nsIGeneralResponseData); responseData.initData({}); const showResponse = Cc[ "@mozilla.org/dom/payments/payment-show-action-response;1" ].createInstance(Ci.nsIPaymentShowActionResponse); showResponse.init( DummyUIService.respondRequestId, Ci.nsIPaymentActionResponse.PAYMENT_REJECTED, "", // payment method responseData, // payment method data "", // payer name "", // payer email "" ); // payer phone paymentSrv.respondPayment( showResponse.QueryInterface(Ci.nsIPaymentActionResponse) ); emitTestPass("Reject PaymentRequest successfully"); } catch (error) { if (expectedError) { if (error.name === "NS_ERROR_FAILURE") { emitTestPass( "Got expected NS_ERROR_FAILURE when responding a closed PaymentRequest" ); sendAsyncMessage("reject-payment-complete"); return; } } emitTestFail( "Unexpected error '" + error.name + "' when reponding a closed PaymentRequest" ); } sendAsyncMessage("reject-payment-complete"); }); addMessageListener("update-payment", () => { try { paymentSrv.changeShippingOption(DummyUIService.respondRequestId, ""); emitTestPass("Change shippingOption succefully"); } catch (error) { emitTestFail( "Unexpected error '" + error.name + "' when changing the shipping option" ); } sendAsyncMessage("update-payment-complete"); }); const DummyUIService = { testName: "", respondRequestId: "", showPayment: requestId => { DummyUIService.respondRequestId = requestId; }, abortPayment: requestId => { DummyUIService.respondRequestId = requestId; }, completePayment: requestId => { DummyUIService.respondRequestId = requestId; }, updatePayment: requestId => { DummyUIService.respondRequestId = requestId; }, closePayment: requestId => { this.respondRequestId = requestId; }, QueryInterface: ChromeUtils.generateQI(["nsIPaymentUIService"]), }; paymentSrv.setTestingUIService( DummyUIService.QueryInterface(Ci.nsIPaymentUIService) ); addMessageListener("teardown", function () { paymentSrv.setTestingUIService(null); sendAsyncMessage("teardown-complete"); });