ClosePaymentChromeScript.js (4672B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ */ 4 5 /* eslint-env mozilla/chrome-script */ 6 7 "use strict"; 8 9 const { XPCOMUtils } = ChromeUtils.importESModule( 10 "resource://gre/modules/XPCOMUtils.sys.mjs" 11 ); 12 13 const paymentSrv = Cc[ 14 "@mozilla.org/dom/payments/payment-request-service;1" 15 ].getService(Ci.nsIPaymentRequestService); 16 17 function emitTestFail(message) { 18 sendAsyncMessage("test-fail", `${DummyUIService.testName}: ${message}`); 19 } 20 function emitTestPass(message) { 21 sendAsyncMessage("test-pass", `${DummyUIService.testName}: ${message}`); 22 } 23 24 addMessageListener("close-check", function () { 25 const paymentEnum = paymentSrv.enumerate(); 26 if (paymentEnum.hasMoreElements()) { 27 emitTestFail("Non-empty PaymentRequest queue in PaymentRequestService."); 28 } else { 29 emitTestPass("Got empty PaymentRequest queue in PaymentRequestService."); 30 } 31 sendAsyncMessage("close-check-complete"); 32 }); 33 34 var setPaymentNums = 0; 35 36 addMessageListener("payment-num-set", function () { 37 setPaymentNums = 0; 38 const paymentEnum = paymentSrv.enumerate(); 39 while (paymentEnum.hasMoreElements()) { 40 setPaymentNums = setPaymentNums + 1; 41 paymentEnum.getNext(); 42 } 43 sendAsyncMessage("payment-num-set-complete"); 44 }); 45 46 addMessageListener("payment-num-check", function (expectedNumPayments) { 47 const paymentEnum = paymentSrv.enumerate(); 48 let numPayments = 0; 49 while (paymentEnum.hasMoreElements()) { 50 numPayments = numPayments + 1; 51 paymentEnum.getNext(); 52 } 53 if (numPayments !== expectedNumPayments + setPaymentNums) { 54 emitTestFail( 55 "Expected '" + 56 expectedNumPayments + 57 "' PaymentRequests in PaymentRequestService" + 58 ", but got '" + 59 numPayments + 60 "'." 61 ); 62 } else { 63 emitTestPass( 64 "Got expected '" + 65 numPayments + 66 "' PaymentRequests in PaymentRequestService." 67 ); 68 } 69 // force cleanup PaymentRequests for clear environment to next testcase. 70 paymentSrv.cleanup(); 71 sendAsyncMessage("payment-num-check-complete"); 72 }); 73 74 addMessageListener("test-setup", testName => { 75 DummyUIService.testName = testName; 76 sendAsyncMessage("test-setup-complete"); 77 }); 78 79 addMessageListener("reject-payment", expectedError => { 80 try { 81 const responseData = Cc[ 82 "@mozilla.org/dom/payments/general-response-data;1" 83 ].createInstance(Ci.nsIGeneralResponseData); 84 responseData.initData({}); 85 const showResponse = Cc[ 86 "@mozilla.org/dom/payments/payment-show-action-response;1" 87 ].createInstance(Ci.nsIPaymentShowActionResponse); 88 showResponse.init( 89 DummyUIService.respondRequestId, 90 Ci.nsIPaymentActionResponse.PAYMENT_REJECTED, 91 "", // payment method 92 responseData, // payment method data 93 "", // payer name 94 "", // payer email 95 "" 96 ); // payer phone 97 paymentSrv.respondPayment( 98 showResponse.QueryInterface(Ci.nsIPaymentActionResponse) 99 ); 100 emitTestPass("Reject PaymentRequest successfully"); 101 } catch (error) { 102 if (expectedError) { 103 if (error.name === "NS_ERROR_FAILURE") { 104 emitTestPass( 105 "Got expected NS_ERROR_FAILURE when responding a closed PaymentRequest" 106 ); 107 sendAsyncMessage("reject-payment-complete"); 108 return; 109 } 110 } 111 emitTestFail( 112 "Unexpected error '" + 113 error.name + 114 "' when reponding a closed PaymentRequest" 115 ); 116 } 117 sendAsyncMessage("reject-payment-complete"); 118 }); 119 120 addMessageListener("update-payment", () => { 121 try { 122 paymentSrv.changeShippingOption(DummyUIService.respondRequestId, ""); 123 emitTestPass("Change shippingOption succefully"); 124 } catch (error) { 125 emitTestFail( 126 "Unexpected error '" + error.name + "' when changing the shipping option" 127 ); 128 } 129 sendAsyncMessage("update-payment-complete"); 130 }); 131 132 const DummyUIService = { 133 testName: "", 134 respondRequestId: "", 135 showPayment: requestId => { 136 DummyUIService.respondRequestId = requestId; 137 }, 138 abortPayment: requestId => { 139 DummyUIService.respondRequestId = requestId; 140 }, 141 completePayment: requestId => { 142 DummyUIService.respondRequestId = requestId; 143 }, 144 updatePayment: requestId => { 145 DummyUIService.respondRequestId = requestId; 146 }, 147 closePayment: requestId => { 148 this.respondRequestId = requestId; 149 }, 150 QueryInterface: ChromeUtils.generateQI(["nsIPaymentUIService"]), 151 }; 152 153 paymentSrv.setTestingUIService( 154 DummyUIService.QueryInterface(Ci.nsIPaymentUIService) 155 ); 156 157 addMessageListener("teardown", function () { 158 paymentSrv.setTestingUIService(null); 159 sendAsyncMessage("teardown-complete"); 160 });