1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 19:15:09 +00:00

LibWeb: Post all MessagePort messages over their LocalSockets

This is to allow future changes to do cross-process MessagePorts in an
implementation-agnostic way. Add some tests for this behavior.

Delivering messages that were posted to a MessagePort just before it was
transferred is not yet implemented still.
This commit is contained in:
Andrew Kaster 2023-12-19 15:28:56 -07:00 committed by Andrew Kaster
parent 6e3b816763
commit c0f50b12a4
7 changed files with 301 additions and 52 deletions

View file

@ -10,6 +10,8 @@
#include <AK/StdLibExtras.h>
#include <AK/String.h>
#include <AK/Vector.h>
#include <LibIPC/Decoder.h>
#include <LibIPC/Encoder.h>
#include <LibIPC/File.h>
#include <LibJS/Forward.h>
#include <LibJS/Runtime/Array.h>
@ -1129,3 +1131,39 @@ WebIDL::ExceptionOr<JS::Value> structured_deserialize(JS::VM& vm, SerializationR
}
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder& encoder, ::Web::HTML::TransferDataHolder const& data_holder)
{
TRY(encoder.encode(data_holder.data));
TRY(encoder.encode(data_holder.fds));
return {};
}
template<>
ErrorOr<void> encode(Encoder& encoder, ::Web::HTML::SerializedTransferRecord const& record)
{
TRY(encoder.encode(record.serialized));
TRY(encoder.encode(record.transfer_data_holders));
return {};
}
template<>
ErrorOr<::Web::HTML::TransferDataHolder> decode(Decoder& decoder)
{
auto data = TRY(decoder.decode<Vector<u8>>());
auto fds = TRY(decoder.decode<Vector<IPC::File>>());
return ::Web::HTML::TransferDataHolder { move(data), move(fds) };
}
template<>
ErrorOr<::Web::HTML::SerializedTransferRecord> decode(Decoder& decoder)
{
auto serialized = TRY(decoder.decode<Vector<u32>>());
auto transfer_data_holders = TRY(decoder.decode<Vector<::Web::HTML::TransferDataHolder>>());
return ::Web::HTML::SerializedTransferRecord { move(serialized), move(transfer_data_holders) };
}
}