Explorar el Código

LibWeb: Include floats in height:auto for BFC root with inline children

BFC roots with children_are_inline()==true can still have floating boxes
as well. children_are_inline() is only concerned with in-flow children.

For this reason, we have to always consider floats when calculating
height:auto for BFC roots.
Andreas Kling hace 3 años
padre
commit
925c34cf43
Se han modificado 1 ficheros con 16 adiciones y 14 borrados
  1. 16 14
      Userland/Libraries/LibWeb/Layout/FormattingContext.cpp

+ 16 - 14
Userland/Libraries/LibWeb/Layout/FormattingContext.cpp

@@ -298,23 +298,25 @@ float FormattingContext::compute_auto_height_for_block_formatting_context_root(F
 
             return IterationDecision::Continue;
         });
-        // In addition, if the element has any floating descendants
-        // whose bottom margin edge is below the element's bottom content edge,
-        // then the height is increased to include those edges.
-        root.for_each_child_of_type<Box>([&](Layout::Box& child_box) {
-            if (!child_box.is_floating())
-                return IterationDecision::Continue;
+    }
 
-            auto const& child_box_state = state.get(child_box);
-            // FIXME: We're ignoring negative margins here, figure out the correct thing to do.
-            float child_box_bottom = child_box_state.offset.y() + child_box_state.content_height + child_box_state.border_box_bottom() + max(0, child_box_state.margin_bottom);
+    // In addition, if the element has any floating descendants
+    // whose bottom margin edge is below the element's bottom content edge,
+    // then the height is increased to include those edges.
+    root.for_each_child_of_type<Box>([&](Layout::Box& child_box) {
+        if (!child_box.is_floating())
+            return IterationDecision::Continue;
 
-            if (!bottom.has_value() || child_box_bottom > bottom.value())
-                bottom = child_box_bottom;
+        auto const& child_box_state = state.get(child_box);
+        // FIXME: We're ignoring negative margins here, figure out the correct thing to do.
+        float child_box_bottom = child_box_state.offset.y() + child_box_state.content_height + child_box_state.border_box_bottom() + max(0, child_box_state.margin_bottom);
+
+        if (!bottom.has_value() || child_box_bottom > bottom.value())
+            bottom = child_box_bottom;
+
+        return IterationDecision::Continue;
+    });
 
-            return IterationDecision::Continue;
-        });
-    }
     return bottom.value_or(0) - top.value_or(0);
 }