mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue