浏览代码

LibWeb: Skip abspos boxes layout in intrinsic sizing mode

Absolutely positioned boxes do not affect the size of the formatting
context box they belong to, so it's safe to skip their layout entirely
when calculating intrinsic size.
Aliaksandr Kalenik 10 月之前
父节点
当前提交
4eb16b144e

+ 8 - 6
Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp

@@ -108,12 +108,14 @@ void BlockFormattingContext::parent_context_did_dimension_child_root_box()
         box_state.set_content_x(float_containing_block_width - floating_box->offset_from_edge);
     }
 
-    // We can also layout absolutely positioned boxes within this BFC.
-    for (auto& box : m_absolutely_positioned_boxes) {
-        auto& cb_state = m_state.get(*box->containing_block());
-        auto available_width = AvailableSize::make_definite(cb_state.content_width() + cb_state.padding_left + cb_state.padding_right);
-        auto available_height = AvailableSize::make_definite(cb_state.content_height() + cb_state.padding_top + cb_state.padding_bottom);
-        layout_absolutely_positioned_element(box, AvailableSpace(available_width, available_height));
+    if (m_layout_mode == LayoutMode::Normal) {
+        // We can also layout absolutely positioned boxes within this BFC.
+        for (auto& box : m_absolutely_positioned_boxes) {
+            auto& cb_state = m_state.get(*box->containing_block());
+            auto available_width = AvailableSize::make_definite(cb_state.content_width() + cb_state.padding_left + cb_state.padding_right);
+            auto available_height = AvailableSize::make_definite(cb_state.content_height() + cb_state.padding_top + cb_state.padding_bottom);
+            layout_absolutely_positioned_element(box, AvailableSpace(available_width, available_height));
+        }
     }
 }
 

+ 3 - 0
Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp

@@ -181,6 +181,9 @@ void FlexFormattingContext::run(AvailableSpace const& available_space)
 
 void FlexFormattingContext::parent_context_did_dimension_child_root_box()
 {
+    if (m_layout_mode != LayoutMode::Normal)
+        return;
+
     flex_container().for_each_child_of_type<Box>([&](Layout::Box& box) {
         if (box.is_absolutely_positioned()) {
             auto& cb_state = m_state.get(*box.containing_block());

+ 3 - 0
Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp

@@ -2005,6 +2005,9 @@ void GridFormattingContext::layout_absolutely_positioned_element(Box const& box,
 
 void GridFormattingContext::parent_context_did_dimension_child_root_box()
 {
+    if (m_layout_mode != LayoutMode::Normal)
+        return;
+
     grid_container().for_each_child_of_type<Box>([&](Layout::Box& box) {
         if (box.is_absolutely_positioned()) {
             auto& cb_state = m_state.get(*box.containing_block());