mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:27:45 +00:00
LibWeb: Handle float clearing specified on line break elements
This commit is contained in:
parent
0652cc48c0
commit
b12820c967
6 changed files with 60 additions and 9 deletions
|
@ -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>
|
|
@ -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>
|
|
@ -752,7 +752,7 @@ CSSPixels BlockFormattingContext::BlockMarginState::current_collapsed_margin() c
|
||||||
return collapsed_margin;
|
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 const& computed_values = child_box.computed_values();
|
||||||
auto result = DidIntroduceClearance::No;
|
auto result = DidIntroduceClearance::No;
|
||||||
|
|
|
@ -54,6 +54,15 @@ public:
|
||||||
|
|
||||||
void resolve_vertical_box_model_metrics(Box const&);
|
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:
|
private:
|
||||||
CSSPixels compute_auto_height_for_block_level_element(Box const&, AvailableSpace const&);
|
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;
|
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 {
|
enum class FloatSide {
|
||||||
Left,
|
Left,
|
||||||
Right,
|
Right,
|
||||||
|
|
|
@ -246,9 +246,15 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case InlineLevelIterator::Item::Type::ForcedBreak:
|
case InlineLevelIterator::Item::Type::ForcedBreak: {
|
||||||
line_builder.break_line(LineBuilder::ForcedBreak::Yes);
|
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;
|
break;
|
||||||
|
}
|
||||||
case InlineLevelIterator::Item::Type::Element: {
|
case InlineLevelIterator::Item::Type::Element: {
|
||||||
auto& box = verify_cast<Layout::Box>(*item.node);
|
auto& box = verify_cast<Layout::Box>(*item.node);
|
||||||
compute_inset(box);
|
compute_inset(box);
|
||||||
|
|
|
@ -187,9 +187,11 @@ Optional<InlineLevelIterator::Item> InlineLevelIterator::next(CSSPixels availabl
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is<Layout::BreakNode>(*m_current_node)) {
|
if (is<Layout::BreakNode>(*m_current_node)) {
|
||||||
|
auto& node = *m_current_node;
|
||||||
skip_to_next();
|
skip_to_next();
|
||||||
return Item {
|
return Item {
|
||||||
.type = Item::Type::ForcedBreak,
|
.type = Item::Type::ForcedBreak,
|
||||||
|
.node = &node,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue