Change LengthOrPercentageOrAuto to make use of NoCalcLength

This commit is contained in:
Ravi Shankar 2017-01-23 23:55:20 +05:30
parent 590c9579f0
commit bdb08b9a82
5 changed files with 35 additions and 42 deletions

View file

@ -503,14 +503,12 @@ impl LayoutElementHelpers for LayoutJS<Element> {
}; };
if let Some(size) = size { if let Some(size) = size {
let value = specified::Length::NoCalc( let value = specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(size));
specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(size)));
hints.push(from_declaration( hints.push(from_declaration(
PropertyDeclaration::Width(DeclaredValue::Value( PropertyDeclaration::Width(DeclaredValue::Value(
specified::LengthOrPercentageOrAuto::Length(value))))); specified::LengthOrPercentageOrAuto::Length(value)))));
} }
let width = if let Some(this) = self.downcast::<HTMLIFrameElement>() { let width = if let Some(this) = self.downcast::<HTMLIFrameElement>() {
this.get_width() this.get_width()
} else if let Some(this) = self.downcast::<HTMLImageElement>() { } else if let Some(this) = self.downcast::<HTMLImageElement>() {
@ -536,7 +534,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
} }
LengthOrPercentageOrAuto::Length(length) => { LengthOrPercentageOrAuto::Length(length) => {
let width_value = specified::LengthOrPercentageOrAuto::Length( let width_value = specified::LengthOrPercentageOrAuto::Length(
specified::Length::NoCalc(specified::NoCalcLength::Absolute(length))); specified::NoCalcLength::Absolute(length));
hints.push(from_declaration( hints.push(from_declaration(
PropertyDeclaration::Width(DeclaredValue::Value(width_value)))); PropertyDeclaration::Width(DeclaredValue::Value(width_value))));
} }
@ -561,7 +559,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
} }
LengthOrPercentageOrAuto::Length(length) => { LengthOrPercentageOrAuto::Length(length) => {
let height_value = specified::LengthOrPercentageOrAuto::Length( let height_value = specified::LengthOrPercentageOrAuto::Length(
specified::Length::NoCalc(specified::NoCalcLength::Absolute(length))); specified::NoCalcLength::Absolute(length));
hints.push(from_declaration( hints.push(from_declaration(
PropertyDeclaration::Height(DeclaredValue::Value(height_value)))); PropertyDeclaration::Height(DeclaredValue::Value(height_value))));
} }
@ -583,14 +581,12 @@ impl LayoutElementHelpers for LayoutJS<Element> {
// scrollbar size into consideration (but we don't have a scrollbar yet!) // scrollbar size into consideration (but we don't have a scrollbar yet!)
// //
// https://html.spec.whatwg.org/multipage/#textarea-effective-width // https://html.spec.whatwg.org/multipage/#textarea-effective-width
let value = specified::Length::NoCalc( let value = specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(cols));
specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(cols)));
hints.push(from_declaration( hints.push(from_declaration(
PropertyDeclaration::Width(DeclaredValue::Value( PropertyDeclaration::Width(DeclaredValue::Value(
specified::LengthOrPercentageOrAuto::Length(value))))); specified::LengthOrPercentageOrAuto::Length(value)))));
} }
let rows = if let Some(this) = self.downcast::<HTMLTextAreaElement>() { let rows = if let Some(this) = self.downcast::<HTMLTextAreaElement>() {
match this.get_rows() { match this.get_rows() {
0 => None, 0 => None,
@ -604,8 +600,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
// TODO(mttr) This should take scrollbar size into consideration. // TODO(mttr) This should take scrollbar size into consideration.
// //
// https://html.spec.whatwg.org/multipage/#textarea-effective-height // https://html.spec.whatwg.org/multipage/#textarea-effective-height
let value = specified::Length::NoCalc( let value = specified::NoCalcLength::FontRelative(specified::FontRelativeLength::Em(rows as CSSFloat));
specified::NoCalcLength::FontRelative(specified::FontRelativeLength::Em(rows as CSSFloat)));
hints.push(from_declaration( hints.push(from_declaration(
PropertyDeclaration::Height(DeclaredValue::Value( PropertyDeclaration::Height(DeclaredValue::Value(
specified::LengthOrPercentageOrAuto::Length(value))))); specified::LengthOrPercentageOrAuto::Length(value)))));

View file

@ -989,7 +989,7 @@ impl Parse for LengthOrPercentage {
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
#[allow(missing_docs)] #[allow(missing_docs)]
pub enum LengthOrPercentageOrAuto { pub enum LengthOrPercentageOrAuto {
Length(Length), Length(NoCalcLength),
Percentage(Percentage), Percentage(Percentage),
Auto, Auto,
Calc(Box<CalcLengthOrPercentage>), Calc(Box<CalcLengthOrPercentage>),
@ -1022,11 +1022,11 @@ impl LengthOrPercentageOrAuto {
{ {
match try!(input.next()) { match try!(input.next()) {
Token::Dimension(ref value, ref unit) if context.is_ok(value.value) => Token::Dimension(ref value, ref unit) if context.is_ok(value.value) =>
Length::parse_dimension(value.value, unit).map(LengthOrPercentageOrAuto::Length), NoCalcLength::parse_dimension(value.value, unit).map(LengthOrPercentageOrAuto::Length),
Token::Percentage(ref value) if context.is_ok(value.unit_value) => Token::Percentage(ref value) if context.is_ok(value.unit_value) =>
Ok(LengthOrPercentageOrAuto::Percentage(Percentage(value.unit_value))), Ok(LengthOrPercentageOrAuto::Percentage(Percentage(value.unit_value))),
Token::Number(ref value) if value.value == 0. => Token::Number(ref value) if value.value == 0. =>
Ok(LengthOrPercentageOrAuto::Length(Length::zero())), Ok(LengthOrPercentageOrAuto::Length(NoCalcLength::zero())),
Token::Ident(ref value) if value.eq_ignore_ascii_case("auto") => Token::Ident(ref value) if value.eq_ignore_ascii_case("auto") =>
Ok(LengthOrPercentageOrAuto::Auto), Ok(LengthOrPercentageOrAuto::Auto),
Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => { Token::Function(ref name) if name.eq_ignore_ascii_case("calc") => {

View file

@ -25,7 +25,7 @@ use style_traits::ToCss;
use style_traits::viewport::{Orientation, UserZoom, ViewportConstraints, Zoom}; use style_traits::viewport::{Orientation, UserZoom, ViewportConstraints, Zoom};
use stylesheets::{Stylesheet, Origin}; use stylesheets::{Stylesheet, Origin};
use values::computed::{Context, ToComputedValue}; use values::computed::{Context, ToComputedValue};
use values::specified::{Length, NoCalcLength, LengthOrPercentageOrAuto, ViewportPercentageLength}; use values::specified::{NoCalcLength, LengthOrPercentageOrAuto, ViewportPercentageLength};
macro_rules! declare_viewport_descriptor { macro_rules! declare_viewport_descriptor {
( $( $variant_name: expr => $variant: ident($data: ident), )+ ) => { ( $( $variant_name: expr => $variant: ident($data: ident), )+ ) => {
@ -150,16 +150,14 @@ impl FromMeta for ViewportLength {
Some(match value { Some(match value {
v if v.eq_ignore_ascii_case("device-width") => v if v.eq_ignore_ascii_case("device-width") =>
specified!(Length::NoCalc( specified!(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vw(100.))),
NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vw(100.)))),
v if v.eq_ignore_ascii_case("device-height") => v if v.eq_ignore_ascii_case("device-height") =>
specified!(Length::NoCalc( specified!(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vh(100.))),
NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vh(100.)))),
_ => { _ => {
match value.parse::<f32>() { match value.parse::<f32>() {
Ok(n) if n >= 0. => specified!(Length::from_px(n.max(1.).min(10000.))), Ok(n) if n >= 0. => specified!(NoCalcLength::from_px(n.max(1.).min(10000.))),
Ok(_) => return None, Ok(_) => return None,
Err(_) => specified!(Length::from_px(1.)) Err(_) => specified!(NoCalcLength::from_px(1.))
} }
} }
}) })

View file

@ -19,7 +19,7 @@ fn property_declaration_block_should_serialize_correctly() {
let declarations = vec![ let declarations = vec![
(PropertyDeclaration::Width( (PropertyDeclaration::Width(
DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(70f32)))), DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)))),
Importance::Normal), Importance::Normal),
(PropertyDeclaration::MinHeight( (PropertyDeclaration::MinHeight(
@ -27,7 +27,7 @@ fn property_declaration_block_should_serialize_correctly() {
Importance::Normal), Importance::Normal),
(PropertyDeclaration::Height( (PropertyDeclaration::Height(
DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(20f32)))), DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(20f32)))),
Importance::Important), Importance::Important),
(PropertyDeclaration::Display( (PropertyDeclaration::Display(
@ -113,7 +113,7 @@ mod shorthand_serialization {
fn all_equal_properties_should_serialize_to_one_value() { fn all_equal_properties_should_serialize_to_one_value() {
let mut properties = Vec::new(); let mut properties = Vec::new();
let px_70 = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(70f32))); let px_70 = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)));
properties.push(PropertyDeclaration::MarginTop(px_70.clone())); properties.push(PropertyDeclaration::MarginTop(px_70.clone()));
properties.push(PropertyDeclaration::MarginRight(px_70.clone())); properties.push(PropertyDeclaration::MarginRight(px_70.clone()));
properties.push(PropertyDeclaration::MarginBottom(px_70.clone())); properties.push(PropertyDeclaration::MarginBottom(px_70.clone()));
@ -127,8 +127,8 @@ mod shorthand_serialization {
fn equal_vertical_and_equal_horizontal_properties_should_serialize_to_two_value() { fn equal_vertical_and_equal_horizontal_properties_should_serialize_to_two_value() {
let mut properties = Vec::new(); let mut properties = Vec::new();
let vertical_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(10f32))); let vertical_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(10f32)));
let horizontal_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(5f32))); let horizontal_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(5f32)));
properties.push(PropertyDeclaration::MarginTop(vertical_px.clone())); properties.push(PropertyDeclaration::MarginTop(vertical_px.clone()));
properties.push(PropertyDeclaration::MarginRight(horizontal_px.clone())); properties.push(PropertyDeclaration::MarginRight(horizontal_px.clone()));
@ -143,9 +143,9 @@ mod shorthand_serialization {
fn different_vertical_and_equal_horizontal_properties_should_serialize_to_three_values() { fn different_vertical_and_equal_horizontal_properties_should_serialize_to_three_values() {
let mut properties = Vec::new(); let mut properties = Vec::new();
let top_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(8f32))); let top_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(8f32)));
let bottom_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(10f32))); let bottom_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(10f32)));
let horizontal_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(5f32))); let horizontal_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(5f32)));
properties.push(PropertyDeclaration::MarginTop(top_px)); properties.push(PropertyDeclaration::MarginTop(top_px));
properties.push(PropertyDeclaration::MarginRight(horizontal_px.clone())); properties.push(PropertyDeclaration::MarginRight(horizontal_px.clone()));
@ -160,10 +160,10 @@ mod shorthand_serialization {
fn different_properties_should_serialize_to_four_values() { fn different_properties_should_serialize_to_four_values() {
let mut properties = Vec::new(); let mut properties = Vec::new();
let top_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(8f32))); let top_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(8f32)));
let right_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(12f32))); let right_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(12f32)));
let bottom_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(10f32))); let bottom_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(10f32)));
let left_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(Length::from_px(14f32))); let left_px = DeclaredValue::Value(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(14f32)));
properties.push(PropertyDeclaration::MarginTop(top_px)); properties.push(PropertyDeclaration::MarginTop(top_px));
properties.push(PropertyDeclaration::MarginRight(right_px)); properties.push(PropertyDeclaration::MarginRight(right_px));
@ -738,8 +738,8 @@ mod shorthand_serialization {
let size = single_vec_variant_value!(size, let size = single_vec_variant_value!(size,
size::single_value::SpecifiedValue::Explicit( size::single_value::SpecifiedValue::Explicit(
size::single_value::ExplicitSize { size::single_value::ExplicitSize {
width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), width: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)),
height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) height: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(50f32))
} }
) )
); );
@ -798,8 +798,8 @@ mod shorthand_serialization {
let size = single_vec_variant_value!(size, let size = single_vec_variant_value!(size,
size::single_value::SpecifiedValue::Explicit( size::single_value::SpecifiedValue::Explicit(
size::single_value::ExplicitSize { size::single_value::ExplicitSize {
width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), width: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)),
height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) height: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(50f32))
} }
) )
); );
@ -934,8 +934,8 @@ mod shorthand_serialization {
let size = single_vec_variant_value!(size, let size = single_vec_variant_value!(size,
size::single_value::SpecifiedValue::Explicit( size::single_value::SpecifiedValue::Explicit(
size::single_value::ExplicitSize { size::single_value::ExplicitSize {
width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), width: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)),
height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) height: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(50f32))
} }
) )
); );
@ -988,8 +988,8 @@ mod shorthand_serialization {
let size = single_vec_variant_value!(size, let size = single_vec_variant_value!(size,
size::single_value::SpecifiedValue::Explicit( size::single_value::SpecifiedValue::Explicit(
size::single_value::ExplicitSize { size::single_value::ExplicitSize {
width: LengthOrPercentageOrAuto::Length(Length::from_px(70f32)), width: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(70f32)),
height: LengthOrPercentageOrAuto::Length(Length::from_px(50f32)) height: LengthOrPercentageOrAuto::Length(NoCalcLength::from_px(50f32))
} }
) )
); );

View file

@ -12,8 +12,8 @@ use style::error_reporting::ParseErrorReporter;
use style::media_queries::{Device, MediaType}; use style::media_queries::{Device, MediaType};
use style::parser::{ParserContext, ParserContextExtraData}; use style::parser::{ParserContext, ParserContextExtraData};
use style::stylesheets::{Stylesheet, Origin}; use style::stylesheets::{Stylesheet, Origin};
use style::values::specified::Length::{self, ViewportPercentage};
use style::values::specified::LengthOrPercentageOrAuto::{self, Auto}; use style::values::specified::LengthOrPercentageOrAuto::{self, Auto};
use style::values::specified::NoCalcLength::{self, ViewportPercentage};
use style::values::specified::ViewportPercentageLength::Vw; use style::values::specified::ViewportPercentageLength::Vw;
use style::viewport::*; use style::viewport::*;
use style_traits::viewport::*; use style_traits::viewport::*;
@ -80,7 +80,7 @@ macro_rules! assert_decl_len {
macro_rules! viewport_length { macro_rules! viewport_length {
($value:expr, px) => { ($value:expr, px) => {
ViewportLength::Specified(LengthOrPercentageOrAuto::Length(Length::from_px($value))) ViewportLength::Specified(LengthOrPercentageOrAuto::Length(NoCalcLength::from_px($value)))
}; };
($value:expr, vw) => { ($value:expr, vw) => {
ViewportLength::Specified(LengthOrPercentageOrAuto::Length(ViewportPercentage(Vw($value)))) ViewportLength::Specified(LengthOrPercentageOrAuto::Length(ViewportPercentage(Vw($value))))