diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 3cc81c50748..da8ba229bfa 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -1435,15 +1435,7 @@ Vector Element::get_client_rects() const Vector rects; if (auto const* paintable_box = this->paintable_box()) { auto absolute_rect = paintable_box->absolute_border_box_rect(); - - if (auto const& accumulated_visual_context = paintable_box->accumulated_visual_context()) { - auto pixel_ratio = static_cast(document().page().client().device_pixels_per_css_pixel()); - auto const& scroll_state = document().paintable()->scroll_state_snapshot(); - auto result = accumulated_visual_context->transform_rect_to_viewport(absolute_rect.to_type() * pixel_ratio, scroll_state); - rects.append((result * (1.f / pixel_ratio)).to_type()); - } else { - rects.append(absolute_rect); - } + rects.append(paintable_box->transform_rect_to_viewport(absolute_rect)); } else if (paintable()) { dbgln("FIXME: Failed to get client rects for element ({})", debug_description()); } diff --git a/Libraries/LibWeb/HTML/Navigable.cpp b/Libraries/LibWeb/HTML/Navigable.cpp index c1718089fab..47bbc657651 100644 --- a/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Libraries/LibWeb/HTML/Navigable.cpp @@ -2586,13 +2586,11 @@ CSSPixelPoint Navigable::to_top_level_position(CSSPixelPoint a_position) if (!paintable) return {}; - if (auto const* paintable_box = as_if(*paintable); paintable_box && paintable_box->accumulated_visual_context()) { - auto const& accumulated_visual_context = *paintable_box->accumulated_visual_context(); - auto const& viewport_paintable = *paintable_box->document().paintable(); - auto const& scroll_state = viewport_paintable.scroll_state_snapshot(); + if (auto const* paintable_box = as_if(*paintable); + paintable_box && paintable_box->accumulated_visual_context()) { auto point = paintable_box->absolute_position(); point.translate_by(position); - position = accumulated_visual_context.transform_rect_to_viewport({ point, { 0, 0 } }, scroll_state).location().to_type(); + position = paintable_box->transform_rect_to_viewport({ point, { 0, 0 } }).location(); } else { position.translate_by(paintable->box_type_agnostic_position()); } diff --git a/Libraries/LibWeb/Page/AutoScrollHandler.cpp b/Libraries/LibWeb/Page/AutoScrollHandler.cpp index 7329eeb9337..59e461a6aa2 100644 --- a/Libraries/LibWeb/Page/AutoScrollHandler.cpp +++ b/Libraries/LibWeb/Page/AutoScrollHandler.cpp @@ -44,16 +44,9 @@ static Optional scrollport_rect_in_viewport(Painting::PaintableBox if (paintable_box.is_viewport_paintable()) return scrollport; - auto const& accumulated_visual_context = paintable_box.accumulated_visual_context(); - if (!accumulated_visual_context) + if (!paintable_box.accumulated_visual_context()) return {}; - auto const* viewport_paintable = paintable_box.document().paintable(); - if (!viewport_paintable) - return {}; - auto pixel_ratio = static_cast(paintable_box.document().page().client().device_pixels_per_css_pixel()); - auto const& scroll_state = viewport_paintable->scroll_state_snapshot(); - auto result = accumulated_visual_context->transform_rect_to_viewport(scrollport.to_type() * pixel_ratio, scroll_state); - return (result * (1.f / pixel_ratio)).to_type(); + return paintable_box.transform_rect_to_viewport(scrollport); } // Returns scroll speed in CSS pixels per second for each axis, based on how far the mouse is past the auto scroll edge. diff --git a/Libraries/LibWeb/Painting/PaintableBox.cpp b/Libraries/LibWeb/Painting/PaintableBox.cpp index 2d9a5946931..d133bd5db4c 100644 --- a/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -912,6 +912,16 @@ Optional PaintableBox::transform_point_to_local_for_descendants(C return (*result / pixel_ratio).to_type(); } +CSSPixelRect PaintableBox::transform_rect_to_viewport(CSSPixelRect const& rect) const +{ + if (!accumulated_visual_context()) + return rect; + auto pixel_ratio = static_cast(document().page().client().device_pixels_per_css_pixel()); + auto const& scroll_state = document().paintable()->scroll_state_snapshot(); + auto result = accumulated_visual_context()->transform_rect_to_viewport(rect.to_type() * pixel_ratio, scroll_state); + return (result * (1.f / pixel_ratio)).to_type(); +} + CSSPixelPoint PaintableBox::transform_to_local_coordinates(CSSPixelPoint screen_position) const { return transform_point_to_local(screen_position).value_or(screen_position); diff --git a/Libraries/LibWeb/Painting/PaintableBox.h b/Libraries/LibWeb/Painting/PaintableBox.h index 2a3a0fdd698..4ecce628388 100644 --- a/Libraries/LibWeb/Painting/PaintableBox.h +++ b/Libraries/LibWeb/Painting/PaintableBox.h @@ -237,6 +237,7 @@ public: Optional transform_point_to_local(CSSPixelPoint screen_position) const; Optional transform_point_to_local_for_descendants(CSSPixelPoint screen_position) const; + CSSPixelRect transform_rect_to_viewport(CSSPixelRect const& rect) const; static constexpr size_t paint_phase_count = to_underlying(PaintPhase::Overlay) + 1;