diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-01-17 02:18:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-17 02:18:15 -0800 |
commit | a70af60eec11fa0a19cfd889c56b09dc834b35af (patch) | |
tree | ce932f5d35ed2fef822a6f2baf0791657cc42ac0 | |
parent | 363f590019e495fffab0cc0fa0464e05d2fc96e8 (diff) | |
parent | 3ac73edf6665342a3249a8b82f5ae572c46be1ed (diff) | |
download | servo-a70af60eec11fa0a19cfd889c56b09dc834b35af.tar.gz servo-a70af60eec11fa0a19cfd889c56b09dc834b35af.zip |
Auto merge of #15063 - Wafflespeanut:calc, r=heycam
Cleaning up CalcLengthOrPercentage
<!-- Please describe your changes on the following line: -->
We don't really need enum variants in `CalcLengthOrPercentage`. Given that we already have the information (whether it's `vw`, `ch`, etc.) in the struct fields, we could just store `Option<CSSFloat>` there, and modify our `ToCss` implementation a bit.
cc #15061
r? @Manishearth or anyone interested
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
<!-- Either: -->
- [x] These changes do not require tests because it's a refactor
<!-- 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/15063)
<!-- Reviewable:end -->
-rw-r--r-- | components/style/values/computed/length.rs | 15 | ||||
-rw-r--r-- | components/style/values/specified/length.rs | 79 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/calc.html | 4 |
3 files changed, 60 insertions, 38 deletions
diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 5ff6b5f0c46..9268f5748dd 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -10,6 +10,7 @@ use std::fmt; use style_traits::ToCss; use super::{Number, ToComputedValue, Context}; use values::{Auto, CSSFloat, Either, None_, Normal, specified}; +use values::specified::length::{FontRelativeLength, ViewportPercentageLength}; pub use cssparser::Color as CSSColor; pub use super::image::{EndingShape as GradientShape, Gradient, GradientKind, Image}; @@ -105,13 +106,19 @@ impl ToComputedValue for specified::CalcLengthOrPercentage { length += absolute; } - for val in &[self.vw, self.vh, self.vmin, self.vmax] { + for val in &[self.vw.map(ViewportPercentageLength::Vw), + self.vh.map(ViewportPercentageLength::Vh), + self.vmin.map(ViewportPercentageLength::Vmin), + self.vmax.map(ViewportPercentageLength::Vmax)] { if let Some(val) = *val { length += val.to_computed_value(context.viewport_size()); } } - for val in &[self.ch, self.em, self.ex, self.rem] { + for val in &[self.ch.map(FontRelativeLength::Ch), + self.em.map(FontRelativeLength::Em), + self.ex.map(FontRelativeLength::Ex), + self.rem.map(FontRelativeLength::Rem)] { if let Some(val) = *val { length += val.to_computed_value(context, /* use inherited */ false); } @@ -119,7 +126,7 @@ impl ToComputedValue for specified::CalcLengthOrPercentage { CalcLengthOrPercentage { length: length, - percentage: self.percentage.map(|p| p.0), + percentage: self.percentage, } } @@ -127,7 +134,7 @@ impl ToComputedValue for specified::CalcLengthOrPercentage { fn from_computed_value(computed: &CalcLengthOrPercentage) -> Self { specified::CalcLengthOrPercentage { absolute: Some(computed.length), - percentage: computed.percentage.map(specified::Percentage), + percentage: computed.percentage, ..Default::default() } } diff --git a/components/style/values/specified/length.rs b/components/style/values/specified/length.rs index b86038eb19a..24f5563c2b9 100644 --- a/components/style/values/specified/length.rs +++ b/components/style/values/specified/length.rs @@ -440,15 +440,15 @@ pub enum CalcUnit { #[allow(missing_docs)] pub struct CalcLengthOrPercentage { pub absolute: Option<Au>, - pub vw: Option<ViewportPercentageLength>, - pub vh: Option<ViewportPercentageLength>, - pub vmin: Option<ViewportPercentageLength>, - pub vmax: Option<ViewportPercentageLength>, - pub em: Option<FontRelativeLength>, - pub ex: Option<FontRelativeLength>, - pub ch: Option<FontRelativeLength>, - pub rem: Option<FontRelativeLength>, - pub percentage: Option<Percentage>, + pub vw: Option<CSSFloat>, + pub vh: Option<CSSFloat>, + pub vmin: Option<CSSFloat>, + pub vmax: Option<CSSFloat>, + pub em: Option<CSSFloat>, + pub ex: Option<CSSFloat>, + pub ch: Option<CSSFloat>, + pub rem: Option<CSSFloat>, + pub percentage: Option<CSSFloat>, } impl CalcLengthOrPercentage { @@ -671,15 +671,15 @@ impl CalcLengthOrPercentage { Ok(CalcLengthOrPercentage { absolute: absolute.map(Au), - vw: vw.map(ViewportPercentageLength::Vw), - vh: vh.map(ViewportPercentageLength::Vh), - vmax: vmax.map(ViewportPercentageLength::Vmax), - vmin: vmin.map(ViewportPercentageLength::Vmin), - em: em.map(FontRelativeLength::Em), - ex: ex.map(FontRelativeLength::Ex), - ch: ch.map(FontRelativeLength::Ch), - rem: rem.map(FontRelativeLength::Rem), - percentage: percentage.map(Percentage), + vw: vw, + vh: vh, + vmax: vmax, + vmin: vmin, + em: em, + ex: ex, + ch: ch, + rem: rem, + percentage: percentage, }) } @@ -767,21 +767,26 @@ impl ToCss for CalcLengthOrPercentage { }; } + let mut first_value = true; + macro_rules! first_value_check { + () => { + if !first_value { + try!(dest.write_str(" + ")); + } else { + first_value = false; + } + }; + } + macro_rules! serialize { ( $( $val:ident ),* ) => { - { - let mut first_value = true; - $( - if let Some(val) = self.$val { - if !first_value { - try!(write!(dest, " + ")); - } else { - first_value = false; - } - try!(val.to_css(dest)); - } - )* - } + $( + if let Some(val) = self.$val { + first_value_check!(); + try!(val.to_css(dest)); + try!(dest.write_str(stringify!($val))); + } + )* }; } @@ -792,11 +797,21 @@ impl ToCss for CalcLengthOrPercentage { try!(write!(dest, "calc(")); } - serialize!(ch, em, ex, absolute, rem, vh, vmax, vmin, vw, percentage); + serialize!(ch, em, ex, rem, vh, vmax, vmin, vw); + if let Some(val) = self.absolute { + first_value_check!(); + try!(val.to_css(dest)); + } + + if let Some(val) = self.percentage { + first_value_check!(); + try!(write!(dest, "{}%", val * 100.)); + } if count > 1 { try!(write!(dest, ")")); } + Ok(()) } } diff --git a/tests/wpt/mozilla/tests/mozilla/calc.html b/tests/wpt/mozilla/tests/mozilla/calc.html index 63ac26613f7..8d6f11f6892 100644 --- a/tests/wpt/mozilla/tests/mozilla/calc.html +++ b/tests/wpt/mozilla/tests/mozilla/calc.html @@ -40,13 +40,13 @@ var widthTests = [ // Alphabetical order ['calc(0ch + 0px + 0pt + 0pc + 0in + 0cm + 0mm + 0rem + 0em + 0ex + 0% + 0vw + 0vh + 0vmin + 0vmax)', - 'calc(0ch + 0em + 0ex + 0px + 0rem + 0vh + 0vmax + 0vmin + 0vw + 0%)', + 'calc(0ch + 0em + 0ex + 0rem + 0vh + 0vmax + 0vmin + 0vw + 0px + 0%)', '0px'], // Simplification ['calc((2 - 1) * 10px)', '10px', '10px'], ['calc(((3 - 1) * (8 + 4)) * 10px)', '240px', '240px'], - ['calc(5 * (20px / 2 + 7 * (3em + 12px/4 + (8 - 2) * 2rem)))', 'calc(105em + 155px + 420rem)', '8555px'], + ['calc(5 * (20px / 2 + 7 * (3em + 12px/4 + (8 - 2) * 2rem)))', 'calc(105em + 420rem + 155px)', '8555px'], ]; |