test_double_submit.html (3334B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>Test for Bug 1590762</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <script src="/tests/SimpleTest/EventUtils.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 8 </head> 9 <body> 10 <iframe name="targetFrame" id="targetFrame"></iframe> 11 <form id="form" action="double_submit.sjs?delay=1000" method="POST" target="targetFrame"> 12 <input id="token" type="text" name="token" value=""> 13 <input id="button" type="submit"> 14 </form> 15 <script> 16 "use strict"; 17 18 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 19 const CROSS_ORIGIN_URI = "http://test1.example.com/tests/docshell/test/mochitest/ping.html"; 20 21 function asyncClick(counts) { 22 let frame = document.createElement('iframe'); 23 frame.addEventListener( 24 'load', () => frame.contentWindow.postMessage({command: "start"}, "*"), 25 { once:true }); 26 frame.src = "clicker.html"; 27 28 addEventListener('message', ({source}) => { 29 if (source === frame.contentWindow) { 30 counts.click++; 31 synthesizeMouse(document.getElementById('button'), 5, 5, {}); 32 } 33 }, { once: true }); 34 35 document.body.appendChild(frame); 36 return stop; 37 } 38 39 function click(button) { 40 synthesizeMouse(button, 5, 5, {}); 41 } 42 43 add_task(async function runTest() { 44 let frame = document.getElementById('targetFrame'); 45 await new Promise(resolve => { 46 addEventListener('message', resolve, {once: true}); 47 frame.src = CROSS_ORIGIN_URI; 48 }); 49 50 let form = document.getElementById('form'); 51 let button = document.getElementById('button'); 52 53 let token = document.getElementById('token'); 54 token.value = "first"; 55 56 await new Promise((resolve, reject) => { 57 let counts = { click: 0, submit: 0 }; 58 form.addEventListener('submit', () => counts.submit++); 59 asyncClick(counts); 60 form.requestSubmit(button); 61 token.value = "bad"; 62 let steps = { 63 good: { 64 entered: false, 65 next: () => { steps.good.entered = true; resolve(); }, 66 assertion: () => { 67 ok(steps.first.entered && !steps.bad.entered, "good comes after first, but not bad") 68 } 69 }, 70 first: { 71 entered: false, 72 next: () => { steps.first.entered = true; token.value = "good"; click(button); }, 73 assertion: () => { 74 ok(!steps.good.entered && !steps.bad.entered, "first message is first") 75 is(counts.click, 1, "clicked"); 76 is(counts.submit, 2, "did submit"); 77 } 78 }, 79 bad: { 80 entered: false, 81 next: () => { reject(); }, 82 assertion: () => ok(false, "we got a bad message") 83 } 84 }; 85 addEventListener('message', ({source, data}) => { 86 if (source !== frame.contentWindow) { 87 return; 88 } 89 90 let step = steps[data] || reject; 91 step.assertion(); 92 step.next(); 93 }) 94 }); 95 }); 96 </script> 97 </body> 98 </html>