diff options
author | Andreas Kling <kling@serenityos.org> | 2021-09-27 00:55:13 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-27 01:01:29 +0200 |
commit | 43d378940f218f977f5dfa01b56ce5df48612e37 (patch) | |
tree | 8a7ce4acb1da4b75d82eef8d662e5b691b613f94 /Userland/Libraries/LibWeb/Geometry | |
parent | 0c63f0bf73a51f4aca23ba7a959a091288576958 (diff) | |
download | serenity-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.h | 57 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Geometry/DOMRect.idl | 15 |
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; + +}; |