mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
layout: Improve documentation and code structure in FlexItemBox::automatic_min_size
(#32911)
This change add specification text to comments and restructres the code a bit to better match the specification. In addition, a the `establishes_scroll_container()` helper is used instead of looking at overflow directly. It should not change behavior at all. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
5e59988c87
commit
10b06f0129
1 changed files with 40 additions and 29 deletions
|
@ -1978,16 +1978,21 @@ impl FlexItemBox {
|
||||||
if self
|
if self
|
||||||
.independent_formatting_context
|
.independent_formatting_context
|
||||||
.style()
|
.style()
|
||||||
.get_box()
|
.establishes_scroll_container()
|
||||||
.overflow_x
|
|
||||||
.is_scrollable()
|
|
||||||
{
|
{
|
||||||
return Au::zero();
|
return Au::zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
if cross_axis_is_item_block_axis {
|
if cross_axis_is_item_block_axis {
|
||||||
let specified_size_suggestion = content_box_size.inline;
|
// > **specified size suggestion**
|
||||||
|
// > If the item’s preferred main size is definite and not automatic, then the specified
|
||||||
|
// > size suggestion is that size. It is otherwise undefined.
|
||||||
|
let specified_size_suggestion = content_box_size.inline.non_auto();
|
||||||
|
|
||||||
|
// > **transferred size suggestion**
|
||||||
|
// > If the item has a preferred aspect ratio and its preferred cross size is definite, then the
|
||||||
|
// > transferred size suggestion is that size (clamped by its minimum and maximum cross sizes if they
|
||||||
|
// > are definite), converted through the aspect ratio. It is otherwise undefined.
|
||||||
let transferred_size_suggestion = match self.independent_formatting_context {
|
let transferred_size_suggestion = match self.independent_formatting_context {
|
||||||
IndependentFormattingContext::NonReplaced(_) => None,
|
IndependentFormattingContext::NonReplaced(_) => None,
|
||||||
IndependentFormattingContext::Replaced(ref bfc) => {
|
IndependentFormattingContext::Replaced(ref bfc) => {
|
||||||
|
@ -2009,40 +2014,46 @@ impl FlexItemBox {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// > **content size suggestion**
|
||||||
|
// > The content size suggestion is the min-content size in the main axis, clamped, if it has a
|
||||||
|
// > preferred aspect ratio, by any definite minimum and maximum cross sizes converted through the
|
||||||
|
// > aspect ratio.
|
||||||
let inline_content_size = self
|
let inline_content_size = self
|
||||||
.independent_formatting_context
|
.independent_formatting_context
|
||||||
.inline_content_sizes(layout_context)
|
.inline_content_sizes(layout_context)
|
||||||
.min_content;
|
.min_content;
|
||||||
let content_size_suggestion = match self.independent_formatting_context {
|
let (is_replaced, aspect_ratio) = match self.independent_formatting_context {
|
||||||
IndependentFormattingContext::NonReplaced(_) => inline_content_size,
|
IndependentFormattingContext::NonReplaced(_) => (false, None),
|
||||||
IndependentFormattingContext::Replaced(ref replaced) => {
|
IndependentFormattingContext::Replaced(ref replaced) => (
|
||||||
if let Some(ratio) = replaced
|
true,
|
||||||
|
replaced
|
||||||
.contents
|
.contents
|
||||||
.inline_size_over_block_size_intrinsic_ratio(
|
.inline_size_over_block_size_intrinsic_ratio(
|
||||||
self.independent_formatting_context.style(),
|
self.independent_formatting_context.style(),
|
||||||
)
|
),
|
||||||
{
|
),
|
||||||
inline_content_size.clamp_between_extremums(
|
|
||||||
min_size.block.auto_is(Au::zero).scale_by(ratio),
|
|
||||||
max_size.block.map(|l| l.scale_by(ratio)),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
inline_content_size
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
let content_size_suggestion = aspect_ratio
|
||||||
|
.map(|aspect_ratio| {
|
||||||
|
inline_content_size.clamp_between_extremums(
|
||||||
|
min_size.block.auto_is(Au::zero).scale_by(aspect_ratio),
|
||||||
|
max_size.block.map(|l| l.scale_by(aspect_ratio)),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.unwrap_or(inline_content_size);
|
||||||
|
|
||||||
let result = match specified_size_suggestion {
|
// > The content-based minimum size of a flex item is the smaller of its specified size
|
||||||
AuOrAuto::LengthPercentage(l) => l.min(content_size_suggestion),
|
// > suggestion and its content size suggestion if its specified size suggestion exists;
|
||||||
AuOrAuto::Auto => {
|
// > otherwise, the smaller of its transferred size suggestion and its content size
|
||||||
if let Some(l) = transferred_size_suggestion {
|
// > suggestion if the element is replaced and its transferred size suggestion exists;
|
||||||
l.min(content_size_suggestion)
|
// > otherwise its content size suggestion. In all cases, the size is clamped by the maximum
|
||||||
} else {
|
// > main size if it’s definite.
|
||||||
content_size_suggestion
|
match (specified_size_suggestion, transferred_size_suggestion) {
|
||||||
}
|
(Some(specified), _) => specified.min(content_size_suggestion),
|
||||||
},
|
(_, Some(transferred)) if is_replaced => transferred.min(content_size_suggestion),
|
||||||
};
|
_ => content_size_suggestion,
|
||||||
result.clamp_below_max(max_size.inline)
|
}
|
||||||
|
.clamp_below_max(max_size.inline)
|
||||||
} else {
|
} else {
|
||||||
// FIXME(stshine): Implement this when main axis is item's block axis.
|
// FIXME(stshine): Implement this when main axis is item's block axis.
|
||||||
Au::zero()
|
Au::zero()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue