From 2f828231c40a4a78c0563824e204f5b112094c7d Mon Sep 17 00:00:00 2001 From: DerpyCrabs Date: Sat, 12 Feb 2022 16:38:54 +0300 Subject: [PATCH] LibWeb: Implement Geometry::DOMRectList Implement DOMRectList that is used as a return type of getClientRects functions on Element and Range. --- .../LibWeb/WrapperGenerator.cpp | 2 + .../LibWeb/Bindings/WindowObjectHelper.h | 3 ++ Userland/Libraries/LibWeb/CMakeLists.txt | 2 + Userland/Libraries/LibWeb/Forward.h | 2 + .../Libraries/LibWeb/Geometry/DOMRectList.cpp | 39 +++++++++++++++ .../Libraries/LibWeb/Geometry/DOMRectList.h | 47 +++++++++++++++++++ .../Libraries/LibWeb/Geometry/DOMRectList.idl | 6 +++ 7 files changed, 101 insertions(+) create mode 100644 Userland/Libraries/LibWeb/Geometry/DOMRectList.cpp create mode 100644 Userland/Libraries/LibWeb/Geometry/DOMRectList.h create mode 100644 Userland/Libraries/LibWeb/Geometry/DOMRectList.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp index 551bbf6243..08a146d2e5 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp @@ -2295,6 +2295,7 @@ void generate_implementation(IDL::Interface const& interface) #include #include #include +#include #include #include #include @@ -3462,6 +3463,7 @@ void generate_prototype_implementation(IDL::Interface const& interface) #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index e1f1798084..6a5011faeb 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include #include #include @@ -338,6 +340,7 @@ ADD_WINDOW_OBJECT_INTERFACE(DOMImplementation) \ ADD_WINDOW_OBJECT_INTERFACE(DOMParser) \ ADD_WINDOW_OBJECT_INTERFACE(DOMRect) \ + ADD_WINDOW_OBJECT_INTERFACE(DOMRectList) \ ADD_WINDOW_OBJECT_INTERFACE(DOMRectReadOnly) \ ADD_WINDOW_OBJECT_INTERFACE(DOMStringMap) \ ADD_WINDOW_OBJECT_INTERFACE(Element) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 06808c9c79..d77e673046 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -95,6 +95,7 @@ set(SOURCES Encoding/TextEncoder.cpp Fetch/AbstractOperations.cpp FontCache.cpp + Geometry/DOMRectList.cpp HTML/AttributeNames.cpp HTML/BrowsingContext.cpp HTML/BrowsingContextContainer.cpp @@ -420,6 +421,7 @@ libweb_js_wrapper(DOM/ShadowRoot) libweb_js_wrapper(DOM/Text) libweb_js_wrapper(Encoding/TextEncoder) libweb_js_wrapper(Geometry/DOMRect) +libweb_js_wrapper(Geometry/DOMRectList) libweb_js_wrapper(Geometry/DOMRectReadOnly) libweb_js_wrapper(HTML/CanvasGradient) libweb_js_wrapper(HTML/CanvasRenderingContext2D) diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 7b9451cbd0..d8577eb25b 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -118,6 +118,7 @@ class TextEncoder; namespace Web::Geometry { class DOMRect; +class DOMRectList; class DOMRectReadOnly; } @@ -345,6 +346,7 @@ class DocumentWrapper; class DOMExceptionWrapper; class DOMImplementationWrapper; class DOMParserWrapper; +class DOMRectListWrapper; class DOMRectReadOnlyWrapper; class DOMRectWrapper; class DOMStringMapWrapper; diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectList.cpp b/Userland/Libraries/LibWeb/Geometry/DOMRectList.cpp new file mode 100644 index 0000000000..0f49bb1240 --- /dev/null +++ b/Userland/Libraries/LibWeb/Geometry/DOMRectList.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, DerpyCrabs + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::Geometry { + +DOMRectList::DOMRectList(NonnullRefPtrVector&& rects) + : m_rects(move(rects)) +{ +} + +// https://drafts.fxtf.org/geometry-1/#dom-domrectlist-length +u32 DOMRectList::length() const +{ + return m_rects.size(); +} + +// https://drafts.fxtf.org/geometry-1/#dom-domrectlist-item +DOMRect const* DOMRectList::item(u32 index) const +{ + // The item(index) method, when invoked, must return null when + // index is greater than or equal to the number of DOMRect objects associated with the DOMRectList. + // Otherwise, the DOMRect object at index must be returned. Indices are zero-based. + if (index >= m_rects.size()) + return nullptr; + return &m_rects[index]; +} + +bool DOMRectList::is_supported_property_index(u32 index) const +{ + return index < m_rects.size(); +} + +} diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectList.h b/Userland/Libraries/LibWeb/Geometry/DOMRectList.h new file mode 100644 index 0000000000..18cca279f0 --- /dev/null +++ b/Userland/Libraries/LibWeb/Geometry/DOMRectList.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, DerpyCrabs + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace Web::Geometry { + +// https://drafts.fxtf.org/geometry-1/#DOMRectList +class DOMRectList final + : public RefCounted + , public Bindings::Wrappable { + AK_MAKE_NONCOPYABLE(DOMRectList); + AK_MAKE_NONMOVABLE(DOMRectList); + +public: + using WrapperType = Bindings::DOMRectListWrapper; + + static NonnullRefPtr create(NonnullRefPtrVector&& rects) + { + return adopt_ref(*new DOMRectList(move(rects))); + } + + ~DOMRectList() = default; + + u32 length() const; + DOMRect const* item(u32 index) const; + + bool is_supported_property_index(u32) const; + +private: + DOMRectList(NonnullRefPtrVector&& rects); + + NonnullRefPtrVector m_rects; +}; + +} diff --git a/Userland/Libraries/LibWeb/Geometry/DOMRectList.idl b/Userland/Libraries/LibWeb/Geometry/DOMRectList.idl new file mode 100644 index 0000000000..c5bdda867d --- /dev/null +++ b/Userland/Libraries/LibWeb/Geometry/DOMRectList.idl @@ -0,0 +1,6 @@ +[Exposed=Window] +interface DOMRectList { + getter DOMRect? item(unsigned long index); + readonly attribute unsigned long length; + iterable; +};