diff options
Diffstat (limited to 'components/layout/table.rs')
-rw-r--r-- | components/layout/table.rs | 627 |
1 files changed, 377 insertions, 250 deletions
diff --git a/components/layout/table.rs b/components/layout/table.rs index e36fd4b4e5a..cb80850e91e 100644 --- a/components/layout/table.rs +++ b/components/layout/table.rs @@ -79,7 +79,7 @@ impl TableFlow { column_computed_inline_sizes: Vec::new(), collapsed_inline_direction_border_widths_for_table: Vec::new(), collapsed_block_direction_border_widths_for_table: Vec::new(), - table_layout: table_layout + table_layout: table_layout, } } @@ -87,10 +87,10 @@ impl TableFlow { /// a larger value than one of `self_inline_sizes`. Returns the minimum and preferred inline /// sizes. fn update_automatic_column_inline_sizes( - parent_inline_sizes: &mut Vec<ColumnIntrinsicInlineSize>, - child_cell_inline_sizes: &[CellIntrinsicInlineSize], - surrounding_size: Au) - -> IntrinsicISizes { + parent_inline_sizes: &mut Vec<ColumnIntrinsicInlineSize>, + child_cell_inline_sizes: &[CellIntrinsicInlineSize], + surrounding_size: Au, + ) -> IntrinsicISizes { let mut total_inline_sizes = IntrinsicISizes { minimum_inline_size: surrounding_size, preferred_inline_size: surrounding_size, @@ -117,8 +117,10 @@ impl TableFlow { } else { let column_size = &child_cell_inline_size.column_size; *parent_sizes = ColumnIntrinsicInlineSize { - minimum_length: cmp::max(parent_sizes.minimum_length, - column_size.minimum_length), + minimum_length: cmp::max( + parent_sizes.minimum_length, + column_size.minimum_length, + ), percentage: parent_sizes.greatest_percentage(column_size), preferred: cmp::max(parent_sizes.preferred, column_size.preferred), constrained: parent_sizes.constrained || column_size.constrained, @@ -158,12 +160,14 @@ impl TableFlow { /// Updates the minimum and preferred inline-size calculation for a single row. This is /// factored out into a separate function because we process children of rowgroups too. - fn update_column_inline_sizes_for_row(row: &TableRowFlow, - column_inline_sizes: &mut Vec<ColumnIntrinsicInlineSize>, - computation: &mut IntrinsicISizesContribution, - first_row: bool, - table_layout: TableLayout, - surrounding_inline_size: Au) { + fn update_column_inline_sizes_for_row( + row: &TableRowFlow, + column_inline_sizes: &mut Vec<ColumnIntrinsicInlineSize>, + computation: &mut IntrinsicISizesContribution, + first_row: bool, + table_layout: TableLayout, + surrounding_inline_size: Au, + ) { // Read column inline-sizes from the table-row, and assign inline-size=0 for the columns // not defined in the column group. // @@ -178,13 +182,14 @@ impl TableFlow { column_inline_sizes.push(cell_inline_size.column_size); } } - } + }, TableLayout::Auto => { computation.union_block(&TableFlow::update_automatic_column_inline_sizes( column_inline_sizes, &row.cell_intrinsic_inline_sizes, - surrounding_inline_size)) - } + surrounding_inline_size, + )) + }, } } @@ -207,21 +212,31 @@ impl TableFlow { fn column_styles(&self) -> Vec<ColumnStyle> { let mut styles = vec![]; - for group in self.block_flow.base.child_iter() - .filter(|kid| kid.is_table_colgroup()) { + for group in self + .block_flow + .base + .child_iter() + .filter(|kid| kid.is_table_colgroup()) + { // XXXManishearth these as_foo methods should return options // so that we can filter_map let group = group.as_table_colgroup(); - let colgroup_style = group.fragment.as_ref() - .map(|f| f.style()); + let colgroup_style = group.fragment.as_ref().map(|f| f.style()); // The colgroup's span attribute is only relevant when // it has no children // https://html.spec.whatwg.org/multipage/#forming-a-table if group.cols.is_empty() { - let span = group.fragment.as_ref() - .map(|f| f.column_span()).unwrap_or(1); - styles.push(ColumnStyle { span, colgroup_style, col_style: None }); + let span = group + .fragment + .as_ref() + .map(|f| f.column_span()) + .unwrap_or(1); + styles.push(ColumnStyle { + span, + colgroup_style, + col_style: None, + }); } else { for col in &group.cols { // XXXManishearth Arc-cloning colgroup_style is suboptimal @@ -267,45 +282,59 @@ impl Flow for TableFlow { /// The maximum min/pref inline-sizes of each column are set from the rows for the automatic /// table layout calculation. fn bubble_inline_sizes(&mut self) { - let _scope = layout_debug_scope!("table::bubble_inline_sizes {:x}", - self.block_flow.base.debug_id()); + let _scope = layout_debug_scope!( + "table::bubble_inline_sizes {:x}", + self.block_flow.base.debug_id() + ); // Get column inline sizes from colgroups - for kid in self.block_flow.base.child_iter_mut().filter(|kid| kid.is_table_colgroup()) { + for kid in self + .block_flow + .base + .child_iter_mut() + .filter(|kid| kid.is_table_colgroup()) + { for specified_inline_size in &kid.as_mut_table_colgroup().inline_sizes { - self.column_intrinsic_inline_sizes.push(ColumnIntrinsicInlineSize { - minimum_length: match *specified_inline_size { - LengthOrPercentageOrAuto::Auto | - LengthOrPercentageOrAuto::Calc(_) | - LengthOrPercentageOrAuto::Percentage(_) => Au(0), - LengthOrPercentageOrAuto::Length(length) => Au::from(length), - }, - percentage: match *specified_inline_size { - LengthOrPercentageOrAuto::Auto | - LengthOrPercentageOrAuto::Calc(_) | - LengthOrPercentageOrAuto::Length(_) => 0.0, - LengthOrPercentageOrAuto::Percentage(percentage) => percentage.0, - }, - preferred: Au(0), - constrained: false, - }) + self.column_intrinsic_inline_sizes + .push(ColumnIntrinsicInlineSize { + minimum_length: match *specified_inline_size { + LengthOrPercentageOrAuto::Auto | + LengthOrPercentageOrAuto::Calc(_) | + LengthOrPercentageOrAuto::Percentage(_) => Au(0), + LengthOrPercentageOrAuto::Length(length) => Au::from(length), + }, + percentage: match *specified_inline_size { + LengthOrPercentageOrAuto::Auto | + LengthOrPercentageOrAuto::Calc(_) | + LengthOrPercentageOrAuto::Length(_) => 0.0, + LengthOrPercentageOrAuto::Percentage(percentage) => percentage.0, + }, + preferred: Au(0), + constrained: false, + }) } } self.collapsed_inline_direction_border_widths_for_table = Vec::new(); self.collapsed_block_direction_border_widths_for_table = vec![Au(0)]; - let collapsing_borders = self.block_flow - .fragment - .style - .get_inherited_table() - .border_collapse == border_collapse::T::Collapse; + let collapsing_borders = self + .block_flow + .fragment + .style + .get_inherited_table() + .border_collapse == + border_collapse::T::Collapse; let table_inline_collapsed_borders = if collapsing_borders { Some(TableInlineCollapsedBorders { - start: CollapsedBorder::inline_start(&*self.block_flow.fragment.style, - CollapsedBorderProvenance::FromTable), - end: CollapsedBorder::inline_end(&*self.block_flow.fragment.style, - CollapsedBorderProvenance::FromTable), + start: CollapsedBorder::inline_start( + &*self.block_flow.fragment.style, + CollapsedBorderProvenance::FromTable, + ), + end: CollapsedBorder::inline_end( + &*self.block_flow.fragment.style, + CollapsedBorderProvenance::FromTable, + ), }) } else { None @@ -314,8 +343,9 @@ impl Flow for TableFlow { let mut computation = IntrinsicISizesContribution::new(); let mut previous_collapsed_block_end_borders = PreviousBlockCollapsedBorders::FromTable(CollapsedBorder::block_start( - &*self.block_flow.fragment.style, - CollapsedBorderProvenance::FromTable)); + &*self.block_flow.fragment.style, + CollapsedBorderProvenance::FromTable, + )); let mut first_row = true; let (border_padding, _) = self.block_flow.fragment.surrounding_intrinsic_inline_size(); @@ -323,48 +353,50 @@ impl Flow for TableFlow { let mut iterator = TableRowIterator::new(&mut self.block_flow.base).peekable(); while let Some(row) = iterator.next() { TableFlow::update_column_inline_sizes_for_row( - row, - &mut self.column_intrinsic_inline_sizes, - &mut computation, - first_row, - self.table_layout, - border_padding); + row, + &mut self.column_intrinsic_inline_sizes, + &mut computation, + first_row, + self.table_layout, + border_padding, + ); if collapsing_borders { let next_index_and_sibling = iterator.peek(); - let next_collapsed_borders_in_block_direction = - match next_index_and_sibling { - Some(next_sibling) => { - NextBlockCollapsedBorders::FromNextRow( - &next_sibling.as_table_row() - .preliminary_collapsed_borders - .block_start) - } - None => { - NextBlockCollapsedBorders::FromTable( - CollapsedBorder::block_end(&*self.block_flow.fragment.style, - CollapsedBorderProvenance::FromTable)) - } - }; - perform_border_collapse_for_row(row, + let next_collapsed_borders_in_block_direction = match next_index_and_sibling { + Some(next_sibling) => NextBlockCollapsedBorders::FromNextRow( + &next_sibling + .as_table_row() + .preliminary_collapsed_borders + .block_start, + ), + None => NextBlockCollapsedBorders::FromTable(CollapsedBorder::block_end( + &*self.block_flow.fragment.style, + CollapsedBorderProvenance::FromTable, + )), + }; + perform_border_collapse_for_row( + row, table_inline_collapsed_borders.as_ref().unwrap(), previous_collapsed_block_end_borders, next_collapsed_borders_in_block_direction, &mut self.collapsed_inline_direction_border_widths_for_table, - &mut self.collapsed_block_direction_border_widths_for_table); + &mut self.collapsed_block_direction_border_widths_for_table, + ); previous_collapsed_block_end_borders = PreviousBlockCollapsedBorders::FromPreviousRow( - row.final_collapsed_borders.block_end.clone()); + row.final_collapsed_borders.block_end.clone(), + ); } first_row = false - }; + } } let total_horizontal_spacing = self.total_horizontal_spacing(); - let mut style_specified_intrinsic_inline_size = - self.block_flow - .fragment - .style_specified_intrinsic_inline_size() - .finish(); + let mut style_specified_intrinsic_inline_size = self + .block_flow + .fragment + .style_specified_intrinsic_inline_size() + .finish(); style_specified_intrinsic_inline_size.minimum_inline_size -= total_horizontal_spacing; style_specified_intrinsic_inline_size.preferred_inline_size -= total_horizontal_spacing; computation.union_block(&style_specified_intrinsic_inline_size); @@ -376,9 +408,14 @@ impl Flow for TableFlow { /// Recursively (top-down) determines the actual inline-size of child contexts and fragments. /// When called on this context, the context has had its inline-size set by the parent context. fn assign_inline_sizes(&mut self, layout_context: &LayoutContext) { - let _scope = layout_debug_scope!("table::assign_inline_sizes {:x}", - self.block_flow.base.debug_id()); - debug!("assign_inline_sizes({}): assigning inline_size for flow", "table"); + let _scope = layout_debug_scope!( + "table::assign_inline_sizes {:x}", + self.block_flow.base.debug_id() + ); + debug!( + "assign_inline_sizes({}): assigning inline_size for flow", + "table" + ); let shared_context = layout_context.shared_context(); // The position was set to the containing block by the flow's parent. @@ -396,9 +433,11 @@ impl Flow for TableFlow { } let inline_size_computer = InternalTable; - inline_size_computer.compute_used_inline_size(&mut self.block_flow, - shared_context, - containing_block_inline_size); + inline_size_computer.compute_used_inline_size( + &mut self.block_flow, + shared_context, + containing_block_inline_size, + ); let inline_start_content_edge = self.block_flow.fragment.border_padding.inline_start; let inline_end_content_edge = self.block_flow.fragment.border_padding.inline_end; @@ -406,7 +445,8 @@ impl Flow for TableFlow { let spacing_per_cell = self.spacing(); let total_horizontal_spacing = self.total_horizontal_spacing(); let content_inline_size = self.block_flow.fragment.border_box.size.inline - - padding_and_borders - total_horizontal_spacing; + padding_and_borders - + total_horizontal_spacing; let mut remaining_inline_size = content_inline_size; match self.table_layout { @@ -416,32 +456,32 @@ impl Flow for TableFlow { // https://drafts.csswg.org/css2/tables.html#fixed-table-layout for column_inline_size in &self.column_intrinsic_inline_sizes { if column_inline_size.constrained { - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: column_inline_size.minimum_length, - }); + self.column_computed_inline_sizes + .push(ColumnComputedInlineSize { + size: column_inline_size.minimum_length, + }); remaining_inline_size -= column_inline_size.minimum_length; } else if column_inline_size.percentage != 0.0 { let size = remaining_inline_size.scale_by(column_inline_size.percentage); - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: size, - }); + self.column_computed_inline_sizes + .push(ColumnComputedInlineSize { size: size }); remaining_inline_size -= size; } else { // Set the size to 0 now, distribute the remaining widths later - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: Au(0), - }); + self.column_computed_inline_sizes + .push(ColumnComputedInlineSize { size: Au(0) }); } } // Distribute remaining content inline size if unspecified_inline_sizes_indices.len() > 0 { for &index in &unspecified_inline_sizes_indices { - self.column_computed_inline_sizes[index].size = - remaining_inline_size.scale_by(1.0 / unspecified_inline_sizes_indices.len() as f32); + self.column_computed_inline_sizes[index].size = remaining_inline_size + .scale_by(1.0 / unspecified_inline_sizes_indices.len() as f32); } } else { - let total_minimum_size = self.column_intrinsic_inline_sizes + let total_minimum_size = self + .column_intrinsic_inline_sizes .iter() .filter(|size| size.constrained) .map(|size| size.minimum_length.0 as f32) @@ -453,57 +493,66 @@ impl Flow for TableFlow { remaining_inline_size.scale_by(inline_size as f32 / total_minimum_size); } } - } + }, _ => { // The table wrapper already computed the inline-sizes and propagated them down // to us. - } + }, } let column_computed_inline_sizes = &self.column_computed_inline_sizes; let collapsed_inline_direction_border_widths_for_table = &self.collapsed_inline_direction_border_widths_for_table; - let mut collapsed_block_direction_border_widths_for_table = - self.collapsed_block_direction_border_widths_for_table.iter().peekable(); + let mut collapsed_block_direction_border_widths_for_table = self + .collapsed_block_direction_border_widths_for_table + .iter() + .peekable(); let mut incoming_rowspan = vec![]; - self.block_flow.propagate_assigned_inline_size_to_children(shared_context, - inline_start_content_edge, - inline_end_content_edge, - content_inline_size, - |child_flow, - _child_index, - _content_inline_size, - writing_mode, - _inline_start_margin_edge, - _inline_end_margin_edge| { - table_row::propagate_column_inline_sizes_to_child( - child_flow, - writing_mode, - column_computed_inline_sizes, - &spacing_per_cell, - &mut incoming_rowspan); - if child_flow.is_table_row() { - let child_table_row = child_flow.as_mut_table_row(); - child_table_row.populate_collapsed_border_spacing( - collapsed_inline_direction_border_widths_for_table, - &mut collapsed_block_direction_border_widths_for_table); - } else if child_flow.is_table_rowgroup() { - let child_table_rowgroup = child_flow.as_mut_table_rowgroup(); - child_table_rowgroup.populate_collapsed_border_spacing( - collapsed_inline_direction_border_widths_for_table, - &mut collapsed_block_direction_border_widths_for_table); - } - }); + self.block_flow.propagate_assigned_inline_size_to_children( + shared_context, + inline_start_content_edge, + inline_end_content_edge, + content_inline_size, + |child_flow, + _child_index, + _content_inline_size, + writing_mode, + _inline_start_margin_edge, + _inline_end_margin_edge| { + table_row::propagate_column_inline_sizes_to_child( + child_flow, + writing_mode, + column_computed_inline_sizes, + &spacing_per_cell, + &mut incoming_rowspan, + ); + if child_flow.is_table_row() { + let child_table_row = child_flow.as_mut_table_row(); + child_table_row.populate_collapsed_border_spacing( + collapsed_inline_direction_border_widths_for_table, + &mut collapsed_block_direction_border_widths_for_table, + ); + } else if child_flow.is_table_rowgroup() { + let child_table_rowgroup = child_flow.as_mut_table_rowgroup(); + child_table_rowgroup.populate_collapsed_border_spacing( + collapsed_inline_direction_border_widths_for_table, + &mut collapsed_block_direction_border_widths_for_table, + ); + } + }, + ); } fn assign_block_size(&mut self, lc: &LayoutContext) { debug!("assign_block_size: assigning block_size for table"); let vertical_spacing = self.spacing().vertical(); - self.block_flow.assign_block_size_for_table_like_flow(vertical_spacing, lc) + self.block_flow + .assign_block_size_for_table_like_flow(vertical_spacing, lc) } fn compute_stacking_relative_position(&mut self, layout_context: &LayoutContext) { - self.block_flow.compute_stacking_relative_position(layout_context) + self.block_flow + .compute_stacking_relative_position(layout_context) } fn generated_containing_block_size(&self, flow: OpaqueFlow) -> LogicalSize<Au> { @@ -511,24 +560,29 @@ impl Flow for TableFlow { } 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) + 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) + self.block_flow + .update_late_computed_block_position_if_necessary(block_position) } fn build_display_list(&mut self, state: &mut DisplayListBuildState) { - let border_painting_mode = match self.block_flow - .fragment - .style - .get_inherited_table() - .border_collapse { + let border_painting_mode = match self + .block_flow + .fragment + .style + .get_inherited_table() + .border_collapse + { border_collapse::T::Separate => BorderPaintingMode::Separate, border_collapse::T::Collapse => BorderPaintingMode::Hidden, }; - self.block_flow.build_display_list_for_block(state, border_painting_mode); + self.block_flow + .build_display_list_for_block(state, border_painting_mode); let iter = TableCellStyleIterator::new(&self); for style in iter { @@ -538,8 +592,10 @@ impl Flow for TableFlow { fn collect_stacking_contexts(&mut self, state: &mut StackingContextCollectionState) { // Stacking contexts are collected by the table wrapper. - self.block_flow.collect_stacking_contexts_for_block(state, - StackingContextCollectionFlags::NEVER_CREATES_STACKING_CONTEXT); + self.block_flow.collect_stacking_contexts_for_block( + state, + StackingContextCollectionFlags::NEVER_CREATES_STACKING_CONTEXT, + ); } fn repair_style(&mut self, new_style: &::ServoArc<ComputedValues>) { @@ -550,11 +606,17 @@ impl Flow for TableFlow { self.block_flow.compute_overflow() } - fn iterate_through_fragment_border_boxes(&self, - iterator: &mut FragmentBorderBoxIterator, - level: i32, - stacking_context_position: &Point2D<Au>) { - self.block_flow.iterate_through_fragment_border_boxes(iterator, level, stacking_context_position) + fn iterate_through_fragment_border_boxes( + &self, + iterator: &mut FragmentBorderBoxIterator, + level: i32, + stacking_context_position: &Point2D<Au>, + ) { + self.block_flow.iterate_through_fragment_border_boxes( + iterator, + level, + stacking_context_position, + ) } fn mutate_fragments(&mut self, mutator: &mut FnMut(&mut Fragment)) { @@ -592,15 +654,16 @@ impl ISizeAndMarginsComputer for InternalTable { &self, block: &mut BlockFlow, shared_context: &SharedStyleContext, - parent_flow_inline_size: Au + parent_flow_inline_size: Au, ) { - let mut input = self.compute_inline_size_constraint_inputs(block, - parent_flow_inline_size, - shared_context); + let mut input = self.compute_inline_size_constraint_inputs( + block, + parent_flow_inline_size, + shared_context, + ); // Tables are always at least as wide as their minimum inline size. - let minimum_inline_size = - block.base.intrinsic_inline_sizes.minimum_inline_size - + let minimum_inline_size = block.base.intrinsic_inline_sizes.minimum_inline_size - block.fragment.border_padding.inline_start_end(); input.available_inline_size = cmp::max(input.available_inline_size, minimum_inline_size); @@ -609,8 +672,11 @@ impl ISizeAndMarginsComputer for InternalTable { } /// Solve the inline-size and margins constraints for this block flow. - fn solve_inline_size_constraints(&self, _: &mut BlockFlow, input: &ISizeConstraintInput) - -> ISizeConstraintSolution { + fn solve_inline_size_constraints( + &self, + _: &mut BlockFlow, + input: &ISizeConstraintInput, + ) -> ISizeConstraintSolution { ISizeConstraintSolution::new(input.available_inline_size, Au(0), Au(0)) } } @@ -697,20 +763,28 @@ impl<T> VecExt<T> for Vec<T> { /// Updates the border styles in the block direction for a single row. This function should /// only be called if border collapsing is on. It is factored out into a separate function /// because we process children of rowgroups too. -fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow, - table_inline_borders: &TableInlineCollapsedBorders, - previous_block_borders: PreviousBlockCollapsedBorders, - next_block_borders: NextBlockCollapsedBorders, - inline_spacing: &mut Vec<Au>, - block_spacing: &mut Vec<Au>) { +fn perform_border_collapse_for_row( + child_table_row: &mut TableRowFlow, + table_inline_borders: &TableInlineCollapsedBorders, + previous_block_borders: PreviousBlockCollapsedBorders, + next_block_borders: NextBlockCollapsedBorders, + inline_spacing: &mut Vec<Au>, + block_spacing: &mut Vec<Au>, +) { // TODO mbrubeck: Take rowspan and colspan into account. - let number_of_borders_inline_direction = child_table_row.preliminary_collapsed_borders.inline.len(); + let number_of_borders_inline_direction = + child_table_row.preliminary_collapsed_borders.inline.len(); // Compute interior inline borders. - for (i, this_inline_border) in child_table_row.preliminary_collapsed_borders - .inline - .iter_mut() - .enumerate() { - child_table_row.final_collapsed_borders.inline.push_or_set(i, *this_inline_border); + for (i, this_inline_border) in child_table_row + .preliminary_collapsed_borders + .inline + .iter_mut() + .enumerate() + { + child_table_row + .final_collapsed_borders + .inline + .push_or_set(i, *this_inline_border); if i == 0 { child_table_row.final_collapsed_borders.inline[i].combine(&table_inline_borders.start); } else if i + 1 == number_of_borders_inline_direction { @@ -718,22 +792,28 @@ fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow, } let inline_spacing = inline_spacing.get_mut_or_push(i, Au(0)); - *inline_spacing = cmp::max(*inline_spacing, child_table_row.final_collapsed_borders.inline[i].width) + *inline_spacing = cmp::max( + *inline_spacing, + child_table_row.final_collapsed_borders.inline[i].width, + ) } // Compute block-start borders. let block_start_borders = &mut child_table_row.final_collapsed_borders.block_start; - *block_start_borders = child_table_row.preliminary_collapsed_borders.block_start.clone(); + *block_start_borders = child_table_row + .preliminary_collapsed_borders + .block_start + .clone(); for (i, this_border) in block_start_borders.iter_mut().enumerate() { match previous_block_borders { PreviousBlockCollapsedBorders::FromPreviousRow(ref previous_block_borders) => { if previous_block_borders.len() > i { this_border.combine(&previous_block_borders[i]); } - } + }, PreviousBlockCollapsedBorders::FromTable(table_border) => { this_border.combine(&table_border); - } + }, } } @@ -741,20 +821,22 @@ fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow, let next_block = &mut child_table_row.final_collapsed_borders.block_end; block_spacing.push(Au(0)); let block_spacing = block_spacing.last_mut().unwrap(); - for (i, this_block_border) in child_table_row.preliminary_collapsed_borders - .block_end - .iter() - .enumerate() { + for (i, this_block_border) in child_table_row + .preliminary_collapsed_borders + .block_end + .iter() + .enumerate() + { let next_block = next_block.push_or_set(i, *this_block_border); match next_block_borders { NextBlockCollapsedBorders::FromNextRow(next_block_borders) => { if next_block_borders.len() > i { next_block.combine(&next_block_borders[i]) } - } + }, NextBlockCollapsedBorders::FromTable(ref next_block_borders) => { next_block.combine(next_block_borders); - } + }, } *block_spacing = cmp::max(*block_spacing, next_block.width) } @@ -764,27 +846,41 @@ fn perform_border_collapse_for_row(child_table_row: &mut TableRowFlow, /// rowgroups. pub trait TableLikeFlow { /// Lays out the rows of a table. - fn assign_block_size_for_table_like_flow(&mut self, block_direction_spacing: Au, - layout_context: &LayoutContext); + fn assign_block_size_for_table_like_flow( + &mut self, + block_direction_spacing: Au, + layout_context: &LayoutContext, + ); } impl TableLikeFlow for BlockFlow { - fn assign_block_size_for_table_like_flow(&mut self, block_direction_spacing: Au, - layout_context: &LayoutContext) { - debug_assert!(self.fragment.style.get_inherited_table().border_collapse == - border_collapse::T::Separate || block_direction_spacing == Au(0)); - - fn border_spacing_for_row(fragment: &Fragment, row: &TableRowFlow, - block_direction_spacing: Au) -> Au { + fn assign_block_size_for_table_like_flow( + &mut self, + block_direction_spacing: Au, + layout_context: &LayoutContext, + ) { + debug_assert!( + self.fragment.style.get_inherited_table().border_collapse == + border_collapse::T::Separate || + block_direction_spacing == Au(0) + ); + + fn border_spacing_for_row( + fragment: &Fragment, + row: &TableRowFlow, + block_direction_spacing: Au, + ) -> Au { match fragment.style.get_inherited_table().border_collapse { border_collapse::T::Separate => block_direction_spacing, - border_collapse::T::Collapse => { - row.collapsed_border_spacing.block_start - } + border_collapse::T::Collapse => row.collapsed_border_spacing.block_start, } } - if self.base.restyle_damage.contains(ServoRestyleDamage::REFLOW) { + if self + .base + .restyle_damage + .contains(ServoRestyleDamage::REFLOW) + { let mut sizes = vec![Default::default()]; // The amount of border spacing up to and including this row, // but not including the spacing beneath it @@ -803,14 +899,16 @@ impl TableLikeFlow for BlockFlow { first = false; continue; } - cumulative_border_spacing += - border_spacing_for_row(&self.fragment, kid.as_table_row(), - block_direction_spacing); + cumulative_border_spacing += border_spacing_for_row( + &self.fragment, + kid.as_table_row(), + block_direction_spacing, + ); sizes.push(TableRowSizeData { // we haven't calculated sizes yet size: Au(0), cumulative_border_spacing, - rowgroup_id + rowgroup_id, }); } else if kid.is_table_rowgroup() && !first { rowgroup_id += 1; @@ -822,17 +920,17 @@ impl TableLikeFlow for BlockFlow { let mut i = 0; for kid in self.base.child_iter_mut() { if kid.is_table_row() { - let size = kid.as_mut_table_row() - .compute_block_size_table_row_base(layout_context, - &mut incoming_rowspan_data, - &sizes, - i); + let size = kid.as_mut_table_row().compute_block_size_table_row_base( + layout_context, + &mut incoming_rowspan_data, + &sizes, + i, + ); sizes[i].size = size; i += 1; } } - // Our current border-box position. let block_start_border_padding = self.fragment.border_padding.block_start; let mut current_block_offset = block_start_border_padding; @@ -848,12 +946,12 @@ impl TableLikeFlow for BlockFlow { has_rows = true; let row = kid.as_mut_table_row(); row.assign_block_size_to_self_and_children(&sizes, i); - row.mut_base().restyle_damage - .remove(ServoRestyleDamage::REFLOW_OUT_OF_FLOW | - ServoRestyleDamage::REFLOW); - current_block_offset = current_block_offset + - border_spacing_for_row(&self.fragment, row, - block_direction_spacing); + row.mut_base().restyle_damage.remove( + ServoRestyleDamage::REFLOW_OUT_OF_FLOW | ServoRestyleDamage::REFLOW, + ); + current_block_offset = + current_block_offset + + border_spacing_for_row(&self.fragment, row, block_direction_spacing); i += 1; } @@ -873,13 +971,13 @@ impl TableLikeFlow for BlockFlow { let mut block_size = current_block_offset - block_start_border_padding; let mut candidate_block_size_iterator = CandidateBSizeIterator::new( &self.fragment, - self.base.block_container_explicit_block_size); + self.base.block_container_explicit_block_size, + ); while let Some(candidate_block_size) = candidate_block_size_iterator.next() { - candidate_block_size_iterator.candidate_value = - match candidate_block_size { - MaybeAuto::Auto => block_size, - MaybeAuto::Specified(value) => value - }; + candidate_block_size_iterator.candidate_value = match candidate_block_size { + MaybeAuto::Auto => block_size, + MaybeAuto::Specified(value) => value, + }; } // Adjust `current_block_offset` as necessary to account for the explicitly-specified @@ -889,8 +987,11 @@ impl TableLikeFlow for BlockFlow { current_block_offset = current_block_offset + delta; // Take border, padding, and spacing into account. - let block_end_offset = self.fragment.border_padding.block_end + - if has_rows { block_direction_spacing } else { Au(0) }; + let block_end_offset = self.fragment.border_padding.block_end + if has_rows { + block_direction_spacing + } else { + Au(0) + }; current_block_offset = current_block_offset + block_end_offset; // Now that `current_block_offset` is at the block-end of the border box, compute the @@ -910,7 +1011,9 @@ impl TableLikeFlow for BlockFlow { } } - self.base.restyle_damage.remove(ServoRestyleDamage::REFLOW_OUT_OF_FLOW | ServoRestyleDamage::REFLOW); + self.base + .restyle_damage + .remove(ServoRestyleDamage::REFLOW_OUT_OF_FLOW | ServoRestyleDamage::REFLOW); } } @@ -937,7 +1040,7 @@ enum NextBlockCollapsedBorders<'a> { /// provides the Fragment for rowgroups if any struct TableRowAndGroupIterator<'a> { kids: FlowListIterator<'a>, - group: Option<(&'a Fragment, FlowListIterator<'a>)> + group: Option<(&'a Fragment, FlowListIterator<'a>)>, } impl<'a> TableRowAndGroupIterator<'a> { @@ -956,7 +1059,7 @@ impl<'a> Iterator for TableRowAndGroupIterator<'a> { // If we're inside a rowgroup, iterate through the rowgroup's children. if let Some(ref mut group) = self.group { if let Some(grandkid) = group.1.next() { - return Some((Some(group.0), grandkid.as_table_row())) + return Some((Some(group.0), grandkid.as_table_row())); } } // Otherwise, iterate through the table's children. @@ -973,8 +1076,8 @@ impl<'a> Iterator for TableRowAndGroupIterator<'a> { } else { self.next() // Skip children that are not rows or rowgroups } - } - None => None + }, + None => None, } } } @@ -983,7 +1086,7 @@ impl<'a> Iterator for TableRowAndGroupIterator<'a> { /// provides the Fragment for rowgroups if any struct MutTableRowAndGroupIterator<'a> { kids: MutFlowListIterator<'a>, - group: Option<(&'a Fragment, MutFlowListIterator<'a>)> + group: Option<(&'a Fragment, MutFlowListIterator<'a>)>, } impl<'a> MutTableRowAndGroupIterator<'a> { @@ -1002,7 +1105,7 @@ impl<'a> Iterator for MutTableRowAndGroupIterator<'a> { // If we're inside a rowgroup, iterate through the rowgroup's children. if let Some(ref mut group) = self.group { if let Some(grandkid) = group.1.next() { - return Some((Some(group.0), grandkid.as_mut_table_row())) + return Some((Some(group.0), grandkid.as_mut_table_row())); } } // Otherwise, iterate through the table's children. @@ -1019,8 +1122,8 @@ impl<'a> Iterator for MutTableRowAndGroupIterator<'a> { } else { self.next() // Skip children that are not rows or rowgroups } - } - None => None + }, + None => None, } } } @@ -1052,7 +1155,6 @@ struct TableCellStyleIterator<'table> { row_iterator: TableRowAndGroupIterator<'table>, row_info: Option<TableCellStyleIteratorRowInfo<'table>>, column_index: TableCellColumnIndexData, - } struct TableCellStyleIteratorRowInfo<'table> { @@ -1069,13 +1171,15 @@ impl<'table> TableCellStyleIterator<'table> { Some(TableCellStyleIteratorRowInfo { row: &row, rowgroup: group, - cell_iterator: row.block_flow.base.child_iter() + cell_iterator: row.block_flow.base.child_iter(), }) } else { None }; TableCellStyleIterator { - column_styles, row_iterator, row_info, + column_styles, + row_iterator, + row_info, column_index: Default::default(), } } @@ -1118,14 +1222,12 @@ impl TableCellColumnIndexData { fn advance(&mut self, amount: u32, column_styles: &[ColumnStyle]) { self.absolute += amount; self.relative_offset += amount; - if let Some(mut current_col) = - column_styles.get(self.relative as usize) { + if let Some(mut current_col) = column_styles.get(self.relative as usize) { while self.relative_offset >= current_col.span { // move to the next column self.relative += 1; self.relative_offset -= current_col.span; - if let Some(column_style) = - column_styles.get(self.relative as usize) { + if let Some(column_style) = column_styles.get(self.relative as usize) { current_col = column_style; } else { // we ran out of column_styles, @@ -1144,7 +1246,11 @@ impl<'table> Iterator for TableCellStyleIterator<'table> { // FIXME We do this awkward .take() followed by shoving it back in // because without NLL the row_info borrow lasts too long if let Some(mut row_info) = self.row_info.take() { - if let Some(rowspan) = row_info.row.incoming_rowspan.get(self.column_index.absolute as usize) { + if let Some(rowspan) = row_info + .row + .incoming_rowspan + .get(self.column_index.absolute as usize) + { // we are not allowed to use this column as a starting point. Try the next one. if *rowspan > 1 { self.column_index.advance(1, &self.column_styles); @@ -1159,9 +1265,14 @@ impl<'table> Iterator for TableCellStyleIterator<'table> { let row_style = row_info.row.block_flow.fragment.style(); let cell = cell.as_table_cell(); let (col_style, colgroup_style) = if let Some(column_style) = - self.column_styles.get(self.column_index.relative as usize) { - let styles = (column_style.col_style.clone(), column_style.colgroup_style.clone()); - self.column_index.advance(cell.column_span, &self.column_styles); + self.column_styles.get(self.column_index.relative as usize) + { + let styles = ( + column_style.col_style.clone(), + column_style.colgroup_style.clone(), + ); + self.column_index + .advance(cell.column_span, &self.column_styles); styles } else { @@ -1175,14 +1286,14 @@ impl<'table> Iterator for TableCellStyleIterator<'table> { col_style, rowgroup_style, row_style, - }) + }); } else { // next row if let Some((group, row)) = self.row_iterator.next() { self.row_info = Some(TableCellStyleIteratorRowInfo { row: &row, rowgroup: group, - cell_iterator: row.block_flow.base.child_iter() + cell_iterator: row.block_flow.base.child_iter(), }); self.column_index = Default::default(); self.next() @@ -1203,17 +1314,29 @@ impl<'table> TableCellStyleInfo<'table> { fn build_display_list(&self, mut state: &mut DisplayListBuildState) { use style::computed_values::visibility::T as Visibility; - if !self.cell.visible || self.cell.block_flow.fragment.style() - .get_inherited_box().visibility != Visibility::Visible { - return + if !self.cell.visible || + self.cell + .block_flow + .fragment + .style() + .get_inherited_box() + .visibility != + Visibility::Visible + { + return; } - let border_painting_mode = match self.cell.block_flow - .fragment - .style - .get_inherited_table() - .border_collapse { + let border_painting_mode = match self + .cell + .block_flow + .fragment + .style + .get_inherited_table() + .border_collapse + { border_collapse::T::Separate => BorderPaintingMode::Separate, - border_collapse::T::Collapse => BorderPaintingMode::Collapse(&self.cell.collapsed_borders), + border_collapse::T::Collapse => { + BorderPaintingMode::Collapse(&self.cell.collapsed_borders) + }, }; { let cell_flow = &self.cell.block_flow; @@ -1227,7 +1350,9 @@ impl<'table> TableCellStyleInfo<'table> { } let background_color = sty.resolve_color(background.background_color); cell_flow.build_display_list_for_background_if_applicable_with_background( - state, background, background_color + state, + background, + background_color, ); }; @@ -1243,6 +1368,8 @@ impl<'table> TableCellStyleInfo<'table> { build_dl(self.row_style, &mut state); } // the restyle damage will be set in TableCellFlow::build_display_list() - self.cell.block_flow.build_display_list_for_block_no_damage(state, border_painting_mode) + self.cell + .block_flow + .build_display_list_for_block_no_damage(state, border_painting_mode) } } |