diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2019-12-03 02:19:48 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2019-12-03 15:11:35 +0100 |
commit | c056e5b6b0dcd3a0226c02b6ffbe544a085da567 (patch) | |
tree | 27a9a434a4308efb1bddff489691f6c2cbc81fa5 /components/layout_2020/flow/construct.rs | |
parent | da36fcddb05da8a4370c006f937ab43682d057c0 (diff) | |
download | servo-c056e5b6b0dcd3a0226c02b6ffbe544a085da567.tar.gz servo-c056e5b6b0dcd3a0226c02b6ffbe544a085da567.zip |
Finish plumbing intrinsic min/max-content through box construction
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r-- | components/layout_2020/flow/construct.rs | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs index f7490f4c605..80f44b2ff81 100644 --- a/components/layout_2020/flow/construct.rs +++ b/components/layout_2020/flow/construct.rs @@ -24,14 +24,17 @@ impl BlockFormattingContext { context: &LayoutContext, style: &Arc<ComputedValues>, contents: NonReplacedContents<impl NodeExt<'dom>>, - ) -> Self { - let (contents, contains_floats) = BlockContainer::construct(context, style, contents); + request_content_sizes: bool, + ) -> (Self, Option<ContentSizes>) { + let (contents, contains_floats, content_sizes) = + BlockContainer::construct(context, style, contents, request_content_sizes); // FIXME: add contribution to `content_sizes` of floats in this formatting context // https://dbaron.org/css/intrinsic/#intrinsic - Self { + let bfc = Self { contents, contains_floats: contains_floats == ContainsFloats::Yes, - } + }; + (bfc, content_sizes) } } @@ -130,9 +133,8 @@ impl BlockContainer { context: &LayoutContext, block_container_style: &Arc<ComputedValues>, contents: NonReplacedContents<impl NodeExt<'dom>>, - //request_content_sizes: bool, - ) -> (BlockContainer, ContainsFloats) { - let request_content_sizes = false; // FIXME + request_content_sizes: bool, + ) -> (BlockContainer, ContainsFloats, Option<ContentSizes>) { let mut builder = BlockContainerBuilder { context, block_container_style, @@ -153,10 +155,19 @@ impl BlockContainer { .is_empty() { if builder.block_level_boxes.is_empty() { + let content_sizes = if request_content_sizes { + Some( + builder + .ongoing_inline_formatting_context + .inline_content_sizes(context), + ) + } else { + None + }; let container = BlockContainer::InlineFormattingContext( builder.ongoing_inline_formatting_context, ); - return (container, builder.contains_floats); + return (container, builder.contains_floats, content_sizes); } builder.end_ongoing_inline_formatting_context(); } @@ -204,7 +215,12 @@ impl BlockContainer { }, ); let container = BlockContainer::BlockLevelBoxes(iter.collect()); - (container, target.contains_floats) + let content_sizes = if request_content_sizes { + Some(target.outer_content_sizes_of_children) + } else { + None + }; + (container, target.contains_floats, content_sizes) } } @@ -367,7 +383,9 @@ where }); // `unwrap` doesn’t panic here because `is_replaced` returned `false`. - NonReplacedContents::try_from(contents).unwrap().traverse(&style, self.context, self); + NonReplacedContents::try_from(contents) + .unwrap() + .traverse(&style, self.context, self); let mut inline_box = self .ongoing_inline_boxes_stack @@ -575,13 +593,12 @@ where ) -> (Arc<BlockLevelBox>, ContainsFloats) { match self { IntermediateBlockLevelBox::SameFormattingContextBlock { style, contents } => { - let request_content_sizes = - max_assign_in_flow_outer_content_sizes_to.is_some() && + let request_content_sizes = max_assign_in_flow_outer_content_sizes_to.is_some() && style.inline_size_is_auto(); - let (contents, contains_floats) = contents.finish(context, &style, request_content_sizes); + let (contents, contains_floats, content_sizes) = + contents.finish(context, &style, request_content_sizes); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { - let get_content_size = || todo!(); - to.max_assign(&outer_inline_content_sizes(&style, get_content_size())) + to.max_assign(&outer_inline_content_sizes(&style, &content_sizes)) } let block_level_box = Arc::new(BlockLevelBox::SameFormattingContextBlock { contents, style }); @@ -592,8 +609,7 @@ where display_inside, contents, } => { - let request_content_sizes = - max_assign_in_flow_outer_content_sizes_to.is_some() && + let request_content_sizes = max_assign_in_flow_outer_content_sizes_to.is_some() && style.inline_size_is_auto(); let contents = IndependentFormattingContext::construct( context, @@ -603,8 +619,10 @@ where request_content_sizes, ); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { - let get_content_size = || todo!(); - to.max_assign(&outer_inline_content_sizes(&contents.style, get_content_size())) + to.max_assign(&outer_inline_content_sizes( + &contents.style, + &contents.inline_content_sizes, + )) } ( Arc::new(BlockLevelBox::Independent(contents)), @@ -643,19 +661,25 @@ where self, context: &LayoutContext, style: &Arc<ComputedValues>, - _request_content_sizes: bool, - ) -> (BlockContainer, ContainsFloats) { + request_content_sizes: bool, + ) -> (BlockContainer, ContainsFloats, Option<ContentSizes>) { match self { IntermediateBlockContainer::Deferred { contents } => { - BlockContainer::construct(context, style, contents) + BlockContainer::construct(context, style, contents, request_content_sizes) }, IntermediateBlockContainer::InlineFormattingContext(ifc) => { + let content_sizes = if request_content_sizes { + Some(ifc.inline_content_sizes(context)) + } else { + None + }; // If that inline formatting context contained any float, those // were already taken into account during the first phase of // box construction. ( BlockContainer::InlineFormattingContext(ifc), ContainsFloats::No, + content_sizes, ) }, } |