diff options
-rw-r--r-- | components/style/properties/gecko.mako.rs | 32 | ||||
-rw-r--r-- | components/style/properties/longhand/box.mako.rs | 3 | ||||
-rw-r--r-- | components/style/properties/longhand/position.mako.rs | 12 | ||||
-rw-r--r-- | components/style/values/computed/mod.rs | 2 | ||||
-rw-r--r-- | components/style/values/specified/grid.rs | 96 | ||||
-rw-r--r-- | components/style/values/specified/mod.rs | 2 |
6 files changed, 142 insertions, 5 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 1fb133f92fd..0c9212e2a11 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -5,7 +5,7 @@ // `data` comes from components/style/properties.mako.rs; see build.rs for more details. <%! - from data import to_rust_ident + from data import to_rust_ident, to_camel_case from data import Keyword %> <%namespace name="helpers" file="/helpers.mako.rs" /> @@ -631,8 +631,15 @@ class Corner(object): self.x_index = 2 * index self.y_index = 2 * index + 1 +class GridLine(object): + def __init__(self, name): + self.ident = "grid-" + name.lower() + self.name = self.ident.replace('-', '_') + self.gecko = "m" + to_camel_case(self.ident) + SIDES = [Side("Top", 0), Side("Right", 1), Side("Bottom", 2), Side("Left", 3)] CORNERS = [Corner("TOP_LEFT", 0), Corner("TOP_RIGHT", 1), Corner("BOTTOM_RIGHT", 2), Corner("BOTTOM_LEFT", 3)] +GRID_LINES = map(GridLine, ["row-start", "row-end", "column-start", "column-end"]) %> #[allow(dead_code)] @@ -822,7 +829,7 @@ fn static_assert() { % endfor </%self:impl_trait> -<% skip_position_longhands = " ".join(x.ident for x in SIDES) %> +<% skip_position_longhands = " ".join(x.ident for x in SIDES + GRID_LINES) %> <%self:impl_trait style_struct_name="Position" skip_longhands="${skip_position_longhands} z-index box-sizing order"> @@ -884,6 +891,27 @@ fn static_assert() { ${impl_simple_copy('order', 'mOrder')} + % for value in GRID_LINES: + pub fn set_${value.name}(&mut self, v: longhands::${value.name}::computed_value::T) { + use nsstring::nsCString; + use gecko_bindings::structs::{nsStyleGridLine_kMinLine, nsStyleGridLine_kMaxLine}; + + let ident = v.ident.unwrap_or(String::new()); + self.gecko.${value.gecko}.mLineName.assign_utf8(&nsCString::from(&*ident)); + self.gecko.${value.gecko}.mHasSpan = v.is_span; + self.gecko.${value.gecko}.mInteger = v.integer.map(|i| { + // clamping the integer between a range + cmp::max(nsStyleGridLine_kMinLine, cmp::min(i, nsStyleGridLine_kMaxLine)) + }).unwrap_or(0); + } + + pub fn copy_${value.name}_from(&mut self, other: &Self) { + self.gecko.${value.gecko}.mHasSpan = other.gecko.${value.gecko}.mHasSpan; + self.gecko.${value.gecko}.mInteger = other.gecko.${value.gecko}.mInteger; + self.gecko.${value.gecko}.mLineName.assign(&other.gecko.${value.gecko}.mLineName); + } + % endfor + </%self:impl_trait> <% skip_outline_longhands = " ".join("outline-style outline-width".split() + diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index 818ed9316e1..dd51bb5b3d3 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -18,8 +18,7 @@ values = """inline block inline-block table inline-table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption - list-item flex - none + list-item flex none """.split() if product == "gecko": values += """inline-flex grid inline-grid ruby ruby-base ruby-base-container diff --git a/components/style/properties/longhand/position.mako.rs b/components/style/properties/longhand/position.mako.rs index 529dce1e9d0..f025e658c5b 100644 --- a/components/style/properties/longhand/position.mako.rs +++ b/components/style/properties/longhand/position.mako.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +<%! from data import to_rust_ident %> <%namespace name="helpers" file="/helpers.mako.rs" /> <% from data import ALL_SIZES, PHYSICAL_SIDES, LOGICAL_SIDES %> @@ -180,3 +181,14 @@ ${helpers.single_keyword("box-sizing", // https://drafts.csswg.org/css-images-3/ ${helpers.single_keyword("object-fit", "fill contain cover none scale-down", products="gecko", animatable=False)} + +// https://drafts.csswg.org/css-grid/#propdef-grid-row-start +<% grid_longhands = ["grid-row-start", "grid-row-end", "grid-column-start", "grid-column-end"] %> + +% for longhand in grid_longhands: + ${helpers.predefined_type("%s" % longhand, + "GridLine", + "Default::default()", + animatable=False, + products="gecko")} +% endfor diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 6d77bf74c80..8a31d59ce10 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -14,7 +14,7 @@ pub use cssparser::Color as CSSColor; pub use self::image::{EndingShape as GradientShape, Gradient, GradientKind, Image}; pub use self::image::{LengthOrKeyword, LengthOrPercentageOrKeyword}; pub use super::{Either, None_}; -pub use super::specified::{Angle, BorderStyle, Time, UrlOrNone}; +pub use super::specified::{Angle, BorderStyle, GridLine, Time, UrlOrNone}; pub use super::specified::url::UrlExtraData; pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNumber, LengthOrPercentage, LengthOrPercentageOrAuto}; pub use self::length::{LengthOrPercentageOrAutoOrContent, LengthOrPercentageOrNone, LengthOrNone}; diff --git a/components/style/values/specified/grid.rs b/components/style/values/specified/grid.rs new file mode 100644 index 00000000000..8e6eca56372 --- /dev/null +++ b/components/style/values/specified/grid.rs @@ -0,0 +1,96 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use cssparser::Parser; +use parser::{Parse, ParserContext}; +use std::fmt; +use style_traits::ToCss; +use values::NoViewportPercentage; +use values::computed::ComputedValueAsSpecified; + +// https://drafts.csswg.org/css-grid/#typedef-grid-row-start-grid-line +#[derive(PartialEq, Clone, Debug)] +#[cfg_attr(feature = "servo", derive(HeapSizeOf))] +pub struct GridLine { + pub is_span: bool, + pub ident: Option<String>, + pub integer: Option<i32>, +} + +impl Default for GridLine { + fn default() -> Self { + GridLine { + is_span: false, + ident: None, + integer: None, + } + } +} + +impl ToCss for GridLine { + fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + if !self.is_span && self.ident.is_none() && self.integer.is_none() { + return dest.write_str("auto") + } + + if self.is_span { + try!(dest.write_str("span")); + } + + if let Some(i) = self.integer { + try!(write!(dest, " {}", i)); + } + + if let Some(ref s) = self.ident { + try!(write!(dest, " {}", s)); + } + + Ok(()) + } +} + +impl Parse for GridLine { + fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ()> { + let mut grid_line = Default::default(); + if input.try(|i| i.expect_ident_matching("auto")).is_ok() { + return Ok(grid_line) + } + + for _ in 0..3 { // Maximum possible entities for <grid-line> + if input.try(|i| i.expect_ident_matching("span")).is_ok() { + if grid_line.is_span { + return Err(()) + } + grid_line.is_span = true; + } else if let Ok(i) = input.try(|i| i.expect_integer()) { + if i == 0 || grid_line.integer.is_some() { + return Err(()) + } + grid_line.integer = Some(i); + } else if let Ok(name) = input.try(|i| i.expect_ident()) { + if grid_line.ident.is_some() { + return Err(()) + } + grid_line.ident = Some(name.into_owned()); + } else { + break + } + } + + if grid_line.is_span { + if let Some(i) = grid_line.integer { + if i < 0 { // disallow negative integers for grid spans + return Err(()) + } + } else { + grid_line.integer = Some(1); + } + } + + Ok(grid_line) + } +} + +impl ComputedValueAsSpecified for GridLine {} +impl NoViewportPercentage for GridLine {} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 68caac3f7c4..3b0dd2011b3 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -16,6 +16,7 @@ use super::{CSSFloat, HasViewportPercentage, NoViewportPercentage, Either, None_ use super::computed::{ComputedValueAsSpecified, Context, ToComputedValue}; use super::computed::Shadow as ComputedShadow; +pub use self::grid::GridLine; pub use self::image::{AngleOrCorner, ColorStop, EndingShape as GradientEndingShape, Gradient}; pub use self::image::{GradientKind, HorizontalDirection, Image, LengthOrKeyword, LengthOrPercentageOrKeyword}; pub use self::image::{SizeKeyword, VerticalDirection}; @@ -24,6 +25,7 @@ pub use self::length::{Percentage, LengthOrNone, LengthOrNumber, LengthOrPercent pub use self::length::{LengthOrPercentageOrNone, LengthOrPercentageOrAutoOrContent, CalcUnit}; pub mod basic_shape; +pub mod grid; pub mod image; pub mod length; pub mod position; |