/* This Source Code Form is subject to the terms of the Mozilla Public * 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/. */ //! CSS table formatting contexts. use std::fmt; use app_units::Au; use euclid::default::Point2D; use gfx_traits::print_tree::PrintTree; use log::{debug, trace}; use style::logical_geometry::LogicalSize; use style::properties::ComputedValues; use crate::block::BlockFlow; use crate::context::LayoutContext; use crate::display_list::{ DisplayListBuildState, StackingContextCollectionFlags, StackingContextCollectionState, }; use crate::flow::{Flow, FlowClass, OpaqueFlow}; use crate::fragment::{Fragment, FragmentBorderBoxIterator, Overflow}; #[allow(unsafe_code)] unsafe impl crate::flow::HasBaseFlow for TableCaptionFlow {} /// A table formatting context. #[repr(C)] pub struct TableCaptionFlow { pub block_flow: BlockFlow, } impl TableCaptionFlow { pub fn from_fragment(fragment: Fragment) -> TableCaptionFlow { TableCaptionFlow { block_flow: BlockFlow::from_fragment(fragment), } } } impl Flow for TableCaptionFlow { fn class(&self) -> FlowClass { FlowClass::TableCaption } fn as_mut_block(&mut self) -> &mut BlockFlow { &mut self.block_flow } fn as_block(&self) -> &BlockFlow { &self.block_flow } fn bubble_inline_sizes(&mut self) { self.block_flow.bubble_inline_sizes(); } fn assign_inline_sizes(&mut self, layout_context: &LayoutContext) { debug!( "assign_inline_sizes({}): assigning inline_size for flow", "table_caption" ); trace!("TableCaptionFlow before assigning: {:?}", &self); self.block_flow.assign_inline_sizes(layout_context); trace!("TableCaptionFlow after assigning: {:?}", &self); } fn assign_block_size(&mut self, layout_context: &LayoutContext) { debug!("assign_block_size: assigning block_size for table_caption"); trace!("TableCaptionFlow before assigning: {:?}", &self); self.block_flow.assign_block_size(layout_context); trace!("TableCaptionFlow after assigning: {:?}", &self); } fn compute_stacking_relative_position(&mut self, layout_context: &LayoutContext) { self.block_flow .compute_stacking_relative_position(layout_context) } fn update_late_computed_inline_position_if_necessary(&mut self, inline_position: Au) { self.block_flow .update_late_computed_inline_position_if_necessary(inline_position) } fn update_late_computed_block_position_if_necessary(&mut self, block_position: Au) { self.block_flow .update_late_computed_block_position_if_necessary(block_position) } fn build_display_list(&mut self, state: &mut DisplayListBuildState) { debug!("build_display_list_table_caption: same process as block flow"); self.block_flow.build_display_list(state); } fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) { self.block_flow .collect_stacking_contexts_for_block(state, StackingContextCollectionFlags::empty()); } fn repair_style(&mut self, new_style: &crate::ServoArc) { self.block_flow.repair_style(new_style) } fn compute_overflow(&self) -> Overflow { self.block_flow.compute_overflow() } fn contains_roots_of_absolute_flow_tree(&self) -> bool { self.block_flow.contains_roots_of_absolute_flow_tree() } fn is_absolute_containing_block(&self) -> bool { self.block_flow.is_absolute_containing_block() } fn generated_containing_block_size(&self, flow: OpaqueFlow) -> LogicalSize { self.block_flow.generated_containing_block_size(flow) } fn iterate_through_fragment_border_boxes( &self, iterator: &mut dyn FragmentBorderBoxIterator, level: i32, stacking_context_position: &Point2D, ) { self.block_flow.iterate_through_fragment_border_boxes( iterator, level, stacking_context_position, ) } fn mutate_fragments(&mut self, mutator: &mut dyn FnMut(&mut Fragment)) { self.block_flow.mutate_fragments(mutator) } fn print_extra_flow_children(&self, print_tree: &mut PrintTree) { self.block_flow.print_extra_flow_children(print_tree); } } impl fmt::Debug for TableCaptionFlow { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "TableCaptionFlow: {:?}", self.block_flow) } }