aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-12-16 14:23:40 -0800
committerGitHub <noreply@github.com>2016-12-16 14:23:40 -0800
commit71b68ea0dec10a8e71a9f080d7d7ff382d8f0127 (patch)
treed51bff64238bef1bf3e066eafe8b40486a321ffd
parent6efea399ed0e44fe6bd151f346ca2c3371e2f66c (diff)
parent6d9aed9ac3c1f3cf6f2eca12d8a00e017d112ef8 (diff)
downloadservo-71b68ea0dec10a8e71a9f080d7d7ff382d8f0127.tar.gz
servo-71b68ea0dec10a8e71a9f080d7d7ff382d8f0127.zip
Auto merge of #14000 - Wafflespeanut:grid, r=Manishearth
Stylo: Basic support for grid-{row,column}-{start,end} <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build-geckolib` does not report any errors - [x] `./mach test-tidy` does not report any errors <!-- Either: --> - [ ] There are tests for these changes <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14000) <!-- Reviewable:end -->
-rw-r--r--components/style/properties/gecko.mako.rs32
-rw-r--r--components/style/properties/longhand/box.mako.rs3
-rw-r--r--components/style/properties/longhand/position.mako.rs12
-rw-r--r--components/style/values/computed/mod.rs2
-rw-r--r--components/style/values/specified/grid.rs96
-rw-r--r--components/style/values/specified/mod.rs2
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;