aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/construct.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r--components/layout_2020/flow/construct.rs72
1 files changed, 52 insertions, 20 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs
index d1a57145110..5e6881ab862 100644
--- a/components/layout_2020/flow/construct.rs
+++ b/components/layout_2020/flow/construct.rs
@@ -10,6 +10,7 @@ use crate::flow::inline::{InlineBox, InlineFormattingContext, InlineLevelBox, Te
use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox};
use crate::formatting_contexts::IndependentFormattingContext;
use crate::positioned::AbsolutelyPositionedBox;
+use crate::sizing::{outer_inline_content_sizes, ContentSizes};
use crate::style_ext::{ComputedValuesExt, DisplayGeneratingBox, DisplayInside, DisplayOutside};
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use rayon_croissant::ParallelIteratorExt;
@@ -25,6 +26,8 @@ impl BlockFormattingContext {
contents: NonReplacedContents<impl NodeExt<'dom>>,
) -> Self {
let (contents, contains_floats) = BlockContainer::construct(context, style, contents);
+ // FIXME: add contribution to `content_sizes` of floats in this formatting context
+ // https://dbaron.org/css/intrinsic/#intrinsic
Self {
contents,
contains_floats: contains_floats == ContainsFloats::Yes,
@@ -127,16 +130,17 @@ impl BlockContainer {
context: &LayoutContext,
block_container_style: &Arc<ComputedValues>,
contents: NonReplacedContents<impl NodeExt<'dom>>,
- //intrinsic_sizes_requested: bool,
+ //request_content_sizes: bool,
) -> (BlockContainer, ContainsFloats) {
+ let request_content_sizes = false; // FIXME
let mut builder = BlockContainerBuilder {
context,
block_container_style,
- block_level_boxes: Default::default(),
- ongoing_inline_formatting_context: Default::default(),
- ongoing_inline_boxes_stack: Default::default(),
- anonymous_style: Default::default(),
- contains_floats: Default::default(),
+ block_level_boxes: Vec::new(),
+ ongoing_inline_formatting_context: InlineFormattingContext::default(),
+ ongoing_inline_boxes_stack: Vec::new(),
+ anonymous_style: None,
+ contains_floats: ContainsFloats::No,
};
contents.traverse(block_container_style, context, &mut builder);
@@ -158,25 +162,46 @@ impl BlockContainer {
}
type Intermediate<Node> = IntermediateBlockLevelBox<Node>;
- #[derive(Default)]
struct Target {
contains_floats: ContainsFloats,
+ outer_content_sizes_of_children: ContentSizes,
+ }
+ impl Default for Target {
+ fn default() -> Self {
+ Self {
+ contains_floats: ContainsFloats::No,
+ outer_content_sizes_of_children: ContentSizes::zero(),
+ }
+ }
}
let mut target = Target {
contains_floats: builder.contains_floats,
+ outer_content_sizes_of_children: ContentSizes::zero(),
};
- let request_content_sizes = false; // FIXME
+ let request_childrens_outer_content_sizes = request_content_sizes;
let iter = builder.block_level_boxes.into_par_iter();
let iter = iter.mapfold_reduce_into(
&mut target,
|target, (intermediate, box_slot): (Intermediate<_>, BoxSlot<'_>)| {
- let (block_level_box, box_contains_floats) =
- intermediate.finish(context, request_content_sizes);
+ let (block_level_box, box_contains_floats) = intermediate.finish(
+ context,
+ if request_childrens_outer_content_sizes {
+ Some(&mut target.outer_content_sizes_of_children)
+ } else {
+ None
+ },
+ );
target.contains_floats |= box_contains_floats;
box_slot.set(LayoutBox::BlockLevel(block_level_box.clone()));
block_level_box
},
- |left, right| left.contains_floats |= right.contains_floats,
+ |left, right| {
+ left.contains_floats |= right.contains_floats;
+ if request_content_sizes {
+ left.outer_content_sizes_of_children
+ .max_assign(&right.outer_content_sizes_of_children)
+ }
+ },
);
let container = BlockContainer::BlockLevelBoxes(iter.collect());
(container, target.contains_floats)
@@ -548,11 +573,18 @@ where
fn finish(
self,
context: &LayoutContext,
- parent_requests_outer_content_sizes: bool,
+ max_assign_in_flow_outer_content_sizes_to: Option<&mut ContentSizes>,
) -> (Arc<BlockLevelBox>, ContainsFloats) {
match self {
IntermediateBlockLevelBox::SameFormattingContextBlock { style, contents } => {
- let (contents, contains_floats) = contents.finish(context, &style);
+ 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);
+ 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()))
+ }
let block_level_box =
Arc::new(BlockLevelBox::SameFormattingContextBlock { contents, style });
(block_level_box, contains_floats)
@@ -563,7 +595,8 @@ where
contents,
} => {
let request_content_sizes =
- parent_requests_outer_content_sizes && style.inline_size_is_auto();
+ max_assign_in_flow_outer_content_sizes_to.is_some() &&
+ style.inline_size_is_auto();
let contents = IndependentFormattingContext::construct(
context,
style,
@@ -571,6 +604,10 @@ where
contents,
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()))
+ }
(
Arc::new(BlockLevelBox::Independent(contents)),
ContainsFloats::No,
@@ -608,6 +645,7 @@ where
self,
context: &LayoutContext,
style: &Arc<ComputedValues>,
+ _request_content_sizes: bool,
) -> (BlockContainer, ContainsFloats) {
match self {
IntermediateBlockContainer::Deferred { contents } => {
@@ -639,9 +677,3 @@ impl std::ops::BitOrAssign for ContainsFloats {
}
}
}
-
-impl Default for ContainsFloats {
- fn default() -> Self {
- ContainsFloats::No
- }
-}