/* * Copyright (c) 2022, Daniel Ehrenberg * Copyright (c) 2022, Andrew Kaster * Copyright (c) 2024, Kenneth Myhra * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::HTML { class TransferDataEncoder { public: explicit TransferDataEncoder(); explicit TransferDataEncoder(IPC::MessageBuffer&&); template void encode(T const& value) { MUST(m_encoder.encode(value)); } void append(SerializationRecord&&); void extend(Vector); IPC::MessageBuffer const& buffer() const { return m_buffer; } IPC::MessageBuffer take_buffer() { return move(m_buffer); } private: IPC::MessageBuffer m_buffer; IPC::Encoder m_encoder; }; class TransferDataDecoder { public: explicit TransferDataDecoder(SerializationRecord const&); explicit TransferDataDecoder(TransferDataEncoder&&); template T decode() { static_assert(!IsSame, "Use decode_buffer to handle OOM"); return MUST(m_decoder.decode()); } WebIDL::ExceptionOr decode_buffer(JS::Realm&); private: IPC::MessageBuffer m_buffer; FixedMemoryStream m_stream; Queue m_files; IPC::Decoder m_decoder; }; struct SerializedTransferRecord { SerializationRecord serialized; Vector transfer_data_holders; }; struct DeserializedTransferRecord { JS::Value deserialized; Vector> transferred_values; }; WebIDL::ExceptionOr structured_serialize(JS::VM&, JS::Value); WebIDL::ExceptionOr structured_serialize_for_storage(JS::VM&, JS::Value); WebIDL::ExceptionOr structured_serialize_internal(JS::VM&, JS::Value, bool for_storage, SerializationMemory&); WebIDL::ExceptionOr structured_deserialize(JS::VM&, SerializationRecord const&, JS::Realm&, Optional = {}); WebIDL::ExceptionOr structured_deserialize_internal(JS::VM&, TransferDataDecoder&, JS::Realm&, DeserializationMemory&); WebIDL::ExceptionOr structured_serialize_with_transfer(JS::VM&, JS::Value, Vector> const& transfer_list); WebIDL::ExceptionOr structured_deserialize_with_transfer(SerializedTransferRecord&, JS::Realm&); WebIDL::ExceptionOr structured_deserialize_with_transfer_internal(TransferDataDecoder&, JS::Realm&); } namespace IPC { template<> ErrorOr encode(Encoder&, Web::HTML::TransferDataEncoder const&); template<> ErrorOr decode(Decoder&); template<> ErrorOr encode(Encoder&, Web::HTML::SerializedTransferRecord const&); template<> ErrorOr decode(Decoder&); }