From d883607e8f7e968dce894780936e40df8acdb940 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 15 Jun 2020 17:52:08 +0200 Subject: [PATCH] LibWeb: Force a full relayout if an element's CSS display changes Not doing this was causing the wrong kind of LayoutNode to stay around even though we had the final "display" value. --- Libraries/LibWeb/DOM/Element.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index f8c4565ca6..c6f68a43d2 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -169,6 +169,9 @@ static StyleDifference compute_style_difference(const StyleProperties& old_style bool needs_repaint = false; bool needs_relayout = false; + if (new_style.string_or_fallback(CSS::PropertyID::Display, "block") != old_style.string_or_fallback(CSS::PropertyID::Color, "block")) + needs_relayout = true; + if (new_style.color_or_fallback(CSS::PropertyID::Color, document, Color::Black) != old_style.color_or_fallback(CSS::PropertyID::Color, document, Color::Black)) needs_repaint = true; else if (new_style.color_or_fallback(CSS::PropertyID::BackgroundColor, document, Color::Black) != old_style.color_or_fallback(CSS::PropertyID::BackgroundColor, document, Color::Black)) @@ -209,7 +212,8 @@ void Element::recompute_style() return; layout_node()->set_style(*style); if (diff == StyleDifference::NeedsRelayout) { - ASSERT_NOT_REACHED(); + document().force_layout(); + return; } if (diff == StyleDifference::NeedsRepaint) { layout_node()->set_needs_display();