Skip to content

Commit c4a27f5

Browse files
committed
layout_2020: Do line break for atomic inline-level elements
1 parent 6303d65 commit c4a27f5

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

components/layout_2020/flow/inline.rs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -623,16 +623,12 @@ fn layout_atomic(
623623
let pbm = style.padding_border_margin(&ifc.containing_block);
624624
let margin = pbm.margin.auto_is(Length::zero);
625625
let pbm_sums = &(&pbm.padding + &pbm.border) + &margin;
626-
ifc.inline_position += pbm_sums.inline_start;
627-
let mut start_corner = Vec2 {
628-
block: pbm_sums.block_start,
629-
inline: ifc.inline_position - ifc.current_nesting_level.inline_start,
630-
};
631-
if style.clone_position().is_relative() {
632-
start_corner += &relative_adjustement(&style, ifc.containing_block)
633-
}
626+
let position = style.clone_position();
634627

635-
let fragment = match atomic {
628+
let mut child_positioning_context = None;
629+
630+
// We need to know the inline size of the atomic before deciding whether to do the line break.
631+
let mut fragment = match atomic {
636632
IndependentFormattingContext::Replaced(replaced) => {
637633
let size = replaced.contents.used_size_as_if_inline_element(
638634
ifc.containing_block,
@@ -643,7 +639,10 @@ fn layout_atomic(
643639
let fragments = replaced
644640
.contents
645641
.make_fragments(&replaced.style, size.clone());
646-
let content_rect = Rect { start_corner, size };
642+
let content_rect = Rect {
643+
start_corner: Vec2::zero(),
644+
size,
645+
};
647646
BoxFragment::new(
648647
replaced.base_fragment_info,
649648
replaced.style.clone(),
@@ -696,16 +695,14 @@ fn layout_atomic(
696695
let collects_for_nearest_positioned_ancestor = ifc
697696
.positioning_context
698697
.collects_for_nearest_positioned_ancestor();
699-
let mut child_positioning_context =
700-
PositioningContext::new_for_subtree(collects_for_nearest_positioned_ancestor);
698+
child_positioning_context = Some(PositioningContext::new_for_subtree(
699+
collects_for_nearest_positioned_ancestor,
700+
));
701701
let independent_layout = non_replaced.layout(
702702
layout_context,
703-
&mut child_positioning_context,
703+
child_positioning_context.as_mut().unwrap(),
704704
&containing_block_for_children,
705705
);
706-
child_positioning_context
707-
.adjust_static_position_of_hoisted_fragments_with_offset(&start_corner);
708-
ifc.positioning_context.append(child_positioning_context);
709706

710707
// https://drafts.csswg.org/css2/visudet.html#block-root-margin
711708
let tentative_block_size = box_size
@@ -719,7 +716,7 @@ fn layout_atomic(
719716
.clamp_between_extremums(min_box_size.block, max_box_size.block);
720717

721718
let content_rect = Rect {
722-
start_corner,
719+
start_corner: Vec2::zero(),
723720
size: Vec2 {
724721
block: block_size,
725722
inline: inline_size,
@@ -740,6 +737,31 @@ fn layout_atomic(
740737
},
741738
};
742739

740+
if fragment.content_rect.size.inline + pbm_sums.inline_sum() >
741+
ifc.containing_block.inline_size - ifc.inline_position &&
742+
ifc.current_nesting_level.white_space.allow_wrap() &&
743+
ifc.current_nesting_level.fragments_so_far.len() != 0
744+
{
745+
ifc.finish_line_and_reset(layout_context);
746+
}
747+
748+
ifc.inline_position += pbm_sums.inline_start;
749+
let mut start_corner = Vec2 {
750+
block: pbm_sums.block_start,
751+
inline: ifc.inline_position - ifc.current_nesting_level.inline_start,
752+
};
753+
if position.is_relative() {
754+
start_corner += &relative_adjustement(atomic.style(), ifc.containing_block)
755+
}
756+
757+
if let Some(mut child_positioning_context) = child_positioning_context.take() {
758+
child_positioning_context
759+
.adjust_static_position_of_hoisted_fragments_with_offset(&start_corner);
760+
ifc.positioning_context.append(child_positioning_context);
761+
}
762+
763+
fragment.content_rect.start_corner = start_corner;
764+
743765
ifc.inline_position += pbm_sums.inline_end + fragment.content_rect.size.inline;
744766
ifc.current_nesting_level
745767
.max_block_size_of_fragments_so_far

0 commit comments

Comments
 (0)