1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 23:17:45 +00:00

LibWeb: Handle float clearing specified on line break elements

This commit is contained in:
Andi Gallo 2023-07-19 23:44:40 +00:00 committed by Andreas Kling
parent 0652cc48c0
commit b12820c967
6 changed files with 60 additions and 9 deletions

View file

@ -752,7 +752,7 @@ CSSPixels BlockFormattingContext::BlockMarginState::current_collapsed_margin() c
return collapsed_margin;
}
BlockFormattingContext::DidIntroduceClearance BlockFormattingContext::clear_floating_boxes(Box const& child_box)
BlockFormattingContext::DidIntroduceClearance BlockFormattingContext::clear_floating_boxes(Node const& child_box)
{
auto const& computed_values = child_box.computed_values();
auto result = DidIntroduceClearance::No;

View file

@ -54,6 +54,15 @@ public:
void resolve_vertical_box_model_metrics(Box const&);
enum class DidIntroduceClearance {
Yes,
No,
};
[[nodiscard]] DidIntroduceClearance clear_floating_boxes(Node const& child_box);
void reset_margin_state() { m_margin_state.reset(); }
private:
CSSPixels compute_auto_height_for_block_level_element(Box const&, AvailableSpace const&);
@ -75,13 +84,6 @@ private:
void measure_scrollable_overflow(Box const&, CSSPixels& bottom_edge, CSSPixels& right_edge) const;
enum class DidIntroduceClearance {
Yes,
No,
};
[[nodiscard]] DidIntroduceClearance clear_floating_boxes(Box const& child_box);
enum class FloatSide {
Left,
Right,

View file

@ -246,9 +246,15 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode)
continue;
switch (item.type) {
case InlineLevelIterator::Item::Type::ForcedBreak:
case InlineLevelIterator::Item::Type::ForcedBreak: {
line_builder.break_line(LineBuilder::ForcedBreak::Yes);
if (item.node) {
auto introduce_clearance = parent().clear_floating_boxes(*item.node);
if (introduce_clearance == BlockFormattingContext::DidIntroduceClearance::Yes)
parent().reset_margin_state();
}
break;
}
case InlineLevelIterator::Item::Type::Element: {
auto& box = verify_cast<Layout::Box>(*item.node);
compute_inset(box);

View file

@ -187,9 +187,11 @@ Optional<InlineLevelIterator::Item> InlineLevelIterator::next(CSSPixels availabl
}
if (is<Layout::BreakNode>(*m_current_node)) {
auto& node = *m_current_node;
skip_to_next();
return Item {
.type = Item::Type::ForcedBreak,
.node = &node,
};
}