tor-browser

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

constructor-submitter.html (4198B)


      1 <!DOCTYPE html>
      2 <meta charset='utf-8'>
      3 <link rel='help' href='https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#constructing-the-form-data-set'>
      4 <link ref='help' href='https://xhr.spec.whatwg.org/#dom-formdata'>
      5 <script src='/resources/testharness.js'></script>
      6 <script src='/resources/testharnessreport.js'></script>
      7 
      8 <button name=outerNamed value=GO form='myform'></button>
      9 <form id='myform' onsubmit='return false'>
     10  <input name=n1 value=v1>
     11  <button name=named value=GO></button>
     12  <button id=unnamed value=unnamed></button>
     13  <button form="another" name=unassociated value=unassociated></button>
     14  <input type=image name=namedImage src='/media/1x1-green.png'></button>
     15  <input type=image id=unnamedImage src='/media/1x1-green.png'></button>
     16  <input type=image name=unactivatedImage src='/media/1x1-green.png'></button>
     17  <input name=n3 value=v3>
     18 </form>
     19 
     20 <form id='another'>
     21  <button name=unassociated2 value=unassociated></button>
     22 </form>
     23 
     24 <script>
     25 function assertFormDataEntries(formData, expectedEntries) {
     26  const expectedEntryNames = expectedEntries.map((entry) => entry[0]);
     27  const actualEntries = [...formData.entries()];
     28  const actualEntryNames = actualEntries.map((entry) => entry[0]);
     29  assert_array_equals(actualEntryNames, expectedEntryNames);
     30  for (let i = 0; i < actualEntries.length; i++) {
     31    assert_array_equals(actualEntries[i], expectedEntries[i]);
     32  }
     33 }
     34 
     35 const form = document.querySelector('#myform');
     36 
     37 test(() => {
     38  assertFormDataEntries(
     39    new FormData(form, null),
     40    [['n1', 'v1'], ['n3', 'v3']]
     41  );
     42 }, 'FormData construction should allow a null submitter'); // the use case here is so web developers can avoid null checks, e.g. `new FormData(e.target, e.submitter)`
     43 
     44 test(() => {
     45  assertFormDataEntries(new FormData(undefined, undefined), []);
     46 }, 'FormData construction should allow an undefined form and an undefined submitter');
     47 
     48 test(() => {
     49  assertFormDataEntries(new FormData(undefined, null), []);
     50 }, 'FormData construction should allow an undefined form and a null submitter');
     51 
     52 test(() => {
     53  assert_throws_js(TypeError, () => new FormData(form, document.querySelector('[name=n1]')));
     54 }, 'FormData construction should throw a TypeError if a non-null submitter is not a submit button');
     55 
     56 test(() => {
     57  assert_throws_dom('NotFoundError', () => new FormData(form, document.querySelector('[name=unassociated]')));
     58  assert_throws_dom('NotFoundError', () => new FormData(form, document.querySelector('[name=unassociated2]')));
     59 }, "FormData construction should throw a 'NotFoundError' DOMException if a non-null submitter is not owned by the form");
     60 
     61 test(() => {
     62  assertFormDataEntries(
     63    new FormData(form, document.querySelector('[name=named]')),
     64    [['n1', 'v1'], ['named', 'GO'], ['n3', 'v3']]
     65  );
     66  assertFormDataEntries(
     67    new FormData(form, document.querySelector('[name=outerNamed]')),
     68    [['outerNamed', 'GO'], ['n1', 'v1'], ['n3', 'v3']]
     69  );
     70 }, 'The constructed FormData object should contain an in-tree-order entry for a named submit button submitter');
     71 
     72 test(() => {
     73  assertFormDataEntries(
     74    new FormData(form, document.querySelector('#unnamed')),
     75    [['n1', 'v1'], ['n3', 'v3']]
     76  );
     77 }, 'The constructed FormData object should not contain an entry for an unnamed submit button submitter');
     78 
     79 test(() => {
     80  const submitter1 = document.querySelector('[name=namedImage]');
     81  submitter1.click();
     82  const submitter2 = document.querySelector('#unnamedImage');
     83  submitter2.click();
     84  assertFormDataEntries(
     85    new FormData(form, submitter1),
     86    [['n1', 'v1'], ['namedImage.x', '0'], ['namedImage.y', '0'], ['n3', 'v3']]
     87  );
     88  assertFormDataEntries(
     89    new FormData(form, submitter2),
     90    [['n1', 'v1'], ['x', '0'], ['y', '0'], ['n3', 'v3']]
     91  );
     92 }, 'The constructed FormData object should contain in-tree-order entries for an activated Image Button submitter');
     93 
     94 test(() => {
     95  assertFormDataEntries(
     96    new FormData(form, document.querySelector('[name=unactivatedImage]')),
     97    [['n1', 'v1'], ['unactivatedImage.x', '0'], ['unactivatedImage.y', '0'], ['n3', 'v3']]
     98  );
     99 }, 'The constructed FormData object should contain in-tree-order entries for an unactivated Image Button submitter');
    100 </script>