Переглянути джерело

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 9 місяців тому
батько
коміт
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());