diff --git a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
index afa32edc54..a76073f9d0 100644
--- a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
+++ b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
@@ -11,7 +11,12 @@
#include
#include
#include
+#include
+#include
+#include
+#include
#include
+#include
#include
#include
#include
@@ -52,6 +57,14 @@ enum ValueTag {
// Following two u32s representing the length of the string, then the following u32s, equal to size, is the string representation.
StringPrimitive,
+ BooleanObject,
+
+ NumberObject,
+
+ StringObject,
+
+ DateObject,
+
// TODO: Define many more types
// This tag or higher are understood to be errors
@@ -89,6 +102,27 @@ public:
} else if (value.is_string()) {
m_serialized.append(ValueTag::StringPrimitive);
TRY(serialize_string(m_serialized, value.as_string()));
+ } else if (value.is_object()) {
+ auto& value_object = value.as_object();
+ if (is(value_object)) {
+ m_serialized.append(ValueTag::BooleanObject);
+ auto& boolean_object = static_cast(value_object);
+ m_serialized.append(bit_cast(static_cast(boolean_object.boolean())));
+ } else if (is(value_object)) {
+ m_serialized.append(ValueTag::NumberObject);
+ auto& number_object = static_cast(value_object);
+ double const number = number_object.number();
+ m_serialized.append(bit_cast(&number), 2);
+ } else if (is(value_object)) {
+ m_serialized.append(ValueTag::StringObject);
+ auto& string_object = static_cast(value_object);
+ TRY(serialize_string(m_serialized, string_object.primitive_string()));
+ } else if (is(value_object)) {
+ m_serialized.append(ValueTag::DateObject);
+ auto& date_object = static_cast(value_object);
+ double const date_value = date_object.date_value();
+ m_serialized.append(bit_cast(&date_value), 2);
+ }
} else {
// TODO: Define many more types
m_error = "Unsupported type"sv;
@@ -179,6 +213,36 @@ public:
m_memory.append(JS::Value { string });
break;
}
+ case BooleanObject: {
+ auto* realm = m_vm.current_realm();
+ bool const value = static_cast(m_vector[position++]);
+ m_memory.append(JS::BooleanObject::create(*realm, value));
+ break;
+ }
+ case ValueTag::NumberObject: {
+ auto* realm = m_vm.current_realm();
+ u32 bits[2];
+ bits[0] = m_vector[position++];
+ bits[1] = m_vector[position++];
+ double const value = *bit_cast(&bits);
+ m_memory.append(JS::NumberObject::create(*realm, value));
+ break;
+ }
+ case ValueTag::StringObject: {
+ auto* realm = m_vm.current_realm();
+ auto string = TRY(deserialize_string_primitive(m_vm, m_vector, position));
+ m_memory.append(TRY(JS::StringObject::create(*realm, string, realm->intrinsics().string_prototype())));
+ break;
+ }
+ case ValueTag::DateObject: {
+ auto* realm = m_vm.current_realm();
+ u32 bits[2];
+ bits[0] = m_vector[position++];
+ bits[1] = m_vector[position++];
+ double const value = *bit_cast(&bits);
+ m_memory.append(JS::Date::create(*realm, value));
+ break;
+ }
default:
m_error = "Unsupported type"sv;
break;