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>