diff --git a/Libraries/LibWeb/Layout/TreeBuilder.cpp b/Libraries/LibWeb/Layout/TreeBuilder.cpp index 1dd44165499..627298277d5 100644 --- a/Libraries/LibWeb/Layout/TreeBuilder.cpp +++ b/Libraries/LibWeb/Layout/TreeBuilder.cpp @@ -579,6 +579,25 @@ void TreeBuilder::update_layout_tree(DOM::Node& dom_node, TreeBuilder::Context& } } + if (is(dom_node)) { + auto& slot_element = static_cast(dom_node); + + if (slot_element.computed_properties()->content_visibility() != CSS::ContentVisibility::Hidden) { + auto slottables = slot_element.assigned_nodes_internal(); + push_parent(as(*layout_node)); + + MustCreateSubtree must_create_subtree_for_slottable = must_create_subtree; + if (slot_element.needs_layout_tree_update()) + must_create_subtree_for_slottable = MustCreateSubtree::Yes; + + for (auto const& slottable : slottables) { + slottable.visit([&](auto& node) { update_layout_tree(node, context, must_create_subtree_for_slottable); }); + } + + pop_parent(); + } + } + if (should_create_layout_node) { update_layout_tree_after_children(dom_node, *layout_node, context, element_has_content_visibility_hidden); wrap_in_button_layout_tree_if_needed(dom_node, *layout_node); @@ -694,21 +713,6 @@ void TreeBuilder::update_layout_tree_after_children(DOM::Node& dom_node, GC::Ref layout_node->append_child(*list_item_marker); } - if (is(dom_node)) { - auto& slot_element = static_cast(dom_node); - - if (slot_element.computed_properties()->content_visibility() == CSS::ContentVisibility::Hidden) - return; - - auto slottables = slot_element.assigned_nodes_internal(); - push_parent(as(*layout_node)); - - for (auto const& slottable : slottables) - slottable.visit([&](auto& node) { update_layout_tree(node, context, MustCreateSubtree::Yes); }); - - pop_parent(); - } - if (is(dom_node)) { auto& graphics_element = static_cast(dom_node); // Create the layout tree for the SVG mask/clip paths as a child of the masked element. diff --git a/Tests/LibWeb/Text/expected/layout-tree-update/slot-invalidation.txt b/Tests/LibWeb/Text/expected/layout-tree-update/slot-invalidation.txt new file mode 100644 index 00000000000..8b67fa63530 --- /dev/null +++ b/Tests/LibWeb/Text/expected/layout-tree-update/slot-invalidation.txt @@ -0,0 +1,3 @@ +0 +0 +724 diff --git a/Tests/LibWeb/Text/input/layout-tree-update/slot-invalidation.html b/Tests/LibWeb/Text/input/layout-tree-update/slot-invalidation.html new file mode 100644 index 00000000000..c937088c885 --- /dev/null +++ b/Tests/LibWeb/Text/input/layout-tree-update/slot-invalidation.html @@ -0,0 +1,38 @@ + + + + + + +
outer title +
outer title
+
+ inner title +

inner content

+
+
+ + +