diff --git a/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-css-transform.txt b/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-css-transform.txt index 10297861d2..8dba5546f3 100644 --- a/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-css-transform.txt +++ b/Tests/LibWeb/Text/expected/element-get-bounding-client-rect-css-transform.txt @@ -1 +1 @@ - {"x":68,"y":118,"width":100,"height":100,"top":118,"right":168,"bottom":218,"left":68} + {"x":18,"y":68,"width":200,"height":200,"top":68,"right":218,"bottom":268,"left":18} diff --git a/Tests/LibWeb/Text/input/element-get-bounding-client-rect-css-transform.html b/Tests/LibWeb/Text/input/element-get-bounding-client-rect-css-transform.html index 0774a2ada9..24db6deeaf 100644 --- a/Tests/LibWeb/Text/input/element-get-bounding-client-rect-css-transform.html +++ b/Tests/LibWeb/Text/input/element-get-bounding-client-rect-css-transform.html @@ -13,7 +13,7 @@ width: 100px; height: 100px; opacity: 0.1; - transform: translate(10px, 10px); + transform: translate(10px, 10px) scale(2); }
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index be3641678d..056e4ff323 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -923,14 +923,17 @@ JS::NonnullGCPtr Element::get_client_rects() const Gfx::AffineTransform transform; for (auto const* containing_block = this->paintable_box(); containing_block; containing_block = containing_block->containing_block()) { - transform = transform.multiply(Gfx::extract_2d_affine_transform(containing_block->transform())); + transform = Gfx::extract_2d_affine_transform(containing_block->transform()).multiply(transform); } auto const* paintable = this->paintable(); if (auto const* paintable_box = this->paintable_box()) { auto absolute_rect = paintable_box->absolute_border_box_rect(); - absolute_rect.translate_by(-viewport_offset.x(), -viewport_offset.y()); - rects.append(Geometry::DOMRect::create(realm(), transform.map(absolute_rect.to_type()))); + auto transformed_rect = transform.map(absolute_rect.translated(-paintable_box->transform_origin()).to_type()) + .to_type() + .translated(paintable_box->transform_origin()) + .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();