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());