diff --git a/Userland/Libraries/LibWeb/Layout/Node.h b/Userland/Libraries/LibWeb/Layout/Node.h index a94d25200223..95899e59ba01 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.h +++ b/Userland/Libraries/LibWeb/Layout/Node.h @@ -164,6 +164,14 @@ class Node u32 initial_quote_nesting_level() const { return m_initial_quote_nesting_level; } void set_initial_quote_nesting_level(u32 value) { m_initial_quote_nesting_level = value; } + // An element is called out of flow if it is floated, absolutely positioned, or is the root element. + // https://www.w3.org/TR/CSS22/visuren.html#positioning-scheme + bool is_out_of_flow() const { return is_floating() || is_absolutely_positioned(); } + + // An element is called in-flow if it is not out-of-flow. + // https://www.w3.org/TR/CSS22/visuren.html#positioning-scheme + bool is_in_flow() const { return !is_out_of_flow(); } + protected: Node(DOM::Document&, DOM::Node*); diff --git a/Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp b/Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp index 030f3a3663a3..71633c24ec48 100644 --- a/Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp +++ b/Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp @@ -42,9 +42,7 @@ TreeBuilder::TreeBuilder() = default; static bool has_inline_or_in_flow_block_children(Layout::Node const& layout_node) { for (auto child = layout_node.first_child(); child; child = child->next_sibling()) { - if (child->is_inline()) - return true; - if (!child->is_floating() && !child->is_absolutely_positioned()) + if (child->is_inline() || child->is_in_flow()) return true; } return false; @@ -57,7 +55,7 @@ static bool has_in_flow_block_children(Layout::Node const& layout_node) for (auto child = layout_node.first_child(); child; child = child->next_sibling()) { if (child->is_inline()) continue; - if (!child->is_floating() && !child->is_absolutely_positioned()) + if (child->is_in_flow()) return true; } return false; @@ -98,9 +96,7 @@ static Layout::Node& insertion_parent_for_block_node(Layout::NodeWithStyle& layo return layout_parent; } - bool is_out_of_flow = layout_node.is_absolutely_positioned() || layout_node.is_floating(); - - if (is_out_of_flow + if (layout_node.is_out_of_flow() && !layout_parent.display().is_flex_inside() && !layout_parent.display().is_grid_inside() && layout_parent.last_child()->is_anonymous() @@ -115,7 +111,7 @@ static Layout::Node& insertion_parent_for_block_node(Layout::NodeWithStyle& layo return layout_parent; } - if (is_out_of_flow) { + if (layout_node.is_out_of_flow()) { // Block is out-of-flow, it can have inline siblings if necessary. return layout_parent; } @@ -128,7 +124,7 @@ static Layout::Node& insertion_parent_for_block_node(Layout::NodeWithStyle& layo for (JS::GCPtr child = layout_parent.first_child(); child; child = next) { next = child->next_sibling(); // NOTE: We let out-of-flow children stay in the parent, to preserve tree structure. - if (child->is_floating() || child->is_absolutely_positioned()) + if (child->is_out_of_flow()) continue; layout_parent.remove_child(*child); children.append(*child);