test_closePayment.html (10196B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1408234 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for closing PaymentRequest</title> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 10 <script src="/tests/SimpleTest/SimpleTest.js"></script> 11 <script type="application/javascript" src="DefaultData.js"></script> 12 <script type="application/javascript"> 13 14 "use strict"; 15 SimpleTest.waitForExplicitFinish(); 16 17 var gUrl = SimpleTest.getTestFileURL('ClosePaymentChromeScript.js'); 18 var gScript = SpecialPowers.loadChromeScript(gUrl); 19 20 function testFailHandler(message) { 21 ok(false, message); 22 } 23 function testPassHandler(message) { 24 ok(true, message); 25 } 26 gScript.addMessageListener("test-fail", testFailHandler); 27 gScript.addMessageListener("test-pass", testPassHandler); 28 29 async function requestChromeAction(action, params) { 30 gScript.sendAsyncMessage(action, params); 31 await new Promise(resolve => { 32 gScript.addMessageListener(`${action}-complete`, function completeListener() { 33 gScript.removeMessageListener(`${action}-complete`, completeListener); 34 resolve(); 35 }); 36 }); 37 } 38 39 async function testCloseByReloading() { 40 const testName = "testCloseByReloading"; 41 await requestChromeAction("test-setup", testName); 42 info(testName); 43 let nextStatus = ["creating", "reloading"]; 44 let currStatus = nextStatus.shift(); 45 let ifr = document.createElement('iframe'); 46 await requestChromeAction("payment-num-set"); 47 48 await new Promise((resolve) => { 49 let listener = function(event) { 50 is(event.data, "successful", 51 `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`); 52 if (currStatus === "creating") { 53 ifr.contentWindow.location.reload(); 54 } else if (currStatus === "reloading") { 55 window.removeEventListener("message", listener); 56 resolve(); 57 } 58 currStatus = nextStatus.shift(); 59 } 60 window.addEventListener("message", listener); 61 ifr.src = "simple_payment_request.html"; 62 document.body.appendChild(ifr); 63 }); 64 65 await requestChromeAction("payment-num-check", 1); 66 document.body.removeChild(ifr); 67 68 } 69 70 async function testCloseByRedirecting() { 71 const testName = "testCloseByRedirecting"; 72 await requestChromeAction("test-setup", testName); 73 return new Promise((resolve) => { 74 let nextStatus = ["creating", "redirecting"]; 75 let currStatus = nextStatus.shift(); 76 let ifr = document.createElement('iframe'); 77 let listener = async function(event) { 78 is(event.data, "successful", 79 `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`); 80 if (currStatus === "creating") { 81 ifr.src = "blank_page.html"; 82 } else if (currStatus === "redirecting"){ 83 window.removeEventListener("message", listener); 84 await requestChromeAction("close-check"); 85 document.body.removeChild(ifr); 86 resolve(); 87 } 88 currStatus = nextStatus.shift(); 89 }; 90 window.addEventListener("message", listener); 91 ifr.src = "simple_payment_request.html"; 92 document.body.appendChild(ifr); 93 }); 94 } 95 96 async function testCloseByRedirectingAfterShow() { 97 const testName = "testCloseByRedirectingAfterShow"; 98 await requestChromeAction("test-setup", testName); 99 return new Promise((resolve) => { 100 let nextStatus = ["creating", "showing", "redirecting"]; 101 let currStatus = nextStatus.shift(); 102 let ifr = document.createElement('iframe'); 103 let handler = undefined; 104 let listener = async (event) => { 105 is(event.data, "successful", 106 `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`); 107 if (currStatus === "creating") { 108 handler = SpecialPowers.getDOMWindowUtils(ifr.contentWindow).setHandlingUserInput(true); 109 ifr.contentWindow.postMessage("show PaymentRequest", "*"); 110 } else if (currStatus === "showing") { 111 handler.destruct(); 112 ifr.src = "blank_page.html"; 113 } else if (currStatus === "redirecting") { 114 window.removeEventListener("message", listener); 115 await requestChromeAction("close-check"); 116 await requestChromeAction("reject-payment", true); 117 document.body.removeChild(ifr); 118 resolve(); 119 } 120 currStatus = nextStatus.shift(); 121 } 122 window.addEventListener("message", listener); 123 ifr.src = "simple_payment_request.html"; 124 document.body.appendChild(ifr); 125 }); 126 } 127 128 async function testCloseByRemovingIframe() { 129 const testName = "testCloseByRemovingIframe"; 130 await requestChromeAction("test-setup", testName); 131 return new Promise((resolve) => { 132 let nextStatus = ["creating"]; 133 let currStatus = nextStatus.shift(); 134 let ifr = document.createElement('iframe'); 135 let listener = async function(event) { 136 is(event.data, "successful", 137 `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`); 138 document.body.removeChild(ifr); 139 window.removeEventListener("message", listener); 140 await requestChromeAction("close-check"); 141 resolve(); 142 }; 143 window.addEventListener("message", listener); 144 ifr.src = "simple_payment_request.html"; 145 document.body.appendChild(ifr); 146 }); 147 } 148 149 async function testUpdateWithRespondedPayment() { 150 const testName = "testUpdateWithRespondedPayment"; 151 await requestChromeAction("test-setup", testName); 152 return new Promise(resolve => { 153 let nextStatus = ["creating", "showing", "closing", "updating", "finishing"]; 154 let currStatus = nextStatus.shift(); 155 let ifr = document.createElement('iframe'); 156 let handler = undefined; 157 let listener = async function(event) { 158 is(event.data, "successful", 159 `${testName}: Expected 'successful' when ${currStatus}, but got '${event.data}'.`); 160 switch (currStatus) { 161 case "creating": 162 handler = SpecialPowers.getDOMWindowUtils(ifr.contentWindow).setHandlingUserInput(true); 163 ifr.contentWindow.postMessage("show PaymentRequest", "*"); 164 break; 165 case "showing": 166 await requestChromeAction("update-payment"); 167 break; 168 case "closing": 169 await requestChromeAction("reject-payment", false); 170 break; 171 case "updating": 172 await requestChromeAction("close-check"); 173 ifr.contentWindow.postMessage("updateWith PaymentRequest", "*"); 174 break; 175 case "finishing": 176 handler.destruct(); 177 document.body.removeChild(ifr); 178 window.removeEventListener("message", listener); 179 resolve(); 180 break; 181 default: 182 ok(false, testName + ": Unknown status()" + currStatus); 183 break; 184 } 185 currStatus = nextStatus.shift(); 186 } 187 window.addEventListener("message", listener); 188 ifr.src = "simple_payment_request.html"; 189 document.body.appendChild(ifr); 190 }); 191 } 192 193 function getLoadedPaymentRequest(iframe, url) { 194 return new Promise(resolve => { 195 iframe.addEventListener( 196 "load", 197 () => { 198 const { PaymentRequest } = iframe.contentWindow; 199 const request = new PaymentRequest(defaultMethods, defaultDetails); 200 resolve(request); 201 }, 202 { once: true } 203 ); 204 iframe.src = url; 205 }); 206 } 207 208 async function testNonfullyActivePayment() { 209 const testName = "testNonfullyActivePayment"; 210 await requestChromeAction("test-setup", testName); 211 212 const outer = document.createElement("iframe"); 213 outer.allow = "payment"; 214 document.body.appendChild(outer); 215 await getLoadedPaymentRequest(outer,"blank_page.html"); 216 217 const inner = outer.contentDocument.createElement("iframe"); 218 inner.allow = "payment"; 219 outer.contentDocument.body.appendChild(inner); 220 221 const request = await getLoadedPaymentRequest(inner,"blank_page.html"); 222 ok(request, `${testName}: PaymentRequest in inner iframe should exist.`); 223 224 await new Promise(res => { 225 outer.addEventListener("load", res); 226 outer.src = "simple_payment_request.html"; 227 }); 228 229 let handler = SpecialPowers.getDOMWindowUtils(inner.contentWindow).setHandlingUserInput(true); 230 try { 231 const showPromise = await request.show(); 232 ok(false, `${testName}: expected 'AbortError', but got resolved.`); 233 } catch (error) { 234 is(error.name, "AbortError", 235 `${testName}: expected 'AbortError'.`); 236 } 237 await handler.destruct(); 238 inner.remove(); 239 outer.remove(); 240 } 241 242 async function teardown() { 243 return new Promise((resolve) => { 244 gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() { 245 gScript.removeMessageListener("teardown-complete", teardownCompleteHandler); 246 gScript.removeMessageListener("test-fail", testFailHandler); 247 gScript.removeMessageListener("test-pass", testPassHandler); 248 gScript.destroy(); 249 SimpleTest.finish(); 250 resolve(); 251 }); 252 gScript.sendAsyncMessage("teardown"); 253 }); 254 } 255 256 async function runTests() { 257 try { 258 await testCloseByReloading(); 259 await testCloseByRedirecting(); 260 await testCloseByRedirectingAfterShow(); 261 await testCloseByRemovingIframe(); 262 await testUpdateWithRespondedPayment(); 263 await testNonfullyActivePayment(); 264 await teardown(); 265 } catch(e) { 266 ok(false, "test_closePayment.html: Unexpected error: " + e.name); 267 SimpleTest.finish(); 268 } 269 } 270 271 window.addEventListener('load', function() { 272 SpecialPowers.pushPrefEnv({ 273 'set': [ 274 ['dom.payments.request.enabled', true], 275 ] 276 }, runTests); 277 }); 278 </script> 279 </head> 280 <body> 281 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1408234">Mozilla Bug 1408234</a> 282 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1483470">Mozilla Bug 1483470</a> 283 </body> 284 </html>