diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 2a0c3e0b88..2746e67eb2 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -198,14 +198,12 @@ void Element::recompute_style() { set_needs_style_update(false); ASSERT(parent()); - auto* parent_layout_node = parent()->layout_node(); - if (!parent_layout_node) - return; - ASSERT(parent_layout_node); - auto style = document().style_resolver().resolve_style(*this, &parent_layout_node->specified_style()); - m_specified_css_values = style; + auto old_specified_css_values = m_specified_css_values; + auto* parent_specified_css_values = parent()->is_element() ? downcast(*parent()).specified_css_values() : nullptr; + auto new_specified_css_values = document().style_resolver().resolve_style(*this, parent_specified_css_values); + m_specified_css_values = new_specified_css_values; if (!layout_node()) { - if (style->display() == CSS::Display::None) + if (new_specified_css_values->display() == CSS::Display::None) return; // We need a new layout tree here! Layout::TreeBuilder tree_builder; @@ -217,11 +215,13 @@ void Element::recompute_style() if (is(layout_node())) return; - auto diff = compute_style_difference(layout_node()->specified_style(), *style, document()); + auto diff = StyleDifference::NeedsRelayout; + if (old_specified_css_values) + diff = compute_style_difference(*old_specified_css_values, *new_specified_css_values, document()); if (diff == StyleDifference::None) return; - layout_node()->set_specified_style(*style); - layout_node()->apply_style(*style); + layout_node()->set_specified_style(*new_specified_css_values); + layout_node()->apply_style(*new_specified_css_values); if (diff == StyleDifference::NeedsRelayout) { document().force_layout(); return; @@ -233,6 +233,7 @@ void Element::recompute_style() NonnullRefPtr Element::computed_style() { + // FIXME: This implementation is not doing anything it's supposed to. auto properties = m_specified_css_values->clone(); if (layout_node() && layout_node()->has_style()) { CSS::PropertyID box_model_metrics[] = { @@ -250,7 +251,7 @@ NonnullRefPtr Element::computed_style() CSS::PropertyID::BorderRightWidth, }; for (CSS::PropertyID id : box_model_metrics) { - auto prop = layout_node()->specified_style().property(id); + auto prop = m_specified_css_values->property(id); if (prop.has_value()) properties->set_property(id, prop.value()); } diff --git a/Libraries/LibWeb/Dump.cpp b/Libraries/LibWeb/Dump.cpp index 5b4cf9ca6f..f8f83ebc87 100644 --- a/Libraries/LibWeb/Dump.cpp +++ b/Libraries/LibWeb/Dump.cpp @@ -242,13 +242,13 @@ void dump_tree(StringBuilder& builder, const Layout::Node& layout_node, bool sho } } - if (show_specified_style) { + if (show_specified_style && layout_node.dom_node() && layout_node.dom_node()->is_element() && downcast(layout_node.dom_node())->specified_css_values()) { struct NameAndValue { String name; String value; }; Vector properties; - layout_node.specified_style().for_each_property([&](auto property_id, auto& value) { + downcast(*layout_node.dom_node()).specified_css_values()->for_each_property([&](auto property_id, auto& value) { properties.append({ CSS::string_from_property_id(property_id), value.to_string() }); }); quick_sort(properties, [](auto& a, auto& b) { return a.name < b.name; });