1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 09:24:57 +00:00

LibWeb: Make File a Serializable object

This commit is contained in:
Kenneth Myhra 2024-02-23 22:14:18 +01:00 committed by Andrew Kaster
parent 44e5c62545
commit 0b64a71603
4 changed files with 74 additions and 5 deletions

View file

@ -66,11 +66,11 @@ protected:
virtual void initialize(JS::Realm&) override;
private:
explicit Blob(JS::Realm&);
ByteBuffer m_byte_buffer {};
String m_type {};
private:
explicit Blob(JS::Realm&);
};
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022-2023, Kenneth Myhra <kennethmyhra@serenityos.org>
* Copyright (c) 2022-2024, Kenneth Myhra <kennethmyhra@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -21,6 +21,11 @@ File::File(JS::Realm& realm, ByteBuffer byte_buffer, String file_name, String ty
{
}
File::File(JS::Realm& realm)
: Blob(realm, {})
{
}
void File::initialize(JS::Realm& realm)
{
Base::initialize(realm);
@ -29,6 +34,11 @@ void File::initialize(JS::Realm& realm)
File::~File() = default;
JS::NonnullGCPtr<File> File::create(JS::Realm& realm)
{
return realm.heap().allocate<File>(realm, realm);
}
// https://w3c.github.io/FileAPI/#ref-for-dom-file-file
WebIDL::ExceptionOr<JS::NonnullGCPtr<File>> File::create(JS::Realm& realm, Vector<BlobPart> const& file_bits, String const& file_name, Optional<FilePropertyBag> const& options)
{
@ -77,4 +87,53 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<File>> File::construct_impl(JS::Realm& real
return create(realm, file_bits, file_name, options);
}
WebIDL::ExceptionOr<void> File::serialization_steps(HTML::SerializationRecord& record, bool)
{
auto& vm = this->vm();
TRY(HTML::serialize_string(vm, record, interface_name()));
// FIXME: 1. Set serialized.[[SnapshotState]] to values snapshot state.
// NON-STANDARD: FileAPI spec doesn't specify that type should be serialized, although
// to be conformant with other browsers this needs to be serialized.
TRY(HTML::serialize_string(vm, record, m_type));
// 2. Set serialized.[[ByteSequence]] to values underlying byte sequence.
TRY(HTML::serialize_bytes(vm, record, m_byte_buffer.bytes()));
// 3. Set serialized.[[Name]] to the value of values name attribute.
TRY(HTML::serialize_string(vm, record, m_name));
// 4. Set serialized.[[LastModified]] to the value of values lastModified attribute.
record.append(bit_cast<u32*>(&m_last_modified), 2);
return {};
}
WebIDL::ExceptionOr<void> File::deserialization_steps(ReadonlySpan<u32> const& record, size_t& position)
{
auto& vm = this->vm();
// FIXME: 1. Set values snapshot state to serialized.[[SnapshotState]].
// NON-STANDARD: FileAPI spec doesn't specify that type should be deserialized, although
// to be conformant with other browsers this needs to be deserialized.
m_type = TRY(HTML::deserialize_string(vm, record, position));
// 2. Set values underlying byte sequence to serialized.[[ByteSequence]].
m_byte_buffer = TRY(HTML::deserialize_bytes(vm, record, position));
// 3. Initialize the value of values name attribute to serialized.[[Name]].
m_name = TRY(HTML::deserialize_string(vm, record, position));
// 4. Initialize the value of values lastModified attribute to serialized.[[LastModified]].
u32 bits[2] = {};
bits[0] = record[position++];
bits[1] = record[position++];
m_last_modified = *bit_cast<i64*>(&bits);
return {};
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022-2023, Kenneth Myhra <kennethmyhra@serenityos.org>
* Copyright (c) 2022-2024, Kenneth Myhra <kennethmyhra@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -19,6 +19,7 @@ class File : public Blob {
JS_DECLARE_ALLOCATOR(File);
public:
static JS::NonnullGCPtr<File> create(JS::Realm& realm);
static WebIDL::ExceptionOr<JS::NonnullGCPtr<File>> create(JS::Realm&, Vector<BlobPart> const& file_bits, String const& file_name, Optional<FilePropertyBag> const& options = {});
static WebIDL::ExceptionOr<JS::NonnullGCPtr<File>> construct_impl(JS::Realm&, Vector<BlobPart> const& file_bits, String const& file_name, Optional<FilePropertyBag> const& options = {});
@ -29,8 +30,14 @@ public:
// https://w3c.github.io/FileAPI/#dfn-lastModified
i64 last_modified() const { return m_last_modified; }
virtual StringView interface_name() const override { return "File"sv; }
virtual WebIDL::ExceptionOr<void> serialization_steps(HTML::SerializationRecord& record, bool for_storage) override;
virtual WebIDL::ExceptionOr<void> deserialization_steps(ReadonlySpan<u32> const&, size_t& position) override;
private:
File(JS::Realm&, ByteBuffer, String file_name, String type, i64 last_modified);
explicit File(JS::Realm&);
virtual void initialize(JS::Realm&) override;

View file

@ -34,6 +34,7 @@
#include <LibWeb/Bindings/Serializable.h>
#include <LibWeb/Bindings/Transferable.h>
#include <LibWeb/FileAPI/Blob.h>
#include <LibWeb/FileAPI/File.h>
#include <LibWeb/HTML/MessagePort.h>
#include <LibWeb/HTML/StructuredSerialize.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
@ -927,6 +928,8 @@ private:
{
if (interface_name == "Blob"sv)
return FileAPI::Blob::create(realm);
if (interface_name == "File"sv)
return FileAPI::File::create(realm);
VERIFY_NOT_REACHED();
}