From 4b66f5662be1b45d4bf2fd55965e0106b4137e22 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Wed, 27 Mar 2024 07:56:00 +0100 Subject: [PATCH] LibWeb: Correct spec steps for serializable objects This aligns us with the current spec steps for serializable objects in StructuredSerializeInternal. --- .../Libraries/LibWeb/HTML/StructuredSerialize.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp index 3dc2d4bee1..a8bea08301 100644 --- a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp +++ b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp @@ -313,12 +313,15 @@ public: else if (value.is_object() && is(value.as_object())) { auto& serializable = dynamic_cast(value.as_object()); - serialize_enum(m_serialized, ValueTag::SerializableObject); + // FIXME: 1. If value has a [[Detached]] internal slot whose value is true, then throw a "DataCloneError" DOMException. + // 2. Let typeString be the identifier of the primary interface of value. + // 3. Set serialized to { [[Type]]: typeString }. + serialize_enum(m_serialized, ValueTag::SerializableObject); TRY(serialize_string(m_vm, m_serialized, serializable.interface_name())); - // 1. Perform the serialization steps for value's primary interface, given value, serialized, and forStorage. - TRY(serializable.serialization_steps(m_serialized, m_for_storage, m_memory)); + // 4. Set deep to true + deep = true; } // 20. Otherwise, if value is a platform object, then throw a "DataCloneError" DOMException. @@ -397,7 +400,11 @@ public: } } - // FIXME: 3. Otherwise, if value is a platform object that is a serializable object, then perform the serialization steps for value's primary interface, given value, serialized, and forStorage. + // 3. Otherwise, if value is a platform object that is a serializable object, then perform the serialization steps for value's primary interface, given value, serialized, and forStorage. + else if (value.is_object() && is(value.as_object())) { + auto& serializable = dynamic_cast(value.as_object()); + TRY(serializable.serialization_steps(m_serialized, m_for_storage, m_memory)); + } // 4. Otherwise, for each key in ! EnumerableOwnProperties(value, key): else {