mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
layout: Take percentage columns into account when sizing table grid min and max (#35167)
The specification doesn't say how to deal with percentages when determining the minimum and maximum size of a table grid, so follow the approach that Chromium uses. Essentially, figure out the "missing" percentage from the non-percentage columns and then use that to work backwards to fine the size of the percentage ones. This change is larger than one might expect, because this percentage approach shouldn't happen for tables that are descendants of a flex, grid or table container (except when there is an interceding absolute). We have to pass this information down when building the box tree. This will also make it easier to improve propagated text decorations in the future. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
d5fcc5a5d5
commit
6b04bc6263
26 changed files with 228 additions and 226 deletions
|
@ -33,6 +33,7 @@ pub use fragment_tree::FragmentTree;
|
|||
use geom::AuOrAuto;
|
||||
use style::logical_geometry::WritingMode;
|
||||
use style::properties::ComputedValues;
|
||||
use style::values::computed::TextDecorationLine;
|
||||
|
||||
use crate::geom::{LogicalVec2, SizeConstraint};
|
||||
use crate::style_ext::AspectRatio;
|
||||
|
@ -140,3 +141,46 @@ impl<'a> From<&'_ DefiniteContainingBlock<'a>> for ContainingBlock<'a> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Data that is propagated from ancestors to descendants during [`crate::flow::BoxTree`]
|
||||
/// construction. This allows data to flow in the reverse direction of the typical layout
|
||||
/// propoagation, but only during `BoxTree` construction.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
struct PropagatedBoxTreeData {
|
||||
text_decoration: TextDecorationLine,
|
||||
allow_percentage_column_in_tables: bool,
|
||||
}
|
||||
|
||||
impl Default for PropagatedBoxTreeData {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
text_decoration: Default::default(),
|
||||
allow_percentage_column_in_tables: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PropagatedBoxTreeData {
|
||||
pub(crate) fn union(&self, style: &ComputedValues) -> Self {
|
||||
Self {
|
||||
// FIXME(#31736): This is only taking into account the line style and not the decoration
|
||||
// color. This should collect information about both so that they can be rendered properly.
|
||||
text_decoration: self.text_decoration | style.clone_text_decoration_line(),
|
||||
allow_percentage_column_in_tables: self.allow_percentage_column_in_tables,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn without_text_decorations(&self) -> Self {
|
||||
Self {
|
||||
text_decoration: TextDecorationLine::NONE,
|
||||
allow_percentage_column_in_tables: self.allow_percentage_column_in_tables,
|
||||
}
|
||||
}
|
||||
|
||||
fn disallowing_percentage_table_columns(&self) -> PropagatedBoxTreeData {
|
||||
Self {
|
||||
text_decoration: self.text_decoration,
|
||||
allow_percentage_column_in_tables: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue