From 00da1eb810d3aa2d2fc59abc57021b4a51aa4de3 Mon Sep 17 00:00:00 2001 From: George White Date: Fri, 3 Feb 2017 11:21:07 +0000 Subject: [PATCH] Add parsing/serialisation for 'grid-auto-flow' --- .../properties/longhand/position.mako.rs | 86 +++++++++++++++++++ tests/unit/style/parsing/position.rs | 25 ++++++ 2 files changed, 111 insertions(+) diff --git a/components/style/properties/longhand/position.mako.rs b/components/style/properties/longhand/position.mako.rs index fad896f3359..9c61a1dec90 100644 --- a/components/style/properties/longhand/position.mako.rs +++ b/components/style/properties/longhand/position.mako.rs @@ -322,3 +322,89 @@ ${helpers.predefined_type("object-position", products="gecko", boxed=True)} % endfor + +<%helpers:longhand name="grid-auto-flow" + spec="https://drafts.csswg.org/css-grid/#propdef-grid-auto-flow" + products="none" + animatable="False"> + use std::fmt; + use style_traits::ToCss; + use values::HasViewportPercentage; + use values::computed::ComputedValueAsSpecified; + + pub type SpecifiedValue = computed_value::T; + + pub mod computed_value { + #[derive(PartialEq, Clone, Eq, Copy, Debug)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + pub enum AutoFlow { + Row, + Column, + } + + #[derive(PartialEq, Clone, Eq, Copy, Debug)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + pub struct T { + pub autoflow: AutoFlow, + pub dense: bool, + } + } + + no_viewport_percentage!(SpecifiedValue); + impl ComputedValueAsSpecified for SpecifiedValue {} + + impl ToCss for computed_value::T { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + dest.write_str(match self.autoflow { + computed_value::AutoFlow::Column => "column", + computed_value::AutoFlow::Row => "row" + })?; + + if self.dense { dest.write_str(" dense")?; } + Ok(()) + } + } + + #[inline] + pub fn get_initial_value() -> computed_value::T { + computed_value::T { + autoflow: computed_value::AutoFlow::Row, + dense: false + } + } + + /// [ row | column ] || dense + pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { + use self::computed_value::AutoFlow; + + let mut value = None; + let mut dense = false; + + while !input.is_exhausted() { + match_ignore_ascii_case! { &input.expect_ident()?, + "row" if value.is_none() => { + value = Some(AutoFlow::Row); + continue + }, + "column" if value.is_none() => { + value = Some(AutoFlow::Column); + continue + }, + "dense" if !dense => { + dense = true; + continue + }, + _ => return Err(()) + } + } + + if value.is_some() || dense { + Ok(computed_value::T { + autoflow: value.unwrap_or(AutoFlow::Row), + dense: dense, + }) + } else { + Err(()) + } + } + diff --git a/tests/unit/style/parsing/position.rs b/tests/unit/style/parsing/position.rs index 817b8809969..8c56b323e67 100644 --- a/tests/unit/style/parsing/position.rs +++ b/tests/unit/style/parsing/position.rs @@ -142,3 +142,28 @@ fn test_vertical_position() { assert!(parse(VerticalPosition::parse, "left right").is_err()); assert!(parse(VerticalPosition::parse, "20px 30px").is_err()); } + +#[test] +fn test_grid_auto_flow() { + use style::properties::longhands::grid_auto_flow; + + assert_roundtrip_with_context!(grid_auto_flow::parse, "row dense", "row dense"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "dense row", "row dense"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "column dense", "column dense"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "dense column", "column dense"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "dense", "row dense"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "row", "row"); + assert_roundtrip_with_context!(grid_auto_flow::parse, "column", "column"); + + // Neither row, column or dense can be repeated + assert!(parse(grid_auto_flow::parse, "dense dense").is_err()); + assert!(parse(grid_auto_flow::parse, "row row").is_err()); + assert!(parse(grid_auto_flow::parse, "column column").is_err()); + assert!(parse(grid_auto_flow::parse, "row dense dense").is_err()); + assert!(parse(grid_auto_flow::parse, "column dense dense").is_err()); + + // Only row, column, dense idents are allowed + assert!(parse(grid_auto_flow::parse, "dense 1").is_err()); + assert!(parse(grid_auto_flow::parse, "column 'dense'").is_err()); + assert!(parse(grid_auto_flow::parse, "column 2px dense").is_err()); +}