Explorar o código

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 hai 9 meses
pai
achega
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);
         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()
 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) {
     flex_container().for_each_child_of_type<Box>([&](Layout::Box& box) {
         if (box.is_absolutely_positioned()) {
         if (box.is_absolutely_positioned()) {
             auto& cb_state = m_state.get(*box.containing_block());
             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()
 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) {
     grid_container().for_each_child_of_type<Box>([&](Layout::Box& box) {
         if (box.is_absolutely_positioned()) {
         if (box.is_absolutely_positioned()) {
             auto& cb_state = m_state.get(*box.containing_block());
             auto& cb_state = m_state.get(*box.containing_block());