From 1ec23f38ed4e7efa224f43d2461579a87d974e2e Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 11 May 2021 18:04:18 -0400 Subject: [PATCH] LibWeb: Move clearing boxes below preceding floating boxes When computing the y-position of a clearing element, use the height of the border box of the associated floating elements. This also extracts this block of code to a helper lambda since it is used twice. --- .../LibWeb/Layout/BlockFormattingContext.cpp | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 815f2bf6bc..b0650284ef 100644 --- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -495,27 +495,21 @@ void BlockFormattingContext::place_block_level_non_replaced_element_in_normal_fl } } - if (child_box.computed_values().clear() == CSS::Clear::Left || child_box.computed_values().clear() == CSS::Clear::Both) { - if (!m_left_floating_boxes.is_empty()) { + auto clear_floating_boxes = [&](auto& floating_boxes) { + if (!floating_boxes.is_empty()) { float clearance_y = 0; - for (auto* floating_box : m_left_floating_boxes) { - clearance_y = max(clearance_y, floating_box->effective_offset().y() + floating_box->box_model().margin_box().bottom); + for (auto* floating_box : floating_boxes) { + clearance_y = max(clearance_y, floating_box->effective_offset().y() + floating_box->border_box_height()); } y = max(y, clearance_y); - m_left_floating_boxes.clear(); + floating_boxes.clear(); } - } + }; - if (child_box.computed_values().clear() == CSS::Clear::Right || child_box.computed_values().clear() == CSS::Clear::Both) { - if (!m_right_floating_boxes.is_empty()) { - float clearance_y = 0; - for (auto* floating_box : m_right_floating_boxes) { - clearance_y = max(clearance_y, floating_box->effective_offset().y() + floating_box->box_model().margin_box().bottom); - } - y = max(y, clearance_y); - m_right_floating_boxes.clear(); - } - } + if (computed_values.clear() == CSS::Clear::Left || computed_values.clear() == CSS::Clear::Both) + clear_floating_boxes(m_left_floating_boxes); + if (computed_values.clear() == CSS::Clear::Right || computed_values.clear() == CSS::Clear::Both) + clear_floating_boxes(m_right_floating_boxes); child_box.set_offset(x, y); }