1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 04:58:13 +00:00

LibWeb: Don't force relayout whole page on programmatic scroll

When scrolling the page, we may need to flush any pending layout
changes. This is required because otherwise, we don't know if the target
scroll position is valid.

However, we don't need to *force* a layout. If the layout tree is
already up-to-date, we can use it as-is.

Also, if we're scrolling to (0, 0), we don't need to update the layout
at all, since (0, 0) is always a guaranteed valid scroll position.
This commit is contained in:
Andreas Kling 2023-03-26 15:42:28 +02:00 committed by Linus Groh
parent 14c9ef2563
commit 32653f34f9

View file

@ -389,8 +389,12 @@ void BrowsingContext::set_needs_display(CSSPixelRect const& rect)
void BrowsingContext::scroll_to(CSSPixelPoint position)
{
if (active_document())
active_document()->force_layout();
// NOTE: Scrolling to a position requires up-to-date layout *unless* we're scrolling to (0, 0)
// as (0, 0) is always guaranteed to be a valid scroll position.
if (!position.is_zero()) {
if (active_document())
active_document()->update_layout();
}
if (m_page)
m_page->client().page_did_request_scroll_to(position);
@ -416,7 +420,7 @@ void BrowsingContext::scroll_to_anchor(DeprecatedString const& fragment)
if (!element)
return;
document->force_layout();
document->update_layout();
if (!element->layout_node())
return;