1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:47:44 +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

@ -0,0 +1,26 @@
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
BlockContainer <html> at (0,0) content-size 800x600 [BFC] children: not-inline
BlockContainer <body> at (8,8) content-size 784x34.9375 children: inline
line 0 width: 6.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [108,8 6.34375x17.46875]
"1"
line 1 width: 8.8125, height: 17.46875, bottom: 34.9375, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [108,25.46875 8.8125x17.46875]
"2"
BlockContainer <span.a> at (8,8) content-size 100x17.46875 floating [BFC] children: inline
line 0 width: 14.265625, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [8,8 14.265625x17.46875]
"A"
TextNode <#text>
InlineNode <span>
TextNode <#text>
TextNode <#text>
BreakNode <br>
TextNode <#text>
BlockContainer <span.a> at (8,25.46875) content-size 100x17.46875 floating [BFC] children: inline
line 0 width: 9.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [8,25.46875 9.34375x17.46875]
"B"
TextNode <#text>
InlineNode <span>
TextNode <#text>

View file

@ -0,0 +1,15 @@
<style>
.a {
float: left;
width: 100px;
margin-bottom: 4px;
}
br {
clear: left;
}
</style>
<span class="a">A</span><span>1</span>
<br>
<span class="a">B</span><span>2</span>

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,
};
}