зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
e6c42c1a7b
Коммит
02a7a5d571
|
@ -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());
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче