From fdc9dc572969df21baa9267ecf50ec2607c05372 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 26 Sep 2022 11:08:42 +0200 Subject: [PATCH] LibWeb: Don't force layout when scrolling to non-existent anchor If we're asked to scroll to an anchor element that's not actually in the document, we don't need to perform a layout. --- Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp index 18cbdbdcfd..e90f88cae1 100644 --- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp +++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp @@ -392,12 +392,13 @@ void BrowsingContext::scroll_to(Gfx::IntPoint const& position) void BrowsingContext::scroll_to_anchor(String const& fragment) { - if (!active_document()) + JS::GCPtr document = active_document(); + if (!document) return; - auto element = active_document()->get_element_by_id(fragment); + auto element = document->get_element_by_id(fragment); if (!element) { - auto candidates = active_document()->get_elements_by_name(fragment); + auto candidates = document->get_elements_by_name(fragment); for (auto& candidate : candidates->collect_matching_elements()) { if (is(*candidate)) { element = &verify_cast(*candidate); @@ -406,9 +407,12 @@ void BrowsingContext::scroll_to_anchor(String const& fragment) } } - active_document()->force_layout(); + if (!element) + return; - if (!element || !element->layout_node()) + document->force_layout(); + + if (!element->layout_node()) return; auto& layout_node = *element->layout_node();