From d94906fa1a26f9897ca0e0c0882d07c98c702a84 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Tue, 4 Feb 2025 23:05:37 +0100 Subject: [PATCH] LibWeb: Only apply style for continuation nodes once This fixes the very, _very_ slow loading of https://yzy-sply.com. The `apply_style()` method also calls into this method recursively, so we just need to call it once instead of once per node in the continuation chain. --- Libraries/LibWeb/Layout/Node.cpp | 9 ++++---- ...opagation-for-long-continuation-chain.html | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 Tests/LibWeb/Crash/Layout/style-propagation-for-long-continuation-chain.html diff --git a/Libraries/LibWeb/Layout/Node.cpp b/Libraries/LibWeb/Layout/Node.cpp index bfe1e218c19..40edce14fec 100644 --- a/Libraries/LibWeb/Layout/Node.cpp +++ b/Libraries/LibWeb/Layout/Node.cpp @@ -1316,10 +1316,11 @@ CSS::UserSelect Node::user_select_used_value() const void NodeWithStyleAndBoxModelMetrics::propagate_style_along_continuation(CSS::ComputedProperties const& computed_style) const { - for (auto continuation = continuation_of_node(); continuation; continuation = continuation->continuation_of_node()) { - if (!continuation->is_anonymous()) - continuation->apply_style(computed_style); - } + auto continuation = continuation_of_node(); + while (continuation && continuation->is_anonymous()) + continuation = continuation->continuation_of_node(); + if (continuation) + continuation->apply_style(computed_style); } void NodeWithStyleAndBoxModelMetrics::visit_edges(Cell::Visitor& visitor) diff --git a/Tests/LibWeb/Crash/Layout/style-propagation-for-long-continuation-chain.html b/Tests/LibWeb/Crash/Layout/style-propagation-for-long-continuation-chain.html new file mode 100644 index 00000000000..70d53f1dfaf --- /dev/null +++ b/Tests/LibWeb/Crash/Layout/style-propagation-for-long-continuation-chain.html @@ -0,0 +1,21 @@ + + +