From 3fd1164171766947e3ea5b1f20a0b00576bdecae Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 17 Mar 2024 11:22:53 +0100 Subject: [PATCH] LibWeb: Account for scroll offset in Element::get_client_rects() --- ...get-bounding-client-rect-scroll-offset.txt | 3 ++ ...et-bounding-client-rect-scroll-offset.html | 36 +++++++++++++++++++ Userland/Libraries/LibWeb/DOM/Element.cpp | 6 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/element-get-bounding-client-rect-scroll-offset.txt create mode 100644 Tests/LibWeb/Text/input/element-get-bounding-client-rect-scroll-offset.html diff --git a/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-scroll-offset.txt b/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-scroll-offset.txt new file mode 100644 index 00000000000..7cdcd178322 --- /dev/null +++ b/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-scroll-offset.txt @@ -0,0 +1,3 @@ + {"x":18,"y":518,"width":100,"height":100,"top":518,"right":118,"bottom":618,"left":18} +{"x":18,"y":418,"width":100,"height":100,"top":418,"right":118,"bottom":518,"left":18} +{"x":18,"y":318,"width":100,"height":100,"top":318,"right":118,"bottom":418,"left":18} diff --git a/Tests/LibWeb/Text/input/element-get-bounding-client-rect-scroll-offset.html b/Tests/LibWeb/Text/input/element-get-bounding-client-rect-scroll-offset.html new file mode 100644 index 00000000000..4fe77df54fa --- /dev/null +++ b/Tests/LibWeb/Text/input/element-get-bounding-client-rect-scroll-offset.html @@ -0,0 +1,36 @@ + + +
+
+
+ + diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index 07af809d500..9e46d027813 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -930,8 +930,10 @@ JS::NonnullGCPtr Element::get_client_rects() const const_cast(document()).update_paint_and_hit_testing_properties_if_needed(); Gfx::AffineTransform transform; + CSSPixelPoint scroll_offset; for (auto const* containing_block = this->paintable_box(); containing_block; containing_block = containing_block->containing_block()) { transform = Gfx::extract_2d_affine_transform(containing_block->transform()).multiply(transform); + scroll_offset.translate_by(containing_block->scroll_offset()); } auto const* paintable = this->paintable(); @@ -940,12 +942,14 @@ JS::NonnullGCPtr Element::get_client_rects() const auto transformed_rect = transform.map(absolute_rect.translated(-paintable_box->transform_origin()).to_type()) .to_type() .translated(paintable_box->transform_origin()) + .translated(-scroll_offset) .translated(-viewport_offset); rects.append(Geometry::DOMRect::create(realm(), transformed_rect.to_type())); } else if (paintable && is(*paintable)) { auto const& inline_paintable = static_cast(*paintable); auto absolute_rect = inline_paintable.bounding_rect(); - absolute_rect.translate_by(-viewport_offset.x(), -viewport_offset.y()); + absolute_rect.translate_by(-scroll_offset); + absolute_rect.translate_by(-viewport_offset); rects.append(Geometry::DOMRect::create(realm(), transform.map(absolute_rect.to_type()))); } else if (paintable) { dbgln("FIXME: Failed to get client rects for element ({})", debug_description());