aboutsummaryrefslogtreecommitdiffstats
path: root/components/style
diff options
context:
space:
mode:
authorDavid Zbarsky <dzbarsky@gmail.com>2015-08-13 14:33:21 -0400
committerDavid Zbarsky <dzbarsky@gmail.com>2015-08-26 14:14:56 -0700
commit6573e8088ca2a4017553faff8190cc847db59d09 (patch)
tree6f4187924e69ae3ab9247fed1ea26aac04c6398d /components/style
parentcfa1e467f16e2cb8667362e21145ded6b1eca0aa (diff)
downloadservo-6573e8088ca2a4017553faff8190cc847db59d09.tar.gz
servo-6573e8088ca2a4017553faff8190cc847db59d09.zip
Properly serialize % values in calc expressions
Diffstat (limited to 'components/style')
-rw-r--r--components/style/properties.mako.rs31
-rw-r--r--components/style/values.rs52
-rw-r--r--components/style/viewport.rs2
3 files changed, 46 insertions, 39 deletions
diff --git a/components/style/properties.mako.rs b/components/style/properties.mako.rs
index 1ec5b97bd2c..2df2e339939 100644
--- a/components/style/properties.mako.rs
+++ b/components/style/properties.mako.rs
@@ -1912,7 +1912,7 @@ pub mod longhands {
.map(|value| match value {
specified::LengthOrPercentage::Length(value) => value,
specified::LengthOrPercentage::Percentage(value) =>
- specified::Length::FontRelative(specified::FontRelativeLength::Em(value)),
+ specified::Length::FontRelative(specified::FontRelativeLength::Em(value.0)),
// FIXME(dzbarsky) handle calc for font-size
specified::LengthOrPercentage::Calc(_) =>
specified::Length::FontRelative(specified::FontRelativeLength::Em(1.)),
@@ -3986,6 +3986,7 @@ pub mod longhands {
}
pub fn parse_origin(_: &ParserContext, input: &mut Parser) -> Result<OriginParseResult,()> {
+ use values::specified::{LengthOrPercentage, Percentage};
let (mut horizontal, mut vertical, mut depth) = (None, None, None);
loop {
if let Err(_) = input.try(|input| {
@@ -3994,37 +3995,37 @@ pub mod longhands {
token,
"left" => {
if horizontal.is_none() {
- horizontal = Some(specified::LengthOrPercentage::Percentage(0.0))
+ horizontal = Some(LengthOrPercentage::Percentage(Percentage(0.0)))
} else {
return Err(())
}
},
"center" => {
if horizontal.is_none() {
- horizontal = Some(specified::LengthOrPercentage::Percentage(0.5))
+ horizontal = Some(LengthOrPercentage::Percentage(Percentage(0.5)))
} else if vertical.is_none() {
- vertical = Some(specified::LengthOrPercentage::Percentage(0.5))
+ vertical = Some(LengthOrPercentage::Percentage(Percentage(0.5)))
} else {
return Err(())
}
},
"right" => {
if horizontal.is_none() {
- horizontal = Some(specified::LengthOrPercentage::Percentage(1.0))
+ horizontal = Some(LengthOrPercentage::Percentage(Percentage(1.0)))
} else {
return Err(())
}
},
"top" => {
if vertical.is_none() {
- vertical = Some(specified::LengthOrPercentage::Percentage(0.0))
+ vertical = Some(LengthOrPercentage::Percentage(Percentage(0.0)))
} else {
return Err(())
}
},
"bottom" => {
if vertical.is_none() {
- vertical = Some(specified::LengthOrPercentage::Percentage(1.0))
+ vertical = Some(LengthOrPercentage::Percentage(Percentage(1.0)))
} else {
return Err(())
}
@@ -4033,13 +4034,13 @@ pub mod longhands {
}
Ok(())
}) {
- match specified::LengthOrPercentage::parse(input) {
+ match LengthOrPercentage::parse(input) {
Ok(value) => {
if horizontal.is_none() {
horizontal = Some(value);
} else if vertical.is_none() {
vertical = Some(value);
- } else if let specified::LengthOrPercentage::Length(length) = value {
+ } else if let LengthOrPercentage::Length(length) = value {
depth = Some(length);
} else {
break;
@@ -4067,7 +4068,7 @@ pub mod longhands {
<%self:longhand name="transform-origin">
use values::computed::Context;
- use values::specified::{Length, LengthOrPercentage};
+ use values::specified::{Length, LengthOrPercentage, Percentage};
use cssparser::ToCss;
use std::fmt;
@@ -4123,8 +4124,8 @@ pub mod longhands {
pub fn parse(context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue,()> {
let result = try!(super::parse_origin(context, input));
Ok(SpecifiedValue {
- horizontal: result.horizontal.unwrap_or(LengthOrPercentage::Percentage(0.5)),
- vertical: result.vertical.unwrap_or(LengthOrPercentage::Percentage(0.5)),
+ horizontal: result.horizontal.unwrap_or(LengthOrPercentage::Percentage(Percentage(0.5))),
+ vertical: result.vertical.unwrap_or(LengthOrPercentage::Percentage(Percentage(0.5))),
depth: result.depth.unwrap_or(Length::Absolute(Au(0))),
})
}
@@ -4149,7 +4150,7 @@ pub mod longhands {
<%self:longhand name="perspective-origin">
use values::computed::Context;
- use values::specified::LengthOrPercentage;
+ use values::specified::{LengthOrPercentage, Percentage};
use cssparser::ToCss;
use std::fmt;
@@ -4199,8 +4200,8 @@ pub mod longhands {
match result.depth {
Some(_) => Err(()),
None => Ok(SpecifiedValue {
- horizontal: result.horizontal.unwrap_or(LengthOrPercentage::Percentage(0.5)),
- vertical: result.vertical.unwrap_or(LengthOrPercentage::Percentage(0.5)),
+ horizontal: result.horizontal.unwrap_or(LengthOrPercentage::Percentage(Percentage(0.5))),
+ vertical: result.vertical.unwrap_or(LengthOrPercentage::Percentage(Percentage(0.5))),
})
}
}
diff --git a/components/style/values.rs b/components/style/values.rs
index 70ec4c46901..76f34f69941 100644
--- a/components/style/values.rs
+++ b/components/style/values.rs
@@ -387,7 +387,7 @@ pub mod specified {
pub em: Option<FontRelativeLength>,
pub ex: Option<FontRelativeLength>,
pub rem: Option<FontRelativeLength>,
- pub percentage: Option<CSSFloat>,
+ pub percentage: Option<Percentage>,
}
impl Calc {
fn parse_sum(input: &mut Parser) -> Result<CalcSumNode, ()> {
@@ -603,7 +603,7 @@ pub mod specified {
em: em.map(FontRelativeLength::Em),
ex: ex.map(FontRelativeLength::Ex),
rem: rem.map(FontRelativeLength::Rem),
- percentage: percentage,
+ percentage: percentage.map(Percentage),
})
}
}
@@ -660,9 +660,18 @@ pub mod specified {
}
#[derive(Clone, PartialEq, Copy, Debug, HeapSizeOf)]
+ pub struct Percentage(pub CSSFloat); // [0 .. 100%] maps to [0.0 .. 1.0]
+
+ impl ToCss for Percentage {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ write!(dest, "{}%", self.0 * 100.)
+ }
+ }
+
+ #[derive(Clone, PartialEq, Copy, Debug, HeapSizeOf)]
pub enum LengthOrPercentage {
Length(Length),
- Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0]
+ Percentage(Percentage),
Calc(Calc),
}
@@ -670,8 +679,7 @@ pub mod specified {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
match self {
&LengthOrPercentage::Length(length) => length.to_css(dest),
- &LengthOrPercentage::Percentage(percentage)
- => write!(dest, "{}%", percentage * 100.),
+ &LengthOrPercentage::Percentage(percentage) => percentage.to_css(dest),
&LengthOrPercentage::Calc(calc) => calc.to_css(dest),
}
}
@@ -688,7 +696,7 @@ pub mod specified {
Token::Dimension(ref value, ref unit) if context.is_ok(value.value) =>
Length::parse_dimension(value.value, unit).map(LengthOrPercentage::Length),
Token::Percentage(ref value) if context.is_ok(value.unit_value) =>
- Ok(LengthOrPercentage::Percentage(value.unit_value)),
+ Ok(LengthOrPercentage::Percentage(Percentage(value.unit_value))),
Token::Number(ref value) if value.value == 0. =>
Ok(LengthOrPercentage::Length(Length::Absolute(Au(0)))),
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {
@@ -712,7 +720,7 @@ pub mod specified {
#[derive(Clone, PartialEq, Copy, Debug, HeapSizeOf)]
pub enum LengthOrPercentageOrAuto {
Length(Length),
- Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0]
+ Percentage(Percentage),
Auto,
Calc(Calc),
}
@@ -721,8 +729,7 @@ pub mod specified {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
match self {
&LengthOrPercentageOrAuto::Length(length) => length.to_css(dest),
- &LengthOrPercentageOrAuto::Percentage(percentage)
- => write!(dest, "{}%", percentage * 100.),
+ &LengthOrPercentageOrAuto::Percentage(percentage) => percentage.to_css(dest),
&LengthOrPercentageOrAuto::Auto => dest.write_str("auto"),
&LengthOrPercentageOrAuto::Calc(calc) => calc.to_css(dest),
}
@@ -737,7 +744,7 @@ pub mod specified {
Token::Dimension(ref value, ref unit) if context.is_ok(value.value) =>
Length::parse_dimension(value.value, unit).map(LengthOrPercentageOrAuto::Length),
Token::Percentage(ref value) if context.is_ok(value.unit_value) =>
- Ok(LengthOrPercentageOrAuto::Percentage(value.unit_value)),
+ Ok(LengthOrPercentageOrAuto::Percentage(Percentage(value.unit_value))),
Token::Number(ref value) if value.value == 0. =>
Ok(LengthOrPercentageOrAuto::Length(Length::Absolute(Au(0)))),
Token::Ident(ref value) if value.eq_ignore_ascii_case("auto") =>
@@ -762,7 +769,7 @@ pub mod specified {
#[derive(Clone, PartialEq, Copy, Debug, HeapSizeOf)]
pub enum LengthOrPercentageOrNone {
Length(Length),
- Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0]
+ Percentage(Percentage),
None,
}
@@ -770,8 +777,7 @@ pub mod specified {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
match self {
&LengthOrPercentageOrNone::Length(length) => length.to_css(dest),
- &LengthOrPercentageOrNone::Percentage(percentage) =>
- write!(dest, "{}%", percentage * 100.),
+ &LengthOrPercentageOrNone::Percentage(percentage) => percentage.to_css(dest),
&LengthOrPercentageOrNone::None => dest.write_str("none"),
}
}
@@ -784,7 +790,7 @@ pub mod specified {
Token::Dimension(ref value, ref unit) if context.is_ok(value.value) =>
Length::parse_dimension(value.value, unit).map(LengthOrPercentageOrNone::Length),
Token::Percentage(ref value) if context.is_ok(value.unit_value) =>
- Ok(LengthOrPercentageOrNone::Percentage(value.unit_value)),
+ Ok(LengthOrPercentageOrNone::Percentage(Percentage(value.unit_value))),
Token::Number(ref value) if value.value == 0. =>
Ok(LengthOrPercentageOrNone::Length(Length::Absolute(Au(0)))),
Token::Ident(ref value) if value.eq_ignore_ascii_case("none") =>
@@ -846,7 +852,7 @@ pub mod specified {
#[derive(Clone, PartialEq, Copy)]
pub enum PositionComponent {
Length(Length),
- Percentage(CSSFloat), // [0 .. 100%] maps to [0.0 .. 1.0]
+ Percentage(Percentage),
Center,
Left,
Right,
@@ -861,7 +867,7 @@ pub mod specified {
.map(PositionComponent::Length)
}
Token::Percentage(ref value) => {
- Ok(PositionComponent::Percentage(value.unit_value))
+ Ok(PositionComponent::Percentage(Percentage(value.unit_value)))
}
Token::Number(ref value) if value.value == 0. => {
Ok(PositionComponent::Length(Length::Absolute(Au(0))))
@@ -884,11 +890,11 @@ pub mod specified {
match self {
PositionComponent::Length(x) => LengthOrPercentage::Length(x),
PositionComponent::Percentage(x) => LengthOrPercentage::Percentage(x),
- PositionComponent::Center => LengthOrPercentage::Percentage(0.5),
+ PositionComponent::Center => LengthOrPercentage::Percentage(Percentage(0.5)),
PositionComponent::Left |
- PositionComponent::Top => LengthOrPercentage::Percentage(0.0),
+ PositionComponent::Top => LengthOrPercentage::Percentage(Percentage(0.0)),
PositionComponent::Right |
- PositionComponent::Bottom => LengthOrPercentage::Percentage(1.0),
+ PositionComponent::Bottom => LengthOrPercentage::Percentage(Percentage(1.0)),
}
}
}
@@ -1305,7 +1311,7 @@ pub mod computed {
}
}
- Calc { length: length, percentage: self.percentage }
+ Calc { length: length, percentage: self.percentage.map(|p| p.0) }
}
}
@@ -1342,7 +1348,7 @@ pub mod computed {
LengthOrPercentage::Length(value.to_computed_value(context))
}
specified::LengthOrPercentage::Percentage(value) => {
- LengthOrPercentage::Percentage(value)
+ LengthOrPercentage::Percentage(value.0)
}
specified::LengthOrPercentage::Calc(calc) => {
LengthOrPercentage::Calc(calc.to_computed_value(context))
@@ -1390,7 +1396,7 @@ pub mod computed {
LengthOrPercentageOrAuto::Length(value.to_computed_value(context))
}
specified::LengthOrPercentageOrAuto::Percentage(value) => {
- LengthOrPercentageOrAuto::Percentage(value)
+ LengthOrPercentageOrAuto::Percentage(value.0)
}
specified::LengthOrPercentageOrAuto::Auto => {
LengthOrPercentageOrAuto::Auto
@@ -1440,7 +1446,7 @@ pub mod computed {
LengthOrPercentageOrNone::Length(value.to_computed_value(context))
}
specified::LengthOrPercentageOrNone::Percentage(value) => {
- LengthOrPercentageOrNone::Percentage(value)
+ LengthOrPercentageOrNone::Percentage(value.0)
}
specified::LengthOrPercentageOrNone::None => {
LengthOrPercentageOrNone::None
diff --git a/components/style/viewport.rs b/components/style/viewport.rs
index cc56030e226..247cd6400ae 100644
--- a/components/style/viewport.rs
+++ b/components/style/viewport.rs
@@ -451,7 +451,7 @@ impl ViewportConstraints {
LengthOrPercentageOrAuto::Length(value) =>
Some(value.to_computed_value(&context)),
LengthOrPercentageOrAuto::Percentage(value) =>
- Some(initial_viewport.$dimension.scale_by(value)),
+ Some(initial_viewport.$dimension.scale_by(value.0)),
LengthOrPercentageOrAuto::Auto => None,
LengthOrPercentageOrAuto::Calc(calc) => {
let calc = calc.to_computed_value(&context);