diff options
Diffstat (limited to 'components/layout_2020/flow/mod.rs')
-rw-r--r-- | components/layout_2020/flow/mod.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index b8c0d7e500d..c256c6c9a23 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -18,11 +18,13 @@ use crate::fragments::{ use crate::geom::flow_relative::{Rect, Sides, Vec2}; use crate::positioned::{AbsolutelyPositionedBox, PositioningContext}; use crate::replaced::ReplacedContent; +use crate::sizing::{self, ContentSizes}; use crate::style_ext::{ComputedValuesExt, PaddingBorderMargin}; use crate::ContainingBlock; use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator}; use rayon_croissant::ParallelIteratorExt; use servo_arc::Arc; +use style::logical_geometry::WritingMode; use style::properties::ComputedValues; use style::values::computed::{Length, LengthOrAuto}; use style::Zero; @@ -132,6 +134,29 @@ impl BlockContainer { ), } } + + pub(super) fn inline_content_sizes( + &self, + layout_context: &LayoutContext, + containing_block_writing_mode: WritingMode, + ) -> ContentSizes { + match &self { + Self::BlockLevelBoxes(boxes) => { + let mut content_sizes = ContentSizes::zero(); + for box_ in boxes { + content_sizes.max_assign( + &box_ + .borrow_mut() + .inline_content_sizes(layout_context, containing_block_writing_mode), + ); + } + content_sizes + }, + Self::InlineFormattingContext(context) => { + context.inline_content_sizes(layout_context, containing_block_writing_mode) + }, + } + } } fn layout_block_level_children( @@ -350,6 +375,28 @@ impl BlockLevelBox { }, } } + + fn inline_content_sizes( + &mut self, + layout_context: &LayoutContext, + containing_block_writing_mode: WritingMode, + ) -> ContentSizes { + match self { + Self::SameFormattingContextBlock { + style, contents, .. + } => sizing::outer_inline(style, containing_block_writing_mode, || { + contents.inline_content_sizes(layout_context, style.writing_mode) + }), + Self::Independent(independent) => { + independent.outer_inline(layout_context, containing_block_writing_mode) + }, + BlockLevelBox::OutOfFlowAbsolutelyPositionedBox(_) => ContentSizes::zero(), + BlockLevelBox::OutOfFlowFloatBox(_box_) => { + // TODO: Actually implement that. + ContentSizes::zero() + }, + } + } } enum NonReplacedContents<'a> { |