From ccc37032a4854d8d0b33fcb6e5783ece1aa84b57 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 16 Mar 2022 19:02:37 +0100 Subject: [PATCH] LibWeb: Don't call establishes_stacking_context() during painting By the time we're painting, we've already built the stacking context tree. So instead of asking if a box establishes a stacking context, we can ask if its paintable *has* a stacking context. This was taking up ~6% of the profile when mousing around on the HTML specification. With this change, it disappears completely. :^) --- Userland/Libraries/LibWeb/Painting/StackingContext.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp index be08000159..7bdec9607b 100644 --- a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp @@ -52,7 +52,8 @@ void StackingContext::paint_descendants(PaintContext& context, Layout::Node& box } box.for_each_child([&](auto& child) { - if (child.establishes_stacking_context()) + // If `child` establishes its own stacking context, skip over it. + if (is(child) && child.paintable() && static_cast(child).paint_box()->stacking_context()) return; bool child_is_inline_or_replaced = child.is_inline() || is(child); switch (phase) {