From 9f5fa4f4a0c97f7eef85e98e86c09902dd6aca6c Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Sun, 10 Mar 2024 09:02:54 +0100 Subject: [PATCH] LibWeb: Add {,de}serialization steps for DOMRectReadonly --- .../StructuredClone-serializable-objects.txt | 2 + .../StructuredClone-serializable-objects.html | 4 ++ .../LibWeb/Geometry/DOMRectReadOnly.cpp | 43 +++++++++++++++++++ .../LibWeb/Geometry/DOMRectReadOnly.h | 12 +++++- .../LibWeb/HTML/StructuredSerialize.cpp | 3 ++ 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt b/Tests/LibWeb/Text/expected/HTML/StructuredClone-serializable-objects.txt index 69492c908a9..3c5d824eacf 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 439ac8e5ea6..07dc0625acf 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 5bc74203274..364a6542822 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 0d1883972d3..3e3f43cf2fa 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 ecb4341af79..4e70133ce72 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(); }