mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
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 -->
This commit is contained in:
commit
71b68ea0de
6 changed files with 142 additions and 5 deletions
|
@ -5,7 +5,7 @@
|
||||||
// `data` comes from components/style/properties.mako.rs; see build.rs for more details.
|
// `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
|
from data import Keyword
|
||||||
%>
|
%>
|
||||||
<%namespace name="helpers" file="/helpers.mako.rs" />
|
<%namespace name="helpers" file="/helpers.mako.rs" />
|
||||||
|
@ -631,8 +631,15 @@ class Corner(object):
|
||||||
self.x_index = 2 * index
|
self.x_index = 2 * index
|
||||||
self.y_index = 2 * index + 1
|
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)]
|
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)]
|
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)]
|
#[allow(dead_code)]
|
||||||
|
@ -822,7 +829,7 @@ fn static_assert() {
|
||||||
% endfor
|
% endfor
|
||||||
</%self:impl_trait>
|
</%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"
|
<%self:impl_trait style_struct_name="Position"
|
||||||
skip_longhands="${skip_position_longhands} z-index box-sizing order">
|
skip_longhands="${skip_position_longhands} z-index box-sizing order">
|
||||||
|
|
||||||
|
@ -884,6 +891,27 @@ fn static_assert() {
|
||||||
|
|
||||||
${impl_simple_copy('order', 'mOrder')}
|
${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>
|
</%self:impl_trait>
|
||||||
|
|
||||||
<% skip_outline_longhands = " ".join("outline-style outline-width".split() +
|
<% skip_outline_longhands = " ".join("outline-style outline-width".split() +
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
values = """inline block inline-block
|
values = """inline block inline-block
|
||||||
table inline-table table-row-group table-header-group table-footer-group
|
table inline-table table-row-group table-header-group table-footer-group
|
||||||
table-row table-column-group table-column table-cell table-caption
|
table-row table-column-group table-column table-cell table-caption
|
||||||
list-item flex
|
list-item flex none
|
||||||
none
|
|
||||||
""".split()
|
""".split()
|
||||||
if product == "gecko":
|
if product == "gecko":
|
||||||
values += """inline-flex grid inline-grid ruby ruby-base ruby-base-container
|
values += """inline-flex grid inline-grid ruby ruby-base ruby-base-container
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* 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" />
|
<%namespace name="helpers" file="/helpers.mako.rs" />
|
||||||
<% from data import ALL_SIZES, PHYSICAL_SIDES, LOGICAL_SIDES %>
|
<% 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/
|
// https://drafts.csswg.org/css-images-3/
|
||||||
${helpers.single_keyword("object-fit", "fill contain cover none scale-down",
|
${helpers.single_keyword("object-fit", "fill contain cover none scale-down",
|
||||||
products="gecko", animatable=False)}
|
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
|
||||||
|
|
|
@ -14,7 +14,7 @@ pub use cssparser::Color as CSSColor;
|
||||||
pub use self::image::{EndingShape as GradientShape, Gradient, GradientKind, Image};
|
pub use self::image::{EndingShape as GradientShape, Gradient, GradientKind, Image};
|
||||||
pub use self::image::{LengthOrKeyword, LengthOrPercentageOrKeyword};
|
pub use self::image::{LengthOrKeyword, LengthOrPercentageOrKeyword};
|
||||||
pub use super::{Either, None_};
|
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 super::specified::url::UrlExtraData;
|
||||||
pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNumber, LengthOrPercentage, LengthOrPercentageOrAuto};
|
pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNumber, LengthOrPercentage, LengthOrPercentageOrAuto};
|
||||||
pub use self::length::{LengthOrPercentageOrAutoOrContent, LengthOrPercentageOrNone, LengthOrNone};
|
pub use self::length::{LengthOrPercentageOrAutoOrContent, LengthOrPercentageOrNone, LengthOrNone};
|
||||||
|
|
96
components/style/values/specified/grid.rs
Normal file
96
components/style/values/specified/grid.rs
Normal file
|
@ -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 {}
|
|
@ -16,6 +16,7 @@ use super::{CSSFloat, HasViewportPercentage, NoViewportPercentage, Either, None_
|
||||||
use super::computed::{ComputedValueAsSpecified, Context, ToComputedValue};
|
use super::computed::{ComputedValueAsSpecified, Context, ToComputedValue};
|
||||||
use super::computed::Shadow as ComputedShadow;
|
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::{AngleOrCorner, ColorStop, EndingShape as GradientEndingShape, Gradient};
|
||||||
pub use self::image::{GradientKind, HorizontalDirection, Image, LengthOrKeyword, LengthOrPercentageOrKeyword};
|
pub use self::image::{GradientKind, HorizontalDirection, Image, LengthOrKeyword, LengthOrPercentageOrKeyword};
|
||||||
pub use self::image::{SizeKeyword, VerticalDirection};
|
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 use self::length::{LengthOrPercentageOrNone, LengthOrPercentageOrAutoOrContent, CalcUnit};
|
||||||
|
|
||||||
pub mod basic_shape;
|
pub mod basic_shape;
|
||||||
|
pub mod grid;
|
||||||
pub mod image;
|
pub mod image;
|
||||||
pub mod length;
|
pub mod length;
|
||||||
pub mod position;
|
pub mod position;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue