summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/Geometry
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-09-27 00:55:13 +0200
committerAndreas Kling <kling@serenityos.org>2021-09-27 01:01:29 +0200
commit43d378940f218f977f5dfa01b56ce5df48612e37 (patch)
tree8a7ce4acb1da4b75d82eef8d662e5b691b613f94 /Userland/Libraries/LibWeb/Geometry
parent0c63f0bf73a51f4aca23ba7a959a091288576958 (diff)
downloadserenity-43d378940f218f977f5dfa01b56ce5df48612e37.zip
LibWeb: Add DOMRect and Element.getBoundingClientRect()
This marks our entry into the Web::Geometry namespace, based on the "Geometry" spec at https://drafts.fxtf.org/geometry/
Diffstat (limited to 'Userland/Libraries/LibWeb/Geometry')
-rw-r--r--Userland/Libraries/LibWeb/Geometry/DOMRect.h57
-rw-r--r--Userland/Libraries/LibWeb/Geometry/DOMRect.idl15
2 files changed, 72 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRect.h b/Userland/Libraries/LibWeb/Geometry/DOMRect.h
new file mode 100644
index 0000000000..bed9698107
--- /dev/null
+++ b/Userland/Libraries/LibWeb/Geometry/DOMRect.h
@@ -0,0 +1,57 @@
+/*
+ * 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 {
+
+// FIXME: Split this into DOMRectReadOnly and DOMRect
+// https://drafts.fxtf.org/geometry/#DOMRect
+class DOMRect final
+ : public RefCounted<DOMRect>
+ , public Bindings::Wrappable {
+public:
+ using WrapperType = Bindings::DOMRectWrapper;
+
+ static NonnullRefPtr<DOMRect> create_with_global_object(Bindings::WindowObject&, double x = 0, double y = 0, double width = 0, double height = 0)
+ {
+ return DOMRect::create(x, y, width, height);
+ }
+
+ static NonnullRefPtr<DOMRect> create(double x = 0, double y = 0, double width = 0, double height = 0)
+ {
+ return adopt_ref(*new DOMRect(x, y, width, height));
+ }
+
+ static NonnullRefPtr<DOMRect> create(Gfx::FloatRect const& rect)
+ {
+ return adopt_ref(*new DOMRect(rect.x(), rect.y(), rect.width(), rect.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()); }
+
+private:
+ DOMRect(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/DOMRect.idl b/Userland/Libraries/LibWeb/Geometry/DOMRect.idl
new file mode 100644
index 0000000000..0e0c599f6b
--- /dev/null
+++ b/Userland/Libraries/LibWeb/Geometry/DOMRect.idl
@@ -0,0 +1,15 @@
+interface DOMRect {
+
+ 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;
+
+};