浏览代码

LibWeb: Add DOMRectReadOnly and make DOMRect inherit from it

This matches the class hierarchy of the CSS Geometry Interfaces Module.
Andreas Kling 3 年之前
父节点
当前提交
3c0b55c284

+ 6 - 0
Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h

@@ -40,6 +40,10 @@
 #include <LibWeb/Bindings/DOMImplementationPrototype.h>
 #include <LibWeb/Bindings/DOMParserConstructor.h>
 #include <LibWeb/Bindings/DOMParserPrototype.h>
+#include <LibWeb/Bindings/DOMRectConstructor.h>
+#include <LibWeb/Bindings/DOMRectPrototype.h>
+#include <LibWeb/Bindings/DOMRectReadOnlyConstructor.h>
+#include <LibWeb/Bindings/DOMRectReadOnlyPrototype.h>
 #include <LibWeb/Bindings/DOMStringMapConstructor.h>
 #include <LibWeb/Bindings/DOMStringMapPrototype.h>
 #include <LibWeb/Bindings/DocumentConstructor.h>
@@ -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)                     \

+ 1 - 0
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)

+ 2 - 0
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;

+ 7 - 14
Userland/Libraries/LibWeb/Geometry/DOMRect.h

@@ -6,18 +6,13 @@
 
 #pragma once
 
-#include <AK/RefCounted.h>
-#include <LibGfx/Rect.h>
-#include <LibWeb/Bindings/Wrappable.h>
-#include <LibWeb/Forward.h>
+#include <LibWeb/Geometry/DOMRectReadOnly.h>
 
 namespace Web::Geometry {
 
-// FIXME: Split this into DOMRectReadOnly and DOMRect
 // https://drafts.fxtf.org/geometry/#DOMRect
 class DOMRect final
-    : public RefCounted<DOMRect>
-    , 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;
 };
 }

+ 5 - 10
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;
 
 };

+ 51 - 0
Userland/Libraries/LibWeb/Geometry/DOMRectReadOnly.h

@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefCounted.h>
+#include <LibGfx/Rect.h>
+#include <LibWeb/Bindings/Wrappable.h>
+#include <LibWeb/Forward.h>
+
+namespace Web::Geometry {
+
+// https://drafts.fxtf.org/geometry/#domrectreadonly
+class DOMRectReadOnly
+    : public RefCounted<DOMRectReadOnly>
+    , public Bindings::Wrappable {
+public:
+    using WrapperType = Bindings::DOMRectReadOnlyWrapper;
+
+    static NonnullRefPtr<DOMRectReadOnly> 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<DOMRectReadOnly> 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;
+};
+}

+ 15 - 0
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;
+
+};