diff --git a/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt b/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt
index 69492c908a..3c5d824eac 100644
--- a/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt
+++ b/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt
@@ -16,3 +16,5 @@ instanceOf DOMPointReadOnly: true
DOMPointReadOnly: {"x":10,"y":20,"z":30,"w":40}
instanceOf DOMPoint: true
DOMPoint: {"x":10,"y":20,"z":30,"w":40}
+instanceOf DOMRectReadOnly: true
+DOMRectReadOnly: {"x":10,"y":20,"width":30,"height":40,"top":20,"right":40,"bottom":60,"left":10}
diff --git a/Tests/LibWeb/Text/input/HTML/StructuredClone-serializable-objects.html b/Tests/LibWeb/Text/input/HTML/StructuredClone-serializable-objects.html
index 439ac8e5ea..07dc0625ac 100644
--- a/Tests/LibWeb/Text/input/HTML/StructuredClone-serializable-objects.html
+++ b/Tests/LibWeb/Text/input/HTML/StructuredClone-serializable-objects.html
@@ -35,6 +35,10 @@
println(`instanceOf DOMPoint: ${domPoint instanceof DOMPoint}`);
println(`DOMPoint: ${JSON.stringify(domPoint)}`);
+ let domRectReadOnly = structuredClone(new DOMRectReadOnly(10, 20, 30, 40));
+ println(`instanceOf DOMRectReadOnly: ${domRectReadOnly instanceof DOMRectReadOnly}`);
+ println(`DOMRectReadOnly: ${JSON.stringify(domRectReadOnly)}`);
+
done();
});
diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.cpp b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.cpp
index 5bc7420327..364a654282 100644
--- a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.cpp
+++ b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.cpp
@@ -1,11 +1,13 @@
/*
* Copyright (c) 2022, Andreas Kling
+ * Copyright (c) 2024, Kenneth Myhra
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include
#include
+#include
#include
namespace Web::Geometry {
@@ -24,12 +26,22 @@ JS::NonnullGCPtr DOMRectReadOnly::from_rect(JS::VM& vm, Geometr
return realm.heap().allocate(realm, realm, other.x, other.y, other.width, other.height);
}
+JS::NonnullGCPtr DOMRectReadOnly::create(JS::Realm& realm)
+{
+ return realm.heap().allocate(realm, realm);
+}
+
DOMRectReadOnly::DOMRectReadOnly(JS::Realm& realm, double x, double y, double width, double height)
: PlatformObject(realm)
, m_rect(x, y, width, height)
{
}
+DOMRectReadOnly::DOMRectReadOnly(JS::Realm& realm)
+ : PlatformObject(realm)
+{
+}
+
DOMRectReadOnly::~DOMRectReadOnly() = default;
void DOMRectReadOnly::initialize(JS::Realm& realm)
@@ -38,4 +50,35 @@ void DOMRectReadOnly::initialize(JS::Realm& realm)
WEB_SET_PROTOTYPE_FOR_INTERFACE(DOMRectReadOnly);
}
+// https://drafts.fxtf.org/geometry/#structured-serialization
+WebIDL::ExceptionOr DOMRectReadOnly::serialization_steps(HTML::SerializationRecord& serialized, bool)
+{
+ // 1. Set serialized.[[X]] to value’s x coordinate.
+ HTML::serialize_primitive_type(serialized, this->x());
+ // 2. Set serialized.[[Y]] to value’s y coordinate.
+ HTML::serialize_primitive_type(serialized, this->y());
+ // 3. Set serialized.[[Width]] to value’s width.
+ HTML::serialize_primitive_type(serialized, this->width());
+ // 4. Set serialized.[[Height]] to value’s height.
+ HTML::serialize_primitive_type(serialized, this->height());
+ return {};
+}
+
+// https://drafts.fxtf.org/geometry/#structured-serialization
+WebIDL::ExceptionOr DOMRectReadOnly::deserialization_steps(ReadonlySpan const& serialized, size_t& position)
+{
+ // 1. Set value’s x coordinate to serialized.[[X]].
+ auto x = HTML::deserialize_primitive_type(serialized, position);
+ // 2. Set value’s y coordinate to serialized.[[Y]].
+ auto y = HTML::deserialize_primitive_type(serialized, position);
+ // 3. Set value’s width to serialized.[[Width]].
+ auto width = HTML::deserialize_primitive_type(serialized, position);
+ // 4. Set value’s height to serialized.[[Height]].
+ auto height = HTML::deserialize_primitive_type(serialized, position);
+
+ m_rect = { x, y, width, height };
+
+ return {};
+}
+
}
diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h
index 0d1883972d..3e3f43cf2f 100644
--- a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h
+++ b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021, Andreas Kling
+ * Copyright (c) 2024, Kenneth Myhra
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -8,6 +9,7 @@
#include
#include
+#include
#include
namespace Web::Geometry {
@@ -21,13 +23,16 @@ struct DOMRectInit {
};
// https://drafts.fxtf.org/geometry/#domrectreadonly
-class DOMRectReadOnly : public Bindings::PlatformObject {
+class DOMRectReadOnly
+ : public Bindings::PlatformObject
+ , public Bindings::Serializable {
WEB_PLATFORM_OBJECT(DOMRectReadOnly, Bindings::PlatformObject);
JS_DECLARE_ALLOCATOR(DOMRectReadOnly);
public:
static WebIDL::ExceptionOr> construct_impl(JS::Realm&, double x = 0, double y = 0, double width = 0, double height = 0);
[[nodiscard]] static JS::NonnullGCPtr from_rect(JS::VM&, DOMRectInit const&);
+ static JS::NonnullGCPtr create(JS::Realm&);
virtual ~DOMRectReadOnly() override;
@@ -64,8 +69,13 @@ public:
return min(x(), x() + width());
}
+ virtual StringView interface_name() const override { return "DOMRectReadOnly"sv; }
+ virtual WebIDL::ExceptionOr serialization_steps(HTML::SerializationRecord&, bool for_storage) override;
+ virtual WebIDL::ExceptionOr deserialization_steps(ReadonlySpan const&, size_t& position) override;
+
protected:
DOMRectReadOnly(JS::Realm&, double x, double y, double width, double height);
+ explicit DOMRectReadOnly(JS::Realm&);
virtual void initialize(JS::Realm&) override;
diff --git a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
index ecb4341af7..4e70133ce7 100644
--- a/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
+++ b/Userland/Libraries/LibWeb/HTML/StructuredSerialize.cpp
@@ -39,6 +39,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -975,6 +976,8 @@ private:
return Geometry::DOMPointReadOnly::create(realm);
if (interface_name == "DOMPoint"sv)
return Geometry::DOMPoint::create(realm);
+ if (interface_name == "DOMRectReadOnly"sv)
+ return Geometry::DOMRectReadOnly::create(realm);
VERIFY_NOT_REACHED();
}