From 925af6c3f83a9190203db6336db1adb03c92d009 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 11 Apr 2017 16:25:05 +0800 Subject: [PATCH] Disable viewport units in @page rules Gecko disables viewport units in @page rules (bug 811391). This makes the same change in Servo. MozReview-Commit-ID: 3KGiLGn619G --- components/style/values/specified/length.rs | 32 +++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/components/style/values/specified/length.rs b/components/style/values/specified/length.rs index 48059b04584..1a509ea06a0 100644 --- a/components/style/values/specified/length.rs +++ b/components/style/values/specified/length.rs @@ -16,6 +16,7 @@ use std::ascii::AsciiExt; use std::ops::Mul; use style_traits::ToCss; use style_traits::values::specified::AllowedNumericType; +use stylesheets::CssRuleType; use super::{Angle, Number, SimplifiedValueNode, SimplifiedSumNode, Time, ToComputedValue}; use values::{Auto, CSSFloat, Either, FONT_MEDIUM_PX, HasViewportPercentage, None_, Normal}; use values::ExtremumLength; @@ -373,7 +374,8 @@ impl Mul for NoCalcLength { impl NoCalcLength { /// Parse a given absolute or relative dimension. - pub fn parse_dimension(_context: &ParserContext, value: CSSFloat, unit: &str) -> Result { + pub fn parse_dimension(context: &ParserContext, value: CSSFloat, unit: &str) -> Result { + let in_page_rule = context.rule_type.map_or(false, |rule_type| rule_type == CssRuleType::Page); match_ignore_ascii_case! { unit, "px" => Ok(NoCalcLength::Absolute(AbsoluteLength::Px(value))), "in" => Ok(NoCalcLength::Absolute(AbsoluteLength::In(value))), @@ -388,10 +390,30 @@ impl NoCalcLength { "ch" => Ok(NoCalcLength::FontRelative(FontRelativeLength::Ch(value))), "rem" => Ok(NoCalcLength::FontRelative(FontRelativeLength::Rem(value))), // viewport percentages - "vw" => Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vw(value))), - "vh" => Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vh(value))), - "vmin" => Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vmin(value))), - "vmax" => Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vmax(value))), + "vw" => { + if in_page_rule { + return Err(()) + } + Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vw(value))) + }, + "vh" => { + if in_page_rule { + return Err(()) + } + Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vh(value))) + }, + "vmin" => { + if in_page_rule { + return Err(()) + } + Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vmin(value))) + }, + "vmax" => { + if in_page_rule { + return Err(()) + } + Ok(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vmax(value))) + }, _ => Err(()) } }