servo: Merge #16024 - Add parsing/serialisation for 'grid-auto-flow' (from Wafflespeanut:gal); r=Wafflespeanut

Didn't want the work (and review comments) in #15364 to go wasted. Fixes #15313

Source-Repo: https://github.com/servo/servo
Source-Revision: e2aecc3ed7c66a49f2baf13c16e56c3fb6c990cd

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 157c24b0bdf2883b27c8fbf00a0eb95c705794b0
This commit is contained in:
George White 2017-03-18 11:25:03 -07:00
Родитель e6c42c1a7b
Коммит 02a7a5d571
2 изменённых файлов: 111 добавлений и 0 удалений

Просмотреть файл

@ -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<W>(&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<SpecifiedValue, ()> {
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(())
}
}
</%helpers:longhand>

Просмотреть файл

@ -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());
}