tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>