From 3c0b55c284ba2a7e64a0c311f96cf3f3b9bcc14a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 8 Oct 2021 22:59:15 +0200 Subject: [PATCH] LibWeb: Add DOMRectReadOnly and make DOMRect inherit from it This matches the class hierarchy of the CSS Geometry Interfaces Module. --- .../LibWeb/Bindings/WindowObjectHelper.h | 6 +++ Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 2 + Userland/Libraries/LibWeb/Geometry/DOMRect.h | 21 +++----- .../Libraries/LibWeb/Geometry/DOMRect.idl | 15 ++---- .../LibWeb/Geometry/DOMRectReadOnly.h | 51 +++++++++++++++++++ .../LibWeb/Geometry/DOMRectReadOnly.idl | 15 ++++++ 7 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h create mode 100644 Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.idl diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 2ecdfbb0fb..f089d25632 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -40,6 +40,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -294,6 +298,8 @@ ADD_WINDOW_OBJECT_INTERFACE(DOMException) \ ADD_WINDOW_OBJECT_INTERFACE(DOMImplementation) \ ADD_WINDOW_OBJECT_INTERFACE(DOMParser) \ + ADD_WINDOW_OBJECT_INTERFACE(DOMRect) \ + ADD_WINDOW_OBJECT_INTERFACE(DOMRectReadOnly) \ ADD_WINDOW_OBJECT_INTERFACE(DOMStringMap) \ ADD_WINDOW_OBJECT_INTERFACE(Element) \ ADD_WINDOW_OBJECT_INTERFACE(Event) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index ad49eedfaa..fb6bedc4b3 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -380,6 +380,7 @@ libweb_js_wrapper(DOM/NodeList) libweb_js_wrapper(DOM/Range) libweb_js_wrapper(DOM/Text) libweb_js_wrapper(Geometry/DOMRect) +libweb_js_wrapper(Geometry/DOMRectReadOnly) libweb_js_wrapper(HTML/CanvasRenderingContext2D) libweb_js_wrapper(HTML/CloseEvent) libweb_js_wrapper(HTML/DOMParser) diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 702b890e03..c6f3506a80 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -105,6 +105,7 @@ class ExceptionOr; namespace Web::Geometry { class DOMRect; +class DOMRectReadOnly; } namespace Web::HTML { @@ -293,6 +294,7 @@ class DOMExceptionWrapper; class DOMImplementationWrapper; class DOMParserWrapper; class DOMRectWrapper; +class DOMRectReadOnlyWrapper; class DOMStringMapWrapper; class ElementWrapper; class EventListenerWrapper; diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRect.h b/Userland/Libraries/LibWeb/Geometry/DOMRect.h index bed9698107..dd46bec587 100644 --- a/Userland/Libraries/LibWeb/Geometry/DOMRect.h +++ b/Userland/Libraries/LibWeb/Geometry/DOMRect.h @@ -6,18 +6,13 @@ #pragma once -#include -#include -#include -#include +#include namespace Web::Geometry { -// FIXME: Split this into DOMRectReadOnly and DOMRect // https://drafts.fxtf.org/geometry/#DOMRect class DOMRect final - : public RefCounted - , public Bindings::Wrappable { + : public DOMRectReadOnly { public: using WrapperType = Bindings::DOMRectWrapper; @@ -41,17 +36,15 @@ public: double width() const { return m_rect.width(); } double height() const { return m_rect.height(); } - double top() const { return min(y(), y() + height()); } - double right() const { return max(x(), x() + width()); } - double bottom() const { return max(y(), y() + height()); } - double left() const { return min(x(), x() + width()); } + void set_x(double x) { m_rect.set_x(x); } + void set_y(double y) { m_rect.set_y(y); } + void set_width(double width) { m_rect.set_width(width); } + void set_height(double height) { m_rect.set_height(height); } private: DOMRect(float x, float y, float width, float height) - : m_rect(x, y, width, height) + : DOMRectReadOnly(x, y, width, height) { } - - Gfx::FloatRect m_rect; }; } diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRect.idl b/Userland/Libraries/LibWeb/Geometry/DOMRect.idl index 0e0c599f6b..de5ad59fb7 100644 --- a/Userland/Libraries/LibWeb/Geometry/DOMRect.idl +++ b/Userland/Libraries/LibWeb/Geometry/DOMRect.idl @@ -1,15 +1,10 @@ -interface DOMRect { +interface DOMRect : DOMRectReadOnly { constructor(optional double x = 0, optional double y = 0, optional double width = 0, optional double height = 0); - readonly attribute double x; - readonly attribute double y; - readonly attribute double width; - readonly attribute double height; - - readonly attribute double top; - readonly attribute double right; - readonly attribute double bottom; - readonly attribute double left; + attribute double x; + attribute double y; + attribute double width; + attribute double height; }; diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h new file mode 100644 index 0000000000..1581ef6318 --- /dev/null +++ b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +namespace Web::Geometry { + +// https://drafts.fxtf.org/geometry/#domrectreadonly +class DOMRectReadOnly + : public RefCounted + , public Bindings::Wrappable { +public: + using WrapperType = Bindings::DOMRectReadOnlyWrapper; + + static NonnullRefPtr create_with_global_object(Bindings::WindowObject&, double x = 0, double y = 0, double width = 0, double height = 0) + { + return DOMRectReadOnly::create(x, y, width, height); + } + + static NonnullRefPtr create(double x = 0, double y = 0, double width = 0, double height = 0) + { + return adopt_ref(*new DOMRectReadOnly(x, y, width, height)); + } + + double x() const { return m_rect.x(); } + double y() const { return m_rect.y(); } + double width() const { return m_rect.width(); } + double height() const { return m_rect.height(); } + + double top() const { return min(y(), y() + height()); } + double right() const { return max(x(), x() + width()); } + double bottom() const { return max(y(), y() + height()); } + double left() const { return min(x(), x() + width()); } + +protected: + DOMRectReadOnly(float x, float y, float width, float height) + : m_rect(x, y, width, height) + { + } + + Gfx::FloatRect m_rect; +}; +} diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.idl b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.idl new file mode 100644 index 0000000000..9e503c5d47 --- /dev/null +++ b/Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.idl @@ -0,0 +1,15 @@ +interface DOMRectReadOnly { + + constructor(optional double x = 0, optional double y = 0, optional double width = 0, optional double height = 0); + + readonly attribute double x; + readonly attribute double y; + readonly attribute double width; + readonly attribute double height; + + readonly attribute double top; + readonly attribute double right; + readonly attribute double bottom; + readonly attribute double left; + +};