mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 03:57:43 +00:00
LibWeb: Allow block level boxes to be floated and have clearance
Before, we completely ignored clearance for block-level boxes if they were floated. This was incorrect because it is valid for a block-level box to be floated and still have clearance. However, unlike clearance on normal flow boxes, clearance on floating boxes does not affect the y-position of subsequent normal flow boxes. Instead, it pushes the box's position to the very beginning of an edge. Work towards https://github.com/SerenityOS/serenity/issues/21023
This commit is contained in:
parent
9240233378
commit
81ddad3fcf
3 changed files with 72 additions and 2 deletions
|
@ -904,6 +904,7 @@ void BlockFormattingContext::layout_floating_box(Box const& box, BlockContainer
|
|||
VERIFY(box.is_floating());
|
||||
|
||||
auto& box_state = m_state.get_mutable(box);
|
||||
auto const& computed_values = box.computed_values();
|
||||
|
||||
resolve_vertical_box_model_metrics(box);
|
||||
|
||||
|
@ -979,10 +980,18 @@ void BlockFormattingContext::layout_floating_box(Box const& box, BlockContainer
|
|||
break;
|
||||
}
|
||||
|
||||
if (!did_touch_preceding_float || !did_place_next_to_preceding_float) {
|
||||
// One of two things happened:
|
||||
auto has_clearance = false;
|
||||
if (side == FloatSide::Left) {
|
||||
has_clearance = computed_values.clear() == CSS::Clear::Left || computed_values.clear() == CSS::Clear::Both;
|
||||
} else if (side == FloatSide::Right) {
|
||||
has_clearance = computed_values.clear() == CSS::Clear::Right || computed_values.clear() == CSS::Clear::Both;
|
||||
}
|
||||
|
||||
if (!did_touch_preceding_float || !did_place_next_to_preceding_float || has_clearance) {
|
||||
// One of three things happened:
|
||||
// - This box does not touch another floating box.
|
||||
// - We ran out of horizontal space on this "float line", and need to break.
|
||||
// - This box has clearance.
|
||||
// Either way, we float this box all the way to the edge.
|
||||
float_to_edge();
|
||||
CSSPixels lowest_margin_edge = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue