Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F3072245
formdata.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
formdata.js
View Options
import
{
test
,
testThrows
,
testDeep
,
summary
}
from
'./helpers.js'
;
console
.
log
(
'FormData constructor\n'
);
const
fd0
=
new
FormData
();
test
(
'empty constructor'
,
fd0
.
has
(
'x'
),
false
);
testThrows
(
'requires new'
,
()
=>
FormData
());
testThrows
(
'rejects form element'
,
()
=>
new
FormData
(
document
));
console
.
log
(
'\nappend / get / has / delete / set\n'
);
const
fd
=
new
FormData
();
fd
.
append
(
'name'
,
'Alice'
);
test
(
'append then get'
,
fd
.
get
(
'name'
),
'Alice'
);
test
(
'has returns true'
,
fd
.
has
(
'name'
),
true
);
test
(
'has missing returns false'
,
fd
.
has
(
'other'
),
false
);
fd
.
append
(
'name'
,
'Bob'
);
const
all
=
fd
.
getAll
(
'name'
);
test
(
'getAll length after two appends'
,
all
.
length
,
2
);
test
(
'getAll first'
,
all
[
0
],
'Alice'
);
test
(
'getAll second'
,
all
[
1
],
'Bob'
);
fd
.
set
(
'name'
,
'Carol'
);
test
(
'set replaces all'
,
fd
.
getAll
(
'name'
).
length
,
1
);
test
(
'set value'
,
fd
.
get
(
'name'
),
'Carol'
);
fd
.
delete
(
'name'
);
test
(
'delete removes all'
,
fd
.
has
(
'name'
),
false
);
test
(
'get after delete returns null'
,
fd
.
get
(
'name'
),
null
);
console
.
log
(
'\nBlob values\n'
);
const
blob
=
new
Blob
([
'hello'
],
{
type
:
'text/plain'
});
const
fdb
=
new
FormData
();
fdb
.
append
(
'file'
,
blob
);
const
got
=
fdb
.
get
(
'file'
);
test
(
'blob entry is File instance'
,
got
instanceof
File
,
true
);
test
(
'blob entry filename default'
,
got
.
name
,
'blob'
);
test
(
'blob entry type'
,
got
.
type
,
'text/plain'
);
fdb
.
append
(
'file2'
,
blob
,
'custom.txt'
);
const
got2
=
fdb
.
get
(
'file2'
);
test
(
'blob with filename'
,
got2
.
name
,
'custom.txt'
);
console
.
log
(
'\nFile values\n'
);
const
file
=
new
File
([
'world'
],
'test.txt'
,
{
type
:
'text/html'
});
const
fdf
=
new
FormData
();
fdf
.
append
(
'upload'
,
file
);
const
gotf
=
fdf
.
get
(
'upload'
);
test
(
'file entry is File instance'
,
gotf
instanceof
File
,
true
);
test
(
'file entry name from File'
,
gotf
.
name
,
'test.txt'
);
test
(
'file entry type'
,
gotf
.
type
,
'text/html'
);
fdf
.
append
(
'upload2'
,
file
,
'override.txt'
);
test
(
'file entry name overridden'
,
fdf
.
get
(
'upload2'
).
name
,
'override.txt'
);
console
.
log
(
'\ngetAll with mixed types\n'
);
const
fdm
=
new
FormData
();
fdm
.
append
(
'x'
,
'str'
);
fdm
.
append
(
'x'
,
new
Blob
([
'data'
]));
const
mixed
=
fdm
.
getAll
(
'x'
);
test
(
'mixed getAll length'
,
mixed
.
length
,
2
);
test
(
'mixed first is string'
,
mixed
[
0
],
'str'
);
test
(
'mixed second is File'
,
mixed
[
1
]
instanceof
File
,
true
);
console
.
log
(
'\nforEach\n'
);
const
fdfe
=
new
FormData
();
fdfe
.
append
(
'b'
,
'2'
);
fdfe
.
append
(
'a'
,
'1'
);
const
seen
=
[];
fdfe
.
forEach
((
val
,
name
)
=>
seen
.
push
(
`
${
name
}
=
${
val
}
`
));
test
(
'forEach visits all entries'
,
seen
.
length
,
2
);
test
(
'forEach insertion order first'
,
seen
[
0
],
'b=2'
);
test
(
'forEach insertion order second'
,
seen
[
1
],
'a=1'
);
console
.
log
(
'\nentries / keys / values\n'
);
const
fdi
=
new
FormData
();
fdi
.
append
(
'x'
,
'1'
);
fdi
.
append
(
'y'
,
'2'
);
fdi
.
append
(
'x'
,
'3'
);
const
keys
=
[...
fdi
.
keys
()];
test
(
'keys length'
,
keys
.
length
,
3
);
test
(
'keys first'
,
keys
[
0
],
'x'
);
test
(
'keys second'
,
keys
[
1
],
'y'
);
test
(
'keys third'
,
keys
[
2
],
'x'
);
const
vals
=
[...
fdi
.
values
()];
test
(
'values first'
,
vals
[
0
],
'1'
);
test
(
'values second'
,
vals
[
1
],
'2'
);
test
(
'values third'
,
vals
[
2
],
'3'
);
const
entries
=
[...
fdi
.
entries
()];
test
(
'entries length'
,
entries
.
length
,
3
);
test
(
'entries first name'
,
entries
[
0
][
0
],
'x'
);
test
(
'entries first value'
,
entries
[
0
][
1
],
'1'
);
console
.
log
(
'\nSymbol.iterator\n'
);
const
fds
=
new
FormData
();
fds
.
append
(
'k'
,
'v'
);
const
iter_result
=
[...
fds
];
test
(
'Symbol.iterator yields entries'
,
iter_result
.
length
,
1
);
test
(
'Symbol.iterator entry name'
,
iter_result
[
0
][
0
],
'k'
);
test
(
'Symbol.iterator entry value'
,
iter_result
[
0
][
1
],
'v'
);
console
.
log
(
'\ntoStringTag\n'
);
test
(
'toStringTag'
,
Object
.
prototype
.
toString
.
call
(
new
FormData
()),
'[object FormData]'
);
console
.
log
(
'\nmultipart parameter parsing\n'
);
const
boundary
=
'spec-boundary'
;
const
multipartBody
=
`--
${
boundary
}
\r\n`
+
`Content-Disposition: form-data; name="field"\r\n\r\n`
+
`value\r\n`
+
`--
${
boundary
}
--\r\n`
;
const
multipartReq
=
new
Request
(
'https://example.com/'
,
{
method
:
'POST'
,
headers
:
{
'Content-Type'
:
`multipart/form-data; boundaryx=wrong; boundary="
${
boundary
}
"`
,
},
body
:
multipartBody
,
});
const
multipartFd
=
await
multipartReq
.
formData
();
test
(
'multipart boundary lookup skips longer prefix match'
,
multipartFd
.
get
(
'field'
),
'value'
);
summary
();
File Metadata
Details
Attached
Mime Type
application/javascript
Expires
Sat, Apr 4, 1:06 AM (2 d)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
521307
Default Alt Text
formdata.js (4 KB)
Attached To
Mode
rANT Ant
Attached
Detach File
Event Timeline
Log In to Comment