diff --git a/Libraries/LibWeb/HTML/FormControlInfrastructure.cpp b/Libraries/LibWeb/HTML/FormControlInfrastructure.cpp index ca0c504742d..17ce4f7ca3b 100644 --- a/Libraries/LibWeb/HTML/FormControlInfrastructure.cpp +++ b/Libraries/LibWeb/HTML/FormControlInfrastructure.cpp @@ -47,6 +47,7 @@ WebIDL::ExceptionOr create_entry(JS::Realm& realm, String co if (filename.has_value()) { FileAPI::FilePropertyBag options {}; options.type = blob->type(); + options.last_modified = as(*blob).last_modified(); blob = TRY(FileAPI::File::create(realm, { GC::make_root(*blob) }, *filename, move(options))); } diff --git a/Tests/LibWeb/Text/expected/wpt-import/xhr/formdata/set-blob.any.txt b/Tests/LibWeb/Text/expected/wpt-import/xhr/formdata/set-blob.any.txt new file mode 100644 index 00000000000..30abea5ba3b --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/xhr/formdata/set-blob.any.txt @@ -0,0 +1,10 @@ +Harness status: OK + +Found 5 tests + +5 Pass +Pass blob without type +Pass blob with type +Pass blob with custom name +Pass file without lastModified or custom name +Pass file with lastModified and custom name \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.html b/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.html new file mode 100644 index 00000000000..000a14254cc --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.html @@ -0,0 +1,15 @@ + + +formData.set(blob) and formData.set(file) + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.js b/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.js new file mode 100644 index 00000000000..01946faeab2 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/xhr/formdata/set-blob.any.js @@ -0,0 +1,61 @@ +// META: title=formData.set(blob) and formData.set(file) + +"use strict"; + +const formData = new FormData(); + +test(() => { + const value = new Blob(); + formData.set("blob-1", value); + const blob1 = formData.get("blob-1"); + assert_not_equals(blob1, value); + assert_equals(blob1.constructor.name, "File"); + assert_equals(blob1.name, "blob"); + assert_equals(blob1.type, ""); + assert_equals(formData.get("blob-1") === formData.get("blob-1"), true, "should return the same value when get the same blob entry from FormData"); + assert_less_than(Math.abs(blob1.lastModified - Date.now()), 200, "lastModified should be now"); +}, "blob without type"); + +test(() => { + const value = new Blob([], { type: "text/plain" }); + formData.set("blob-2", value); + const blob2 = formData.get("blob-2"); + assert_not_equals(blob2, value); + assert_equals(blob2.constructor.name, "File"); + assert_equals(blob2.name, "blob"); + assert_equals(blob2.type, "text/plain"); + assert_less_than(Math.abs(blob2.lastModified - Date.now()), 200, "lastModified should be now"); +}, "blob with type"); + +test(() => { + const value = new Blob(); + formData.set("blob-3", value, "custom name"); + const blob3 = formData.get("blob-3"); + assert_not_equals(blob3, value); + assert_equals(blob3.constructor.name, "File"); + assert_equals(blob3.name, "custom name"); + assert_equals(blob3.type, ""); + assert_less_than(Math.abs(blob3.lastModified - Date.now()), 200, "lastModified should be now"); +}, "blob with custom name"); + +test(() => { + const value = new File([], "name"); + formData.set("file-1", value); + const file1 = formData.get("file-1"); + assert_equals(file1, value); + assert_equals(file1.constructor.name, "File"); + assert_equals(file1.name, "name"); + assert_equals(file1.type, ""); + assert_less_than(Math.abs(file1.lastModified - Date.now()), 200, "lastModified should be now"); +}, "file without lastModified or custom name"); + +test(() => { + const value = new File([], "name", { lastModified: 123 }); + formData.set("file-2", value, "custom name"); + const file2 = formData.get("file-2"); + assert_not_equals(file2, value); + assert_equals(file2.constructor.name, "File"); + assert_equals(file2.name, "custom name"); + assert_equals(file2.type, ""); + assert_equals(file2.lastModified, 123, "lastModified should be 123"); +}, "file with lastModified and custom name");