diff --git a/components/layout/block.rs b/components/layout/block.rs index 7c54df6e17c..ca3ee670beb 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -330,13 +330,15 @@ impl CandidateBSizeIterator { (LengthOrPercentageOrAuto::Calc(calc), Some(block_container_block_size)) => { MaybeAuto::Specified(calc.length() + block_container_block_size.scale_by(calc.percentage())) } - (LengthOrPercentageOrAuto::Percentage(_), None) | (LengthOrPercentageOrAuto::Auto, _) => MaybeAuto::Auto, + (LengthOrPercentageOrAuto::Percentage(_), None) | + (LengthOrPercentageOrAuto::Auto, _) | + (LengthOrPercentageOrAuto::Calc(_), _) => MaybeAuto::Auto, (LengthOrPercentageOrAuto::Length(length), _) => MaybeAuto::Specified(length), - (LengthOrPercentageOrAuto::Calc(calc), _) => MaybeAuto::Specified(calc.length()), }; let max_block_size = match (fragment.style.max_block_size(), block_container_block_size) { - (LengthOrPercentageOrNone::Percentage(percent), Some(block_container_block_size)) => - Some(block_container_block_size.scale_by(percent)), + (LengthOrPercentageOrNone::Percentage(percent), Some(block_container_block_size)) => { + Some(block_container_block_size.scale_by(percent)) + } (LengthOrPercentageOrNone::Percentage(_), None) | (LengthOrPercentageOrNone::None, _) => None, (LengthOrPercentageOrNone::Length(length), _) => Some(length), @@ -1125,16 +1127,12 @@ impl BlockFlow { (LengthOrPercentageOrAuto::Calc(calc), Some(container_size)) => { Some(container_size.scale_by(calc.percentage()) + calc.length()) } - (LengthOrPercentageOrAuto::Calc(calc), _) => { - Some(calc.length()) - }, (LengthOrPercentageOrAuto::Length(length), _) => Some(length), (LengthOrPercentageOrAuto::Percentage(percent), Some(container_size)) => { Some(container_size.scale_by(percent)) } - (LengthOrPercentageOrAuto::Percentage(_), None) => { - None - } + (LengthOrPercentageOrAuto::Percentage(_), None) | + (LengthOrPercentageOrAuto::Calc(_), None) | (LengthOrPercentageOrAuto::Auto, None) => { None } diff --git a/components/layout/flex.rs b/components/layout/flex.rs index 3c34aeaf728..0124330e9b8 100644 --- a/components/layout/flex.rs +++ b/components/layout/flex.rs @@ -167,6 +167,7 @@ impl FlexFlow { } (LengthOrPercentageOrAuto::Percentage(_), None) | (LengthOrPercentageOrAuto::Auto, _) => None, + (LengthOrPercentageOrAuto::Calc(_), _) => None, (LengthOrPercentageOrAuto::Length(length), _) => Some(length), }; diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 8e3c92cad5e..9ac26393c3f 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -466,9 +466,7 @@ impl ReplacedImageFragmentInfo { (LengthOrPercentageOrAuto::Calc(calc), _, Some(container_size)) => { MaybeAuto::Specified(calc.length() + container_size.scale_by(calc.percentage())) } - (LengthOrPercentageOrAuto::Calc(calc), _, None) => { - MaybeAuto::Specified(calc.length()) - } + (LengthOrPercentageOrAuto::Calc(_), _, None) => MaybeAuto::Auto, (LengthOrPercentageOrAuto::Auto, Some(dom_length), _) => MaybeAuto::Specified(dom_length), (LengthOrPercentageOrAuto::Auto, None, _) => MaybeAuto::Auto, } diff --git a/components/style/properties.mako.rs b/components/style/properties.mako.rs index 2df2e339939..b2cfe39d013 100644 --- a/components/style/properties.mako.rs +++ b/components/style/properties.mako.rs @@ -1908,15 +1908,14 @@ pub mod longhands { } /// | | | pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { - input.try(specified::LengthOrPercentage::parse_non_negative) - .map(|value| match value { - specified::LengthOrPercentage::Length(value) => value, + let value = try!(input.try(specified::LengthOrPercentage::parse_non_negative)); + match value { + specified::LengthOrPercentage::Length(value) => Ok(value), specified::LengthOrPercentage::Percentage(value) => - specified::Length::FontRelative(specified::FontRelativeLength::Em(value.0)), + Ok(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.)), - }) + specified::LengthOrPercentage::Calc(_) => return Err(()) + } .or_else(|()| { match_ignore_ascii_case! { try!(input.expect_ident()), "xx-small" => Ok(specified::Length::Absolute(Au::from_px(MEDIUM_PX) * 3 / 5)), diff --git a/components/style/values.rs b/components/style/values.rs index 05c837d33c1..9b74427368f 100644 --- a/components/style/values.rs +++ b/components/style/values.rs @@ -1300,7 +1300,7 @@ pub mod computed { impl ::cssparser::ToCss for Calc { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match (self.length, self.percentage) { - (None, Some(p)) => write!(dest, "{}%", p), + (None, Some(p)) => write!(dest, "{}%", p * 100.), (Some(l), None) => write!(dest, "{}px", Au::to_px(l)), (Some(l), Some(p)) => write!(dest, "calc({}px + {}%)", Au::to_px(l), p * 100.), _ => unreachable!() @@ -1318,14 +1318,14 @@ pub mod computed { length = Some(length.unwrap_or(Au(0)) + absolute); } - for val in vec!(self.vw, self.vh, self.vmin, self.vmax) { - if let Some(val) = val { + for val in &[self.vw, self.vh, self.vmin, self.vmax] { + if let Some(val) = *val { length = Some(length.unwrap_or(Au(0)) + val.to_computed_value(context.viewport_size)); } } - for val in vec!(self.em, self.ex, self.rem) { - if let Some(val) = val { + for val in &[self.em, self.ex, self.rem] { + if let Some(val) = *val { length = Some(length.unwrap_or(Au(0)) + val.to_computed_value(context.font_size, context.root_font_size)); } diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index b0719a029b5..772bceec7d2 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -299,6 +299,12 @@ "url": "/_mozilla/mozilla/body_listener.html" } ], + "mozilla/calc.html": [ + { + "path": "mozilla/calc.html", + "url": "/_mozilla/mozilla/calc.html" + } + ], "mozilla/caption.html": [ { "path": "mozilla/caption.html", diff --git a/tests/wpt/mozilla/meta/mozilla/calc.html.ini b/tests/wpt/mozilla/meta/mozilla/calc.html.ini new file mode 100644 index 00000000000..6a2e6b9c885 --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/calc.html.ini @@ -0,0 +1,8 @@ +[calc.html] + type: testharness + [calc(1px + 1pt + 1pc + 1in + 1cm + 1mm)] + expected: FAIL + + [calc(0px + 0pt + 0pc + 0in + 0cm + 0mm + 0rem + 0em + 0ex + 0% + 0vw + 0vh + 0vmin + 0vmax)] + expected: FAIL + diff --git a/tests/wpt/mozilla/tests/mozilla/calc.html b/tests/wpt/mozilla/tests/mozilla/calc.html new file mode 100644 index 00000000000..519fa1d88fa --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/calc.html @@ -0,0 +1,62 @@ + + + + + + + +
FOO
+ + +