summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/xhr/formdata/constructor-formelement.html
blob: 813e1d2a6c0ef432e743d4d1658deb8acefcbc18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<!DOCTYPE html>
<title>FormData: constructor (with form element)</title>
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
<link rel="help" href="https://xhr.spec.whatwg.org/#dom-formdata">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#constructing-form-data-set">

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<form>
  <output name="do-not-submit-me-1"></output>

  <datalist>
    <input type="text" name="do-not-submit-me-2" value="bad">
    <select name="do-not-submit-me-3">
      <option value="bad" selected></option>
    </select>
    <input type="checkbox" name="do-not-submit-me-4" checked>
  </datalist>

  <input type="text" name="do-not-submit-me-5" disabled value="bad">
  <fieldset disabled>
    <input type="text" name="do-not-submit-me-6" value="bad">
  </fieldset>

  <button name="do-not-submit-me-7">bad</button>
  <input type="submit" name="do-not-submit-me-8" value="bad">
  <input type="reset" name="do-not-submit-me-9" value="bad">
  <input type="image" name="do-not-submit-me-10" value="bad">

  <input type="checkbox" name="do-not-submit-me-11">
  <input type="radio" name="do-not-submit-me-12">

  <input type="text" value="do-not-submit-me-13">
  <input type="text" name="" value="do-not-submit-me-14">

  <object name="do-not-submit-me-15"></object>

  <select name="select-1">
    <option disabled value="do-not-submit-me-16"></option>
    <option value="do-not-submit-me-17"></option>
    <option disabled value="do-not-submit-me-18" selected></option>
  </select>

  <select name="select-2">
    <option value="do-not-submit-me-19"></option>
    <option value="submit-me-1" selected></option>
  </select>

  <select name="select-3" multiple>
    <option value="do-not-submit-me-20"></option>
    <option value="submit-me-2" selected></option>
    <option value="do-not-submit-me-21"></option>
    <option value="submit-me-3" selected></option>
  </select>

  <input type="checkbox" name="submit-me-4" value="checkbox-1" checked>
  <input type="checkbox" name="submit-me-5" checked>

  <input type="radio" name="submit-me-6" value="radio-1" checked>
  <input type="radio" name="submit-me-7" checked>

  <!-- not tested: <input type="file"> with selected files -->

  <input type="file" name="file-1">

  <!-- not tested: <object>s that allow form submission -->

  <input type="text" name="submit-me-8" value="text-1">
  <input type="text" name="submit-me-8" value="text-2">
  <input type="search" name="submit-me-9" value="search-1">
  <input type="url" name="submit-me-10" value="url-1">
  <input type="hidden" name="submit-me-11" value="hidden-1">
  <input type="password" name="submit-me-12" value="password-1">
  <input type="number" name="submit-me-13" value="11">
  <input type="range" name="submit-me-14" value="11">
  <input type="color" name="submit-me-15" value="#123456">

  <textarea name="submit-me-16">textarea value
with linebreaks set to LF</textarea>

  <!-- this generates two form data entries! -->
  <input type="text" name="dirname-is-special" dirname="submit-me-17" value="dirname-value">

  <input type="text" name="submit-me-21">
</form>

<script>
"use strict";

test(() => {

  const form = document.querySelector("form");

  const input = document.createElement("input");
  input.name = "submit-me-18-\uDC01";
  input.value = "value-\uDC01";
  assert_equals(input.name, "submit-me-18-\uDC01", "input.name accepts unpaired surrogates");
  assert_equals(input.value, "value-\uDC01", "input.value accepts unpaired surrogates");
  form.appendChild(input);

  const input2 = document.createElement("input");
  input2.name = "submit-me-\r19\n";
  input2.value = "value\n\r";
  assert_equals(input2.name, "submit-me-\r19\n", "input.name accepts \\r and \\n");
  assert_equals(input2.value, "value", "input.value when type=text should not contain newlines");
  form.appendChild(input2);

  const formData = new FormData(form);

  const expected = [
    ["select-2", "submit-me-1"],
    ["select-3", ["submit-me-2", "submit-me-3"]],
    ["submit-me-4", "checkbox-1"],
    ["submit-me-5", "on"],
    ["submit-me-6", "radio-1"],
    ["submit-me-7", "on"],
    ["submit-me-8", ["text-1", "text-2"]],
    ["submit-me-9", "search-1"],
    ["submit-me-10", "url-1"],
    ["submit-me-11", "hidden-1"],
    ["submit-me-12", "password-1"],
    ["submit-me-13", "11"],
    ["submit-me-14", "11"],
    ["submit-me-15", "#123456"],
    ["submit-me-16", "textarea value\nwith linebreaks set to LF"],
    ["dirname-is-special", "dirname-value"],
    ["submit-me-17", "ltr"],
    ["submit-me-18-\uFFFD", "value-\uFFFD"],
    ["submit-me-\r19\n", "value"],
    ["submit-me-21", ""]
  ];

  for (const t of expected) {
    const field = t[0];
    const valueOrValues = t[1];
    const values = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues];
    assert_array_equals(formData.getAll(field), values, field);
  }

  const fileEntry = formData.getAll("file-1");
  assert_equals(fileEntry.length, 1);
  assert_equals(fileEntry[0], formData.get("file-1"));
  assert_equals(fileEntry[0].constructor, File);
  assert_equals(fileEntry[0].size, 0);
  assert_equals(fileEntry[0].name, "");
  assert_equals(fileEntry[0].type, "application/octet-stream");

}, "test that FormData is correctly constructed from the form data set");
</script>