diff options
Diffstat (limited to 'components/layout_2020/layout_box_base.rs')
-rw-r--r-- | components/layout_2020/layout_box_base.rs | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/components/layout_2020/layout_box_base.rs b/components/layout_2020/layout_box_base.rs index 0de9987bde7..bb2d37698f1 100644 --- a/components/layout_2020/layout_box_base.rs +++ b/components/layout_2020/layout_box_base.rs @@ -2,15 +2,20 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use std::fmt::{Debug, Formatter}; + +use app_units::Au; use atomic_refcell::AtomicRefCell; use servo_arc::Arc; use style::properties::ComputedValues; -use crate::ConstraintSpace; use crate::context::LayoutContext; -use crate::fragment_tree::BaseFragmentInfo; +use crate::formatting_contexts::Baselines; +use crate::fragment_tree::{BaseFragmentInfo, CollapsedBlockMargins, Fragment, SpecificLayoutInfo}; use crate::geom::SizeConstraint; +use crate::positioned::PositioningContext; use crate::sizing::{ComputeInlineContentSizes, InlineContentSizesResult}; +use crate::{ConstraintSpace, ContainingBlockSize}; /// A box tree node that handles containing information about style and the original DOM /// node or pseudo-element that it is based on. This also handles caching of layout values @@ -18,12 +23,12 @@ use crate::sizing::{ComputeInlineContentSizes, InlineContentSizesResult}; /// passes. /// /// In the future, this will hold layout results to support incremental layout. -#[derive(Debug)] pub(crate) struct LayoutBoxBase { pub base_fragment_info: BaseFragmentInfo, pub style: Arc<ComputedValues>, pub cached_inline_content_size: AtomicRefCell<Option<(SizeConstraint, InlineContentSizesResult)>>, + pub cached_layout_result: AtomicRefCell<Option<CacheableLayoutResultAndInputs>>, } impl LayoutBoxBase { @@ -32,6 +37,7 @@ impl LayoutBoxBase { base_fragment_info, style, cached_inline_content_size: AtomicRefCell::default(), + cached_layout_result: AtomicRefCell::default(), } } @@ -58,3 +64,45 @@ impl LayoutBoxBase { result } } + +impl Debug for LayoutBoxBase { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { + f.debug_struct("LayoutBoxBase").finish() + } +} + +#[derive(Clone)] +pub(crate) struct CacheableLayoutResult { + pub fragments: Vec<Fragment>, + + /// <https://drafts.csswg.org/css2/visudet.html#root-height> + pub content_block_size: Au, + + /// If this layout is for a block container, this tracks the collapsable size + /// of start and end margins and whether or not the block container collapsed through. + pub collapsible_margins_in_children: CollapsedBlockMargins, + + /// The contents of a table may force it to become wider than what we would expect + /// from 'width' and 'min-width'. This is the resulting inline content size, + /// or None for non-table layouts. + pub content_inline_size_for_table: Option<Au>, + + /// The offset of the last inflow baseline of this layout in the content area, if + /// there was one. This is used to propagate baselines to the ancestors of `display: + /// inline-block`. + pub baselines: Baselines, + + /// Whether or not this layout depends on the containing block size. + pub depends_on_block_constraints: bool, + + /// Additional information of this layout that could be used by Javascripts and devtools. + pub specific_layout_info: Option<SpecificLayoutInfo>, +} + +pub(crate) struct CacheableLayoutResultAndInputs { + pub result: CacheableLayoutResult, + + pub containing_block_for_children_size: ContainingBlockSize, + + pub positioning_context: PositioningContext, +} |