From b991e3f4f232fa214beaf3a0fe6d71a0591fdea2 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 20 May 2017 11:34:36 -0500 Subject: [PATCH] =?UTF-8?q?servo:=20Merge=20#16960=20-=20Derive=20HasViewp?= =?UTF-8?q?ortPercentage=20=F0=9F=8D=B7=20(from=20servo:derive-all-the-thi?= =?UTF-8?q?ngs);=20r=3Demilio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source-Repo: https://github.com/servo/servo Source-Revision: 4f0b24ac0c3bd04104d705898ceb4d06ef5ea092 --HG-- rename : servo/components/domobject_derive/Cargo.toml => servo/components/style_derive/Cargo.toml extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 498aeee06ee32907459c0ba0c29d40189438fb0b --- servo/Cargo.lock | 20 +++- servo/components/style/Cargo.toml | 1 + servo/components/style/lib.rs | 2 + servo/components/style/macros.rs | 13 --- .../style/properties/helpers.mako.rs | 38 +++++-- .../properties/longhand/background.mako.rs | 23 +--- .../style/properties/longhand/border.mako.rs | 37 +------ .../style/properties/longhand/box.mako.rs | 104 ++---------------- .../style/properties/longhand/color.mako.rs | 3 +- .../properties/longhand/counters.mako.rs | 13 +-- .../style/properties/longhand/effects.mako.rs | 25 ++--- .../style/properties/longhand/font.mako.rs | 35 +----- .../properties/longhand/inherited_box.mako.rs | 2 - .../properties/longhand/inherited_svg.mako.rs | 1 - .../longhand/inherited_table.mako.rs | 10 +- .../longhand/inherited_text.mako.rs | 65 +---------- .../style/properties/longhand/list.mako.rs | 3 - .../style/properties/longhand/outline.mako.rs | 16 +-- .../properties/longhand/pointing.mako.rs | 3 +- .../properties/longhand/position.mako.rs | 21 ++-- .../style/properties/longhand/svg.mako.rs | 1 - .../style/properties/longhand/table.mako.rs | 1 - .../style/properties/longhand/text.mako.rs | 3 - .../style/properties/longhand/ui.mako.rs | 2 - servo/components/style/values/computed/mod.rs | 2 +- .../components/style/values/generics/image.rs | 78 ++----------- .../style/values/generics/position.rs | 10 +- servo/components/style/values/mod.rs | 26 +---- .../components/style/values/specified/grid.rs | 13 +-- .../style/values/specified/image.rs | 2 +- .../style/values/specified/length.rs | 82 ++------------ .../components/style/values/specified/mod.rs | 39 +------ servo/components/style_derive/Cargo.toml | 15 +++ .../style_derive/has_viewport_percentage.rs | 56 ++++++++++ servo/components/style_derive/lib.rs | 18 +++ servo/components/style_traits/lib.rs | 2 + servo/components/style_traits/viewport.rs | 42 +++++++ servo/tests/unit/style/attr.rs | 1 - servo/tests/unit/style/restyle_hints.rs | 2 +- servo/tests/unit/style/stylist.rs | 2 +- 40 files changed, 258 insertions(+), 574 deletions(-) create mode 100644 servo/components/style_derive/Cargo.toml create mode 100644 servo/components/style_derive/has_viewport_percentage.rs create mode 100644 servo/components/style_derive/lib.rs diff --git a/servo/Cargo.lock b/servo/Cargo.lock index 77d1550ad412..fd6a93386fee 100644 --- a/servo/Cargo.lock +++ b/servo/Cargo.lock @@ -605,7 +605,7 @@ name = "deny_public_fields" version = "0.0.1" dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1146,7 +1146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1346,7 +1346,7 @@ version = "0.0.1" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2860,6 +2860,7 @@ dependencies = [ "servo_config 0.0.1", "servo_url 0.0.1", "smallvec 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "style_derive 0.0.1", "style_traits 0.0.1", "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2867,6 +2868,15 @@ dependencies = [ "walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "style_derive" +version = "0.0.1" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "style_tests" version = "0.0.1" @@ -2946,7 +2956,7 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3651,7 +3661,7 @@ dependencies = [ "checksum swapper 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca610b32bb8bfc5e7f705480c3a1edfeb70b6582495d343872c8bee0dcf758c" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum synstructure 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ccc9780bf1aa601943988c2876ab22413c01ad1739689aa6af18d0aa0b3f38b" +"checksum synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cf318c34a2f8381a4f3d4db2c91b45bca2b1cd8cbe56caced900647be164800c" "checksum syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f5e3aaa79319573d19938ea38d068056b826db9883a5d47f86c1cecc688f0e" "checksum syntex_errors 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "867cc5c2d7140ae7eaad2ae9e8bf39cb18a67ca651b7834f88d46ca98faadb9c" "checksum syntex_pos 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13ad4762fe52abc9f4008e85c4fb1b1fe3aa91ccb99ff4826a439c7c598e1047" diff --git a/servo/components/style/Cargo.toml b/servo/components/style/Cargo.toml index 125545a052fa..22400c4e2dd8 100644 --- a/servo/components/style/Cargo.toml +++ b/servo/components/style/Cargo.toml @@ -63,6 +63,7 @@ serde_derive = {version = "0.9", optional = true} servo_atoms = {path = "../atoms", optional = true} servo_config = {path = "../config", optional = true} smallvec = "0.3.3" +style_derive = {path = "../style_derive"} style_traits = {path = "../style_traits"} servo_url = {path = "../url", optional = true} time = "0.1" diff --git a/servo/components/style/lib.rs b/servo/components/style/lib.rs index 8e0e45d2bdad..98745ef2b3ee 100644 --- a/servo/components/style/lib.rs +++ b/servo/components/style/lib.rs @@ -79,6 +79,8 @@ extern crate selectors; #[cfg(feature = "servo")] extern crate servo_url; extern crate smallvec; #[macro_use] +extern crate style_derive; +#[macro_use] extern crate style_traits; extern crate time; #[allow(unused_extern_crates)] diff --git a/servo/components/style/macros.rs b/servo/components/style/macros.rs index ce040891a74c..092dc7bb8f26 100644 --- a/servo/components/style/macros.rs +++ b/servo/components/style/macros.rs @@ -38,19 +38,6 @@ macro_rules! define_numbered_css_keyword_enum { } } -/// A macro used to implement HasViewportPercentage trait -/// for a given type that may never contain viewport units. -macro_rules! no_viewport_percentage { - ($name: ident) => { - impl $crate::values::HasViewportPercentage for $name { - #[inline] - fn has_viewport_percentage(&self) -> bool { - false - } - } - }; -} - /// A macro for implementing `ComputedValueAsSpecified`, `Parse` /// and `HasViewportPercentage` traits for the enums defined /// using `define_css_keyword_enum` macro. diff --git a/servo/components/style/properties/helpers.mako.rs b/servo/components/style/properties/helpers.mako.rs index 9c0807ae33ae..d57f54c24bcb 100644 --- a/servo/components/style/properties/helpers.mako.rs +++ b/servo/components/style/properties/helpers.mako.rs @@ -13,8 +13,11 @@ <%def name="predefined_type_inner(name, type, initial_value, parse_method)"> #[allow(unused_imports)] use app_units::Au; + #[allow(unused_imports)] use cssparser::{Color as CSSParserColor, RGBA}; + #[allow(unused_imports)] use values::specified::AllowQuirks; + #[allow(unused_imports)] use smallvec::SmallVec; pub use values::specified::${type} as SpecifiedValue; pub mod computed_value { @@ -78,22 +81,22 @@ % if not gecko_only: use smallvec::SmallVec; use std::fmt; + #[allow(unused_imports)] use values::HasViewportPercentage; use style_traits::ToCss; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let &SpecifiedValue(ref vec) = self; - vec.iter().any(|ref x| x.has_viewport_percentage()) - } - } - pub mod single_value { + #[allow(unused_imports)] use cssparser::Parser; + #[allow(unused_imports)] use parser::{Parse, ParserContext}; + #[allow(unused_imports)] use properties::ShorthandId; + #[allow(unused_imports)] use values::computed::{Context, ToComputedValue}; + #[allow(unused_imports)] use values::{computed, specified}; + #[allow(unused_imports)] use values::{Auto, Either, None_, Normal}; ${caller.body()} } @@ -168,7 +171,7 @@ } /// The specified value of ${name}. - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub Vec); @@ -205,6 +208,7 @@ } pub fn parse(context: &ParserContext, input: &mut Parser) -> Result { + #[allow(unused_imports)] use parser::parse_space_or_comma_separated; <% @@ -260,22 +264,35 @@ %> /// ${property.spec} pub mod ${property.ident} { - #![allow(unused_imports)] % if not property.derived_from: + #[allow(unused_imports)] use cssparser::Parser; + #[allow(unused_imports)] use parser::{Parse, ParserContext}; + #[allow(unused_imports)] use properties::{UnparsedValue, ShorthandId}; % endif + #[allow(unused_imports)] use values::{Auto, Either, None_, Normal}; + #[allow(unused_imports)] use cascade_info::CascadeInfo; + #[allow(unused_imports)] use error_reporting::ParseErrorReporter; + #[allow(unused_imports)] use properties::longhands; + #[allow(unused_imports)] use properties::{DeclaredValue, LonghandId, LonghandIdSet}; + #[allow(unused_imports)] use properties::{CSSWideKeyword, ComputedValues, PropertyDeclaration}; + #[allow(unused_imports)] use properties::style_structs; + #[allow(unused_imports)] use stylearc::Arc; + #[allow(unused_imports)] use values::computed::{Context, ToComputedValue}; + #[allow(unused_imports)] use values::{computed, generics, specified}; + #[allow(unused_imports)] use Atom; ${caller.body()} #[allow(unused_variables)] @@ -461,7 +478,6 @@ keyword = keyword=Keyword(name, values, **keyword_kwargs) %> <%call expr="longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)"> - use values::HasViewportPercentage; use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; @@ -583,7 +599,6 @@ impl ComputedValueAsSpecified for SpecifiedValue {} % endif - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -745,7 +760,6 @@ % if shorthand: /// ${shorthand.spec} pub mod ${shorthand.ident} { - #[allow(unused_imports)] use cssparser::Parser; use parser::ParserContext; use properties::{PropertyDeclaration, SourcePropertyDeclaration, MaybeBoxed}; diff --git a/servo/components/style/properties/longhand/background.mako.rs b/servo/components/style/properties/longhand/background.mako.rs index 3b41a5714cf3..699395dd9f22 100644 --- a/servo/components/style/properties/longhand/background.mako.rs +++ b/servo/components/style/properties/longhand/background.mako.rs @@ -34,7 +34,6 @@ ${helpers.predefined_type("background-image", "ImageLayer", spec="https://drafts.csswg.org/css-backgrounds/#the-background-repeat"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; define_css_keyword_enum!(RepeatKeyword: "repeat" => Repeat, @@ -163,11 +162,8 @@ ${helpers.single_keyword("background-origin", <%helpers:vector_longhand name="background-size" animation_value_type="ComputedValue" extra_prefixes="webkit" spec="https://drafts.csswg.org/css-backgrounds/#the-background-size"> - use cssparser::Token; - use std::ascii::AsciiExt; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; #[allow(missing_docs)] pub mod computed_value { @@ -236,13 +232,7 @@ ${helpers.single_keyword("background-origin", } } - impl HasViewportPercentage for ExplicitSize { - fn has_viewport_percentage(&self) -> bool { - return self.width.has_viewport_percentage() || self.height.has_viewport_percentage(); - } - } - - #[derive(Clone, PartialEq, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub struct ExplicitSize { @@ -266,16 +256,7 @@ ${helpers.single_keyword("background-origin", } } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::Explicit(ref explicit_size) => explicit_size.has_viewport_percentage(), - _ => false - } - } - } - - #[derive(Clone, PartialEq, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { Explicit(ExplicitSize), diff --git a/servo/components/style/properties/longhand/border.mako.rs b/servo/components/style/properties/longhand/border.mako.rs index e5270e30fb92..8c775b682c08 100644 --- a/servo/components/style/properties/longhand/border.mako.rs +++ b/servo/components/style/properties/longhand/border.mako.rs @@ -62,7 +62,6 @@ ${helpers.gecko_keyword_conversion(Keyword('border-style', products="gecko"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::CSSColor; no_viewport_percentage!(SpecifiedValue); @@ -205,20 +204,8 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", spec="https://drafts.csswg.org/css-backgrounds/#border-image-outset"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::{LengthOrNumber, Number}; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let mut viewport_percentage = false; - for value in self.0.iter() { - let vp = value.has_viewport_percentage(); - viewport_percentage = vp || viewport_percentage; - } - viewport_percentage - } - } - pub mod computed_value { use values::computed::LengthOrNumber; #[derive(Debug, Clone, PartialEq)] @@ -227,7 +214,7 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", pub LengthOrNumber, pub LengthOrNumber); } - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub Vec); @@ -321,13 +308,11 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", spec="https://drafts.csswg.org/css-backgrounds/#border-image-repeat"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); pub mod computed_value { pub use super::RepeatKeyword; - use values::computed; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] @@ -399,23 +384,8 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", spec="https://drafts.csswg.org/css-backgrounds/#border-image-width"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::{LengthOrPercentage, Number}; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let mut viewport_percentage = false; - for value in self.0.clone() { - let vp = match value { - SingleSpecifiedValue::LengthOrPercentage(len) => len.has_viewport_percentage(), - _ => false, - }; - viewport_percentage = vp || viewport_percentage; - } - viewport_percentage - } - } - pub mod computed_value { use values::computed::{LengthOrPercentage, Number}; #[derive(Debug, Clone, PartialEq)] @@ -432,7 +402,7 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", } } - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub Vec); @@ -458,7 +428,7 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", } } - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SingleSpecifiedValue { LengthOrPercentage(LengthOrPercentage), @@ -599,7 +569,6 @@ ${helpers.predefined_type("border-image-source", "ImageLayer", spec="https://drafts.csswg.org/css-backgrounds/#border-image-slice"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::NumberOrPercentage as ComputedNumberOrPercentage; use values::specified::{NumberOrPercentage, Percentage}; diff --git a/servo/components/style/properties/longhand/box.mako.rs b/servo/components/style/properties/longhand/box.mako.rs index 86b2e7d95e20..fe9aa583a2bc 100644 --- a/servo/components/style/properties/longhand/box.mako.rs +++ b/servo/components/style/properties/longhand/box.mako.rs @@ -31,7 +31,6 @@ %> use values::computed::ComputedValueAsSpecified; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); pub mod computed_value { @@ -170,7 +169,6 @@ ${helpers.single_keyword("position", "static absolute relative fixed", gecko_inexhaustive="True" gecko_ffi_name="mFloat" spec="https://drafts.csswg.org/css-box/#propdef-float"> - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); impl ToComputedValue for SpecifiedValue { type ComputedValue = computed_value::T; @@ -209,7 +207,6 @@ ${helpers.single_keyword("position", "static absolute relative fixed", gecko_enum_prefix="StyleClear" gecko_ffi_name="mBreakType" spec="https://www.w3.org/TR/CSS2/visuren.html#flow-control"> - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); impl ToComputedValue for SpecifiedValue { type ComputedValue = computed_value::T; @@ -263,7 +260,6 @@ ${helpers.single_keyword("position", "static absolute relative fixed", spec="https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::AllowQuirks; <% vertical_align = data.longhands_by_name["vertical-align"] %> @@ -274,18 +270,9 @@ ${helpers.single_keyword("position", "static absolute relative fixed", ${helpers.gecko_keyword_conversion(vertical_align.keyword)} - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::LengthOrPercentage(ref length) => length.has_viewport_percentage(), - _ => false - } - } - } - /// The `vertical-align` value. #[allow(non_camel_case_types)] - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { % for keyword in vertical_align_keywords: @@ -321,10 +308,9 @@ ${helpers.single_keyword("position", "static absolute relative fixed", /// The computed value for `vertical-align`. pub mod computed_value { - use app_units::Au; use std::fmt; use style_traits::ToCss; - use values::{CSSFloat, computed}; + use values::computed; /// The keywords are the same, and the `LengthOrPercentage` is computed /// here. @@ -426,7 +412,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", use values::specified::Time; pub use values::specified::Time as SpecifiedValue; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); pub mod computed_value { @@ -458,7 +443,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", use values::specified::Number; use euclid::point::{Point2D, TypedPoint2D}; use std::fmt; - use std::marker::PhantomData; use style_traits::ToCss; // FIXME: This could use static variables and const functions when they are available. @@ -499,7 +483,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", pub mod computed_value { use euclid::point::Point2D; - use parser::{Parse, ParserContext}; use std::fmt; use style_traits::ToCss; use super::FunctionKeyword; @@ -764,7 +747,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", } } - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); #[inline] @@ -795,8 +777,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", pub use properties::animated_properties::TransitionProperty as SpecifiedValue; pub mod computed_value { - use std::fmt; - use style_traits::ToCss; // NB: Can't generate the type here because it needs all the longhands // generated beforehand. pub use super::SpecifiedValue as T; @@ -810,7 +790,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", TransitionProperty::All } - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); impl ComputedValueAsSpecified for SpecifiedValue { } @@ -839,10 +818,9 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", spec="https://drafts.csswg.org/css-animations/#propdef-animation-name"> use Atom; use std::fmt; - use std::ops::Deref; use style_traits::ToCss; use values::computed::ComputedValueAsSpecified; - use values::{HasViewportPercentage, KeyframesName}; + use values::KeyframesName; pub mod computed_value { pub use super::SpecifiedValue as T; @@ -937,7 +915,6 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto", use std::fmt; use style_traits::ToCss; use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; pub mod computed_value { pub use super::SpecifiedValue as T; @@ -1045,18 +1022,8 @@ ${helpers.single_keyword("animation-fill-mode", spec="Nonstandard (https://www.w3.org/TR/2015/WD-css-snappoints-1-20150326/#scroll-snap-points)"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::LengthOrPercentage; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::Repeat(ref length) => length.has_viewport_percentage(), - _ => false - } - } - } - pub mod computed_value { use values::computed::LengthOrPercentage; @@ -1065,7 +1032,7 @@ ${helpers.single_keyword("animation-fill-mode", pub struct T(pub Option); } - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { None, @@ -1175,9 +1142,8 @@ ${helpers.predefined_type("scroll-snap-coordinate", use values::specified::{LengthOrNumber, LengthOrPercentageOrNumber as LoPoNumber, Number}; use style_traits::ToCss; use style_traits::values::Css; - use values::HasViewportPercentage; - use std::fmt::{self, Display}; + use std::fmt; pub mod computed_value { use app_units::Au; @@ -1253,7 +1219,7 @@ ${helpers.predefined_type("scroll-snap-coordinate", /// Multiple transform functions compose a transformation. /// /// Some transformations can be expressed by other more general functions. - #[derive(Clone, Debug, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedOperation { /// Represents a 2D 2x3 matrix. @@ -1328,41 +1294,6 @@ ${helpers.predefined_type("scroll-snap-coordinate", } } - impl HasViewportPercentage for SpecifiedOperation { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedOperation::Translate(ref l1, None) | - SpecifiedOperation::TranslateX(ref l1) | - SpecifiedOperation::TranslateY(ref l1) => { - l1.has_viewport_percentage() - } - SpecifiedOperation::TranslateZ(ref l1) => { - l1.has_viewport_percentage() - } - SpecifiedOperation::Translate(ref l1, Some(ref l2)) => { - l1.has_viewport_percentage() || - l2.has_viewport_percentage() - } - SpecifiedOperation::Translate3D(ref l1, ref l2, ref l3) => { - l1.has_viewport_percentage() || - l2.has_viewport_percentage() || - l3.has_viewport_percentage() - }, - SpecifiedOperation::Perspective(ref length) => length.has_viewport_percentage(), - SpecifiedOperation::PrefixedMatrix{ ref e, ref f, .. } => { - e.has_viewport_percentage() || - f.has_viewport_percentage() - }, - SpecifiedOperation::PrefixedMatrix3D{ ref m41, ref m42, ref m43, .. } => { - m41.has_viewport_percentage() || - m42.has_viewport_percentage() || - m43.has_viewport_percentage() - }, - _ => false - } - } - } - impl ToCss for SpecifiedOperation { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { use self::SpecifiedOperation::*; @@ -1422,14 +1353,7 @@ ${helpers.predefined_type("scroll-snap-coordinate", } } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let &SpecifiedValue(ref specified_ops) = self; - specified_ops.iter().any(|ref x| x.has_viewport_percentage()) - } - } - - #[derive(Clone, Debug, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(Vec); @@ -2181,7 +2105,6 @@ ${helpers.single_keyword("transform-style", use app_units::Au; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::{NoCalcLength, LengthOrPercentage, Percentage}; pub mod computed_value { @@ -2223,15 +2146,7 @@ ${helpers.single_keyword("transform-style", } } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - self.horizontal.has_viewport_percentage() || - self.vertical.has_viewport_percentage() || - self.depth.has_viewport_percentage() - } - } - - #[derive(Clone, Debug, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue { horizontal: LengthOrPercentage, @@ -2307,7 +2222,6 @@ ${helpers.single_keyword("transform-style", spec="https://drafts.csswg.org/css-contain/#contain-property"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -2460,7 +2374,6 @@ ${helpers.single_keyword("-moz-orient", use cssparser::serialize_identifier; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -2533,7 +2446,6 @@ ${helpers.predefined_type("shape-outside", "basic_shape::ShapeWithShapeBox", use gecko_bindings::structs; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} diff --git a/servo/components/style/properties/longhand/color.mako.rs b/servo/components/style/properties/longhand/color.mako.rs index e4c3ef4b1fbc..20faeec84850 100644 --- a/servo/components/style/properties/longhand/color.mako.rs +++ b/servo/components/style/properties/longhand/color.mako.rs @@ -14,7 +14,7 @@ use cssparser::RGBA; use std::fmt; use style_traits::ToCss; - use values::specified::{AllowQuirks, Color, CSSColor, CSSRGBA}; + use values::specified::{AllowQuirks, Color, CSSColor}; impl ToComputedValue for SpecifiedValue { type ComputedValue = computed_value::T; @@ -122,6 +122,7 @@ impl SystemColor { pub fn parse(input: &mut Parser) -> Result { + #[cfg(feature = "gecko")] use std::ascii::AsciiExt; static PARSE_ARRAY: &'static [(&'static str, SystemColor); ${len(system_colors)}] = &[ % for color in system_colors: diff --git a/servo/components/style/properties/longhand/counters.mako.rs b/servo/components/style/properties/longhand/counters.mako.rs index 4c4ac955d5b6..c961e073b211 100644 --- a/servo/components/style/properties/longhand/counters.mako.rs +++ b/servo/components/style/properties/longhand/counters.mako.rs @@ -9,12 +9,11 @@ <%helpers:longhand name="content" boxed="True" animation_value_type="none" spec="https://drafts.csswg.org/css-content/#propdef-content"> use cssparser::Token; - use std::ascii::AsciiExt; use values::computed::ComputedValueAsSpecified; #[cfg(feature = "gecko")] use values::generics::CounterStyleOrNone; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; - use values::HasViewportPercentage; #[cfg(feature = "servo")] use super::list_style_type; @@ -29,6 +28,7 @@ use cssparser; use std::fmt; use style_traits::ToCss; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; #[cfg(feature = "servo")] @@ -256,11 +256,9 @@ spec="https://drafts.csswg.org/css-lists/#propdef-counter-increment"> use std::fmt; use style_traits::ToCss; - use super::content; - use values::{HasViewportPercentage, CustomIdent}; + use values::CustomIdent; - use cssparser::{Token, serialize_identifier}; - use std::borrow::{Cow, ToOwned}; + use cssparser::Token; #[derive(Debug, Clone, PartialEq)] pub struct SpecifiedValue(pub Vec<(CustomIdent, specified::Integer)>); @@ -278,7 +276,6 @@ fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write, { - use cssparser::serialize_identifier; if self.0.is_empty() { return dest.write_str("none") } @@ -348,8 +345,6 @@ } pub fn parse_common(context: &ParserContext, default_value: i32, input: &mut Parser) -> Result { - use std::ascii::AsciiExt; - if input.try(|input| input.expect_ident_matching("none")).is_ok() { return Ok(SpecifiedValue(Vec::new())) } diff --git a/servo/components/style/properties/longhand/effects.mako.rs b/servo/components/style/properties/longhand/effects.mako.rs index b56f105c4921..730142b76a7d 100644 --- a/servo/components/style/properties/longhand/effects.mako.rs +++ b/servo/components/style/properties/longhand/effects.mako.rs @@ -18,10 +18,8 @@ ${helpers.predefined_type("opacity", animation_value_type="IntermediateBoxShadowList" extra_prefixes="webkit" spec="https://drafts.csswg.org/css-backgrounds/#box-shadow"> - use cssparser; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; pub type SpecifiedValue = specified::Shadow; @@ -47,9 +45,6 @@ ${helpers.predefined_type("opacity", } pub mod computed_value { - use app_units::Au; - use std::fmt; - use values::computed; use values::computed::Shadow; pub type T = Shadow; @@ -91,20 +86,16 @@ ${helpers.predefined_type("clip", flags="CREATES_STACKING_CONTEXT FIXPOS_CB" spec="https://drafts.fxtf.org/filters/#propdef-filter"> //pub use self::computed_value::T as SpecifiedValue; - use cssparser; use std::fmt; - use style_traits::{self, ToCss}; + use style_traits::ToCss; use values::{CSSFloat, HasViewportPercentage}; - use values::specified::{Angle, CSSColor, Length, Shadow}; + use values::specified::{Angle, Length}; + #[cfg(feature = "gecko")] + use values::specified::Shadow; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - self.0.iter().any(|ref x| x.has_viewport_percentage()) - } - } - - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub Vec); @@ -139,8 +130,10 @@ ${helpers.predefined_type("clip", pub mod computed_value { use app_units::Au; use values::CSSFloat; - use values::computed::{CSSColor, Shadow}; + #[cfg(feature = "gecko")] + use values::computed::Shadow; use values::computed::Angle; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; #[derive(Clone, PartialEq, Debug)] diff --git a/servo/components/style/properties/longhand/font.mako.rs b/servo/components/style/properties/longhand/font.mako.rs index 45687818d095..191dca525742 100644 --- a/servo/components/style/properties/longhand/font.mako.rs +++ b/servo/components/style/properties/longhand/font.mako.rs @@ -68,14 +68,11 @@ use self::computed_value::{FontFamily, FamilyName}; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; - use values::computed::ComputedValueAsSpecified; no_viewport_percentage!(SpecifiedValue); pub mod computed_value { use cssparser::{CssStringWriter, Parser, serialize_identifier}; - use properties::longhands::system_font::SystemFont; use std::fmt::{self, Write}; use Atom; use style_traits::ToCss; @@ -355,7 +352,6 @@ ${helpers.single_keyword_system("font-variant-caps", spec="https://drafts.csswg.org/css-fonts/#propdef-font-weight"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use properties::longhands::system_font::SystemFont; no_viewport_percentage!(SpecifiedValue); @@ -449,7 +445,6 @@ ${helpers.single_keyword_system("font-variant-caps", } pub mod computed_value { - use std::fmt; #[derive(PartialEq, Eq, Copy, Clone, Hash, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] #[repr(u16)] @@ -557,7 +552,7 @@ ${helpers.single_keyword_system("font-variant-caps", use std::fmt; use style_traits::ToCss; use values::{FONT_MEDIUM_PX, HasViewportPercentage}; - use values::specified::{AllowQuirks, FontRelativeLength, LengthOrPercentage, Length}; + use values::specified::{AllowQuirks, FontRelativeLength, LengthOrPercentage}; use values::specified::{NoCalcLength, Percentage}; use values::specified::length::FontBaseSize; @@ -694,8 +689,7 @@ ${helpers.single_keyword_system("font-variant-caps", type ComputedValue = Au; #[inline] fn to_computed_value(&self, cx: &Context) -> computed_value::T { - use gecko_bindings::bindings::Gecko_GetBaseSize; - use gecko_bindings::structs::{self, nsIAtom}; + use gecko_bindings::structs::nsIAtom; use values::specified::length::au_to_int_px; // Data from nsRuleNode.cpp in Gecko // Mapping from base size and HTML size to pixels @@ -977,7 +971,6 @@ ${helpers.single_keyword_system("font-variant-caps", use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1119,7 +1112,6 @@ ${helpers.single_keyword_system("font-variant-caps", spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -1203,7 +1195,6 @@ ${helpers.single_keyword_system("font-kerning", use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1339,7 +1330,6 @@ macro_rules! exclusive_value { use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1480,7 +1470,6 @@ macro_rules! exclusive_value { use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1631,7 +1620,6 @@ macro_rules! exclusive_value { use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1784,8 +1772,6 @@ ${helpers.single_keyword_system("font-variant-position", use properties::longhands::system_font::SystemFont; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; - use values::computed::ComputedValueAsSpecified; #[derive(Debug, Clone, PartialEq)] pub enum SpecifiedValue { @@ -1868,8 +1854,6 @@ ${helpers.single_keyword_system("font-variant-position", /// [ on | off | ] fn parse(_context: &ParserContext, input: &mut Parser) -> Result { use std::io::Cursor; - use std::str; - use std::ops::Deref; use byteorder::{ReadBytesExt, BigEndian}; let tag = try!(input.expect_string()); @@ -1928,7 +1912,6 @@ ${helpers.single_keyword_system("font-variant-position", use std::fmt; use style_traits::ToCss; use byteorder::{BigEndian, ByteOrder}; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); #[derive(Debug, Clone, PartialEq, Eq)] @@ -2063,7 +2046,6 @@ ${helpers.single_keyword_system("font-variant-position", <%helpers:longhand name="-x-lang" products="gecko" animation_value_type="none" internal="True" spec="Internal (not web-exposed)"> - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; pub use self::computed_value::T as SpecifiedValue; @@ -2102,12 +2084,10 @@ ${helpers.single_keyword_system("font-variant-position", predefined_type="Number" gecko_ffi_name="mScriptSizeMultiplier" spec="Internal (not web-exposed)" internal="True" disable_when_testing="True"> - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; pub use self::computed_value::T as SpecifiedValue; impl ComputedValueAsSpecified for SpecifiedValue {} - no_viewport_percentage!(SpecifiedValue); pub mod computed_value { pub type T = f32; @@ -2130,7 +2110,6 @@ ${helpers.single_keyword_system("font-variant-position", internal="True" disable_when_testing="True" need_clone="True"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -2230,11 +2209,9 @@ ${helpers.single_keyword("-moz-math-variant", use gecko_bindings::structs::NS_MATHML_DEFAULT_SCRIPT_MIN_SIZE_PT; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; - use values::computed::ComputedValueAsSpecified; use values::specified::length::{AU_PER_PT, FontBaseSize, NoCalcLength}; - #[derive(Clone, PartialEq, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] pub struct SpecifiedValue(pub NoCalcLength); pub mod computed_value { @@ -2272,12 +2249,6 @@ ${helpers.single_keyword("-moz-math-variant", } } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - self.0.has_viewport_percentage() - } - } - #[inline] pub fn get_initial_value() -> computed_value::T { Au((NS_MATHML_DEFAULT_SCRIPT_MIN_SIZE_PT as f32 * AU_PER_PT) as i32) diff --git a/servo/components/style/properties/longhand/inherited_box.mako.rs b/servo/components/style/properties/longhand/inherited_box.mako.rs index 7c7cd67e8e9f..c482e03dd627 100644 --- a/servo/components/style/properties/longhand/inherited_box.mako.rs +++ b/servo/components/style/properties/longhand/inherited_box.mako.rs @@ -68,7 +68,6 @@ ${helpers.single_keyword("image-rendering", use style_traits::ToCss; use values::specified::Angle; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); use std::f32::consts::PI; @@ -207,7 +206,6 @@ ${helpers.single_keyword("image-rendering", use std::fmt; use style_traits::ToCss; use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); diff --git a/servo/components/style/properties/longhand/inherited_svg.mako.rs b/servo/components/style/properties/longhand/inherited_svg.mako.rs index d7acf552e89b..1f06f0ca1722 100644 --- a/servo/components/style/properties/longhand/inherited_svg.mako.rs +++ b/servo/components/style/properties/longhand/inherited_svg.mako.rs @@ -144,7 +144,6 @@ ${helpers.predefined_type("marker-end", "UrlOrNone", "Either::Second(None_)", use values::computed::ComputedValueAsSpecified; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; pub const NORMAL: u8 = 0; pub const FILL: u8 = 1; diff --git a/servo/components/style/properties/longhand/inherited_table.mako.rs b/servo/components/style/properties/longhand/inherited_table.mako.rs index b6c1ad3d6049..61229c3228f0 100644 --- a/servo/components/style/properties/longhand/inherited_table.mako.rs +++ b/servo/components/style/properties/longhand/inherited_table.mako.rs @@ -25,7 +25,6 @@ ${helpers.single_keyword("caption-side", "top bottom", use app_units::Au; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::{AllowQuirks, Length}; pub mod computed_value { @@ -65,14 +64,7 @@ ${helpers.single_keyword("caption-side", "top bottom", } } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - self.horizontal.has_viewport_percentage() || - self.vertical.as_ref().map_or(false, |v| v.has_viewport_percentage()) - } - } - - #[derive(Clone, Debug, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue { pub horizontal: Length, diff --git a/servo/components/style/properties/longhand/inherited_text.mako.rs b/servo/components/style/properties/longhand/inherited_text.mako.rs index a1f6dfc04188..83b0cf261793 100644 --- a/servo/components/style/properties/longhand/inherited_text.mako.rs +++ b/servo/components/style/properties/longhand/inherited_text.mako.rs @@ -10,18 +10,8 @@ spec="https://drafts.csswg.org/css2/visudet.html#propdef-line-height"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::LengthOrPercentage(ref length) => length.has_viewport_percentage(), - _ => false - } - } - } - - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { Normal, @@ -75,7 +65,6 @@ } pub mod computed_value { use app_units::Au; - use std::fmt; use values::CSSFloat; #[derive(PartialEq, Copy, Clone, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] @@ -212,7 +201,6 @@ ${helpers.single_keyword("word-break", gecko_enum_prefix="StyleTextJustify" animation_value_type="none" spec="https://drafts.csswg.org/css-text/#propdef-text-justify"> - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); impl ToComputedValue for SpecifiedValue { @@ -256,8 +244,6 @@ ${helpers.single_keyword("text-align-last", // TODO make this a shorthand and implement text-align-last/text-align-all <%helpers:longhand name="text-align" animation_value_type="none" need_clone="True" spec="https://drafts.csswg.org/css-text/#propdef-text-align"> - use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); pub mod computed_value { use style_traits::ToCss; @@ -400,6 +386,7 @@ ${helpers.single_keyword("text-align-last", } } % else: + use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} pub use self::computed_value::T as SpecifiedValue; pub fn parse(_context: &ParserContext, input: &mut Parser) -> Result { @@ -412,19 +399,9 @@ ${helpers.single_keyword("text-align-last", spec="https://drafts.csswg.org/css-text/#propdef-letter-spacing"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::AllowQuirks; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::Specified(ref length) => length.has_viewport_percentage(), - _ => false - } - } - } - - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { Normal, @@ -498,19 +475,9 @@ ${helpers.single_keyword("text-align-last", spec="https://drafts.csswg.org/css-text/#propdef-word-spacing"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::specified::AllowQuirks; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - match *self { - SpecifiedValue::Specified(ref length) => length.has_viewport_percentage(), - _ => false - } - } - } - - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum SpecifiedValue { Normal, @@ -588,7 +555,6 @@ ${helpers.single_keyword("text-align-last", use cssparser::RGBA; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -674,7 +640,6 @@ ${helpers.single_keyword("text-align-last", animation_value_type="none" spec="https://drafts.csswg.org/css-text/#propdef-white-space"> use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; impl ComputedValueAsSpecified for SpecifiedValue {} no_viewport_percentage!(SpecifiedValue); @@ -720,28 +685,12 @@ ${helpers.single_keyword("text-align-last", use std::fmt; use style_traits::ToCss; use values::specified::Shadow; - use values::HasViewportPercentage; - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let &SpecifiedValue(ref vec) = self; - vec.iter().any(|ref x| x.has_viewport_percentage()) - } - } - - #[derive(Clone, PartialEq, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(Vec); - impl HasViewportPercentage for SpecifiedTextShadow { - fn has_viewport_percentage(&self) -> bool { - self.offset_x.has_viewport_percentage() || - self.offset_y.has_viewport_percentage() || - self.blur_radius.has_viewport_percentage() - } - } - - #[derive(Clone, PartialEq, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedTextShadow { pub offset_x: specified::Length, @@ -891,7 +840,6 @@ ${helpers.single_keyword("text-align-last", use std::fmt; use style_traits::ToCss; use unicode_segmentation::UnicodeSegmentation; - use values::HasViewportPercentage; no_viewport_percentage!(SpecifiedValue); @@ -1097,7 +1045,6 @@ ${helpers.single_keyword("text-align-last", spec="https://drafts.csswg.org/css-text-decor/#propdef-text-emphasis-position"> use std::fmt; use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; use style_traits::ToCss; define_css_keyword_enum!(HorizontalWritingModeValue: diff --git a/servo/components/style/properties/longhand/list.mako.rs b/servo/components/style/properties/longhand/list.mako.rs index 14084f894d22..90d9a9e3f67c 100644 --- a/servo/components/style/properties/longhand/list.mako.rs +++ b/servo/components/style/properties/longhand/list.mako.rs @@ -36,7 +36,6 @@ ${helpers.single_keyword("list-style-position", "outside inside", animation_valu use std::fmt; use style_traits::ToCss; use values::CustomIdent; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; use values::generics::CounterStyleOrNone; @@ -105,7 +104,6 @@ ${helpers.single_keyword("list-style-position", "outside inside", animation_valu boxed="${product == 'gecko'}" spec="https://drafts.csswg.org/css-lists/#propdef-list-style-image"> use std::fmt; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; use values::specified::UrlOrNone; pub use self::computed_value::T as SpecifiedValue; @@ -158,7 +156,6 @@ ${helpers.single_keyword("list-style-position", "outside inside", animation_valu use std::fmt; use style_traits::ToCss; use values::computed::ComputedValueAsSpecified; - use values::HasViewportPercentage; pub use self::computed_value::T as SpecifiedValue; diff --git a/servo/components/style/properties/longhand/outline.mako.rs b/servo/components/style/properties/longhand/outline.mako.rs index fcfebe6a00e8..3d0a22f08d4d 100644 --- a/servo/components/style/properties/longhand/outline.mako.rs +++ b/servo/components/style/properties/longhand/outline.mako.rs @@ -17,11 +17,7 @@ ${helpers.predefined_type("outline-color", "CSSColor", "computed::CSSColor::Curr <%helpers:longhand name="outline-style" need_clone="True" animation_value_type="none" spec="https://drafts.csswg.org/css-ui/#propdef-outline-style"> - - use std::fmt; - use style_traits::ToCss; use values::specified::BorderStyle; - use values::computed::ComputedValueAsSpecified; pub type SpecifiedValue = Either; @@ -66,10 +62,8 @@ ${helpers.predefined_type("outline-color", "CSSColor", "computed::CSSColor::Curr <%helpers:longhand name="outline-width" animation_value_type="ComputedValue" spec="https://drafts.csswg.org/css-ui/#propdef-outline-width"> - use app_units::Au; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; impl ToCss for SpecifiedValue { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { @@ -81,16 +75,10 @@ ${helpers.predefined_type("outline-color", "CSSColor", "computed::CSSColor::Curr specified::parse_border_width(context, input).map(SpecifiedValue) } - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - let &SpecifiedValue(ref length) = self; - length.has_viewport_percentage() - } - } - - #[derive(Debug, Clone, PartialEq)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(pub specified::Length); + pub mod computed_value { use app_units::Au; pub type T = Au; diff --git a/servo/components/style/properties/longhand/pointing.mako.rs b/servo/components/style/properties/longhand/pointing.mako.rs index 77edc71e000e..e04a2fc09b61 100644 --- a/servo/components/style/properties/longhand/pointing.mako.rs +++ b/servo/components/style/properties/longhand/pointing.mako.rs @@ -9,8 +9,8 @@ <%helpers:longhand name="cursor" boxed="${product == 'gecko'}" animation_value_type="none" spec="https://drafts.csswg.org/css-ui/#cursor"> pub use self::computed_value::T as SpecifiedValue; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -20,6 +20,7 @@ use std::fmt; use style_traits::cursor::Cursor; use style_traits::ToCss; + #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; #[derive(Clone, PartialEq, Copy, Debug)] diff --git a/servo/components/style/properties/longhand/position.mako.rs b/servo/components/style/properties/longhand/position.mako.rs index 0cea82301cc1..da7fe080604f 100644 --- a/servo/components/style/properties/longhand/position.mako.rs +++ b/servo/components/style/properties/longhand/position.mako.rs @@ -178,20 +178,16 @@ ${helpers.predefined_type("flex-basis", use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; - use values::specified::{AllowQuirks, ${MinMax}Length}; - - impl HasViewportPercentage for SpecifiedValue { - fn has_viewport_percentage(&self) -> bool { - self.0.has_viewport_percentage() - } - } + % if not logical: + use values::specified::AllowQuirks; + % endif + use values::specified::${MinMax}Length; pub mod computed_value { pub type T = ::values::computed::${MinMax}Length; } - #[derive(PartialEq, Clone, Debug)] + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct SpecifiedValue(${MinMax}Length); @@ -225,7 +221,9 @@ ${helpers.predefined_type("flex-basis", type ComputedValue = computed_value::T; #[inline] fn to_computed_value(&self, context: &Context) -> computed_value::T { - use values::computed::${MinMax}Length; + % if not logical or "block" in size: + use values::computed::${MinMax}Length; + % endif let computed = self.0.to_computed_value(context); // filter out keyword values in the block direction @@ -338,7 +336,6 @@ ${helpers.predefined_type("object-position", animation_value_type="none"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; pub type SpecifiedValue = computed_value::T; @@ -430,8 +427,6 @@ ${helpers.predefined_type("object-position", use std::ops::Range; use str::HTML_SPACE_CHARACTERS; use style_traits::ToCss; - use style_traits::values::Css; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; pub mod computed_value { diff --git a/servo/components/style/properties/longhand/svg.mako.rs b/servo/components/style/properties/longhand/svg.mako.rs index bd1a2b520a13..9d531ca58a11 100644 --- a/servo/components/style/properties/longhand/svg.mako.rs +++ b/servo/components/style/properties/longhand/svg.mako.rs @@ -77,7 +77,6 @@ ${helpers.single_keyword("mask-mode", pub use properties::longhands::background_repeat::single_value::SpecifiedValue; pub use properties::longhands::background_repeat::single_value::computed_value; pub use properties::longhands::background_repeat::single_value::RepeatKeyword; - use properties::longhands::background_repeat::single_value; #[inline] pub fn get_initial_value() -> computed_value::T { diff --git a/servo/components/style/properties/longhand/table.mako.rs b/servo/components/style/properties/longhand/table.mako.rs index 3b1c8709a94d..b64deb64606b 100644 --- a/servo/components/style/properties/longhand/table.mako.rs +++ b/servo/components/style/properties/longhand/table.mako.rs @@ -14,7 +14,6 @@ ${helpers.single_keyword("table-layout", "auto fixed", spec="Internal-only (for `` pres attr)" animation_value_type="none" internal="True"> - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} diff --git a/servo/components/style/properties/longhand/text.mako.rs b/servo/components/style/properties/longhand/text.mako.rs index 4d29e2b0e774..7d0aa234e09d 100644 --- a/servo/components/style/properties/longhand/text.mako.rs +++ b/servo/components/style/properties/longhand/text.mako.rs @@ -16,7 +16,6 @@ spec="https://drafts.csswg.org/css-ui/#propdef-text-overflow"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; use cssparser; @@ -107,7 +106,6 @@ ${helpers.single_keyword("unicode-bidi", spec="https://drafts.csswg.org/css-text-decor/#propdef-text-decoration-line"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -237,7 +235,6 @@ ${helpers.predefined_type( spec="https://drafts.csswg.org/css-inline/#sizing-drop-initials"> use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; use values::specified::{Number, Integer}; diff --git a/servo/components/style/properties/longhand/ui.mako.rs b/servo/components/style/properties/longhand/ui.mako.rs index 05808307635d..25cba0609c5f 100644 --- a/servo/components/style/properties/longhand/ui.mako.rs +++ b/servo/components/style/properties/longhand/ui.mako.rs @@ -35,10 +35,8 @@ ${helpers.single_keyword("-moz-window-dragging", "default drag no-drag", product products="gecko" animation_value_type="none" spec="None (Nonstandard Firefox-only property)"> - use cssparser::Token; use std::fmt; use style_traits::ToCss; - use values::HasViewportPercentage; use values::computed::ComputedValueAsSpecified; no_viewport_percentage!(SpecifiedValue); diff --git a/servo/components/style/values/computed/mod.rs b/servo/components/style/values/computed/mod.rs index 7101192be1a1..8c537eb36942 100644 --- a/servo/components/style/values/computed/mod.rs +++ b/servo/components/style/values/computed/mod.rs @@ -175,7 +175,7 @@ impl ToComputedValue for T } /// A computed `` value. -#[derive(Clone, PartialEq, PartialOrd, Copy, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq, PartialOrd)] #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] pub enum Angle { /// An angle with degree unit diff --git a/servo/components/style/values/generics/image.rs b/servo/components/style/values/generics/image.rs index 55bb8d20d43e..2b42314eb007 100644 --- a/servo/components/style/values/generics/image.rs +++ b/servo/components/style/values/generics/image.rs @@ -32,7 +32,7 @@ pub enum Image { /// A CSS gradient. /// https://drafts.csswg.org/css-images/#gradients -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct Gradient { /// Gradients can be linear or radial. @@ -45,7 +45,7 @@ pub struct Gradient pub compat_mode: CompatMode, } -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] /// Whether we used the modern notation or the compatibility `-webkit` prefix. pub enum CompatMode { @@ -56,7 +56,7 @@ pub enum CompatMode { } /// A gradient kind. -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum GradientKind { /// A linear gradient. @@ -66,7 +66,7 @@ pub enum GradientKind { } /// A radial gradient's ending shape. -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum EndingShape { /// A circular gradient. @@ -76,7 +76,7 @@ pub enum EndingShape { } /// A circle shape. -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum Circle { /// A circle radius. @@ -86,7 +86,7 @@ pub enum Circle { } /// An ellipse shape. -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum Ellipse { /// An ellipse pair of radii. @@ -104,10 +104,11 @@ define_css_keyword_enum!(ShapeExtent: "contain" => Contain, "cover" => Cover ); +no_viewport_percentage!(ShapeExtent); /// A gradient item. /// https://drafts.csswg.org/css-images-4/#color-stop-syntax -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum GradientItem { /// A color stop. @@ -118,7 +119,7 @@ pub enum GradientItem { /// A color stop. /// https://drafts.csswg.org/css-images/#typedef-color-stop-list -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct ColorStop { /// The color of this stop. @@ -281,17 +282,6 @@ impl ToCss for Gradient } } -impl HasViewportPercentage for Gradient - where L: HasViewportPercentage, - LoP: HasViewportPercentage, - P: HasViewportPercentage, -{ - fn has_viewport_percentage(&self) -> bool { - self.kind.has_viewport_percentage() || - self.items.iter().any(|i| i.has_viewport_percentage()) - } -} - impl ToComputedValue for Gradient where D: ToComputedValue, L: ToComputedValue, @@ -333,21 +323,6 @@ impl GradientKind { } } -impl HasViewportPercentage for GradientKind - where L: HasViewportPercentage, - LoP: HasViewportPercentage, - P: HasViewportPercentage -{ - fn has_viewport_percentage(&self) -> bool { - match *self { - GradientKind::Linear(_) => false, - GradientKind::Radial(ref shape, ref position) => { - shape.has_viewport_percentage() || position.has_viewport_percentage() - }, - } - } -} - impl ToComputedValue for GradientKind where D: ToComputedValue, L: ToComputedValue, @@ -423,22 +398,6 @@ impl ToCss for EndingShape } } -impl HasViewportPercentage for EndingShape - where L: HasViewportPercentage, LoP: HasViewportPercentage, -{ - fn has_viewport_percentage(&self) -> bool { - match *self { - EndingShape::Circle(Circle::Radius(ref length)) => { - length.has_viewport_percentage() - }, - EndingShape::Ellipse(Ellipse::Radii(ref x, ref y)) => { - x.has_viewport_percentage() || y.has_viewport_percentage() - }, - _ => false, - } - } -} - impl ToComputedValue for EndingShape where L: ToComputedValue, LoP: ToComputedValue, { @@ -497,17 +456,6 @@ impl ToCss for GradientItem } } -impl HasViewportPercentage for GradientItem - where L: HasViewportPercentage, -{ - fn has_viewport_percentage(&self) -> bool { - match *self { - GradientItem::ColorStop(ref stop) => stop.has_viewport_percentage(), - GradientItem::InterpolationHint(ref hint) => hint.has_viewport_percentage(), - } - } -} - impl ToComputedValue for GradientItem where C: ToComputedValue, L: ToComputedValue, { @@ -562,14 +510,6 @@ impl ToCss for ColorStop } } -impl HasViewportPercentage for ColorStop - where L: HasViewportPercentage, -{ - fn has_viewport_percentage(&self) -> bool { - self.position.as_ref().map_or(false, HasViewportPercentage::has_viewport_percentage) - } -} - impl ToComputedValue for ColorStop where C: ToComputedValue, L: ToComputedValue, { diff --git a/servo/components/style/values/generics/position.rs b/servo/components/style/values/generics/position.rs index 1b805b8ff08e..7e13919d30cd 100644 --- a/servo/components/style/values/generics/position.rs +++ b/servo/components/style/values/generics/position.rs @@ -5,10 +5,9 @@ //! Generic types for CSS handling of specified and computed values of //! [`position`](https://drafts.csswg.org/css-backgrounds-3/#position) -use values::HasViewportPercentage; use values::computed::{Context, ToComputedValue}; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] /// A generic type for representing a CSS [position](https://drafts.csswg.org/css-values/#position). pub struct Position { @@ -28,13 +27,6 @@ impl Position { } } -impl HasViewportPercentage for Position { - #[inline] - fn has_viewport_percentage(&self) -> bool { - self.horizontal.has_viewport_percentage() || self.vertical.has_viewport_percentage() - } -} - impl ToComputedValue for Position { type ComputedValue = Position<::ComputedValue, ::ComputedValue>; diff --git a/servo/components/style/values/mod.rs b/servo/components/style/values/mod.rs index 63bcc366bad0..6a6469a1742c 100644 --- a/servo/components/style/values/mod.rs +++ b/servo/components/style/values/mod.rs @@ -16,6 +16,7 @@ use std::borrow::Cow; use std::fmt::{self, Debug}; use std::hash; use style_traits::ToCss; +pub use style_traits::HasViewportPercentage; pub mod computed; pub mod generics; @@ -30,24 +31,11 @@ pub type CSSInteger = i32; /// The default font size. pub const FONT_MEDIUM_PX: i32 = 16; -/// A trait used to query whether this value has viewport units. -pub trait HasViewportPercentage { - /// Returns true if this value has viewport units. - fn has_viewport_percentage(&self) -> bool; -} - -impl HasViewportPercentage for Box { - #[inline] - fn has_viewport_percentage(&self) -> bool { - (**self).has_viewport_percentage() - } -} - define_keyword_type!(None_, "none"); define_keyword_type!(Auto, "auto"); define_keyword_type!(Normal, "normal"); -#[derive(Clone, PartialEq, Copy)] +#[derive(Clone, Copy, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] /// A struct representing one of two kinds of values. pub enum Either { @@ -75,15 +63,6 @@ impl ToCss for Either { } } -impl HasViewportPercentage for Either { - fn has_viewport_percentage(&self) -> bool { - match *self { - Either::First(ref v) => v.has_viewport_percentage(), - Either::Second(ref v) => v.has_viewport_percentage(), - } - } -} - impl Parse for Either { fn parse(context: &ParserContext, input: &mut Parser) -> Result, ()> { if let Ok(v) = input.try(|i| A::parse(context, i)) { @@ -209,3 +188,4 @@ define_css_keyword_enum!(ExtremumLength: "-moz-min-content" => MinContent, "-moz-fit-content" => FitContent, "-moz-available" => FillAvailable); +no_viewport_percentage!(ExtremumLength); diff --git a/servo/components/style/values/specified/grid.rs b/servo/components/style/values/specified/grid.rs index 45f888d97024..a4a8b930ef86 100644 --- a/servo/components/style/values/specified/grid.rs +++ b/servo/components/style/values/specified/grid.rs @@ -221,7 +221,7 @@ impl ToComputedValue for TrackBreadth { } } -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] /// A `` type for explicit grid track sizing. Like ``, this is /// generic only to avoid code bloat. It only takes `` @@ -321,17 +321,6 @@ impl ToCss for TrackSize { } } -impl HasViewportPercentage for TrackSize { - #[inline] - fn has_viewport_percentage(&self) -> bool { - match *self { - TrackSize::Breadth(ref b) => b.has_viewport_percentage(), - TrackSize::MinMax(ref inf_b, ref b) => inf_b.has_viewport_percentage() || b.has_viewport_percentage(), - TrackSize::FitContent(ref lop) => lop.has_viewport_percentage(), - } - } -} - impl ToComputedValue for TrackSize { type ComputedValue = TrackSize; diff --git a/servo/components/style/values/specified/image.rs b/servo/components/style/values/specified/image.rs index 9266bec885ba..d14e9b492b25 100644 --- a/servo/components/style/values/specified/image.rs +++ b/servo/components/style/values/specified/image.rs @@ -54,7 +54,7 @@ pub type GradientKind = GenericGradientKind< >; /// A specified gradient line direction. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum LineDirection { /// An angular direction. diff --git a/servo/components/style/values/specified/length.rs b/servo/components/style/values/specified/length.rs index d117593738c7..331901bf8c64 100644 --- a/servo/components/style/values/specified/length.rs +++ b/servo/components/style/values/specified/length.rs @@ -531,7 +531,7 @@ impl NoCalcLength { /// This is commonly used for the `` values. /// /// https://drafts.csswg.org/css-values/#lengths -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum Length { /// The internal length type that cannot parse `calc` @@ -549,15 +549,6 @@ impl From for Length { } } -impl HasViewportPercentage for Length { - fn has_viewport_percentage(&self) -> bool { - match *self { - Length::NoCalc(ref inner) => inner.has_viewport_percentage(), - Length::Calc(ref calc) => calc.has_viewport_percentage(), - } - } -} - impl ToCss for Length { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -713,7 +704,7 @@ impl Either { /// As of today, only `-moz-image-rect` supports percentages without length. /// This is not a regression, and that's a non-standard extension anyway, so I'm /// not implementing it for now. -#[derive(Clone, PartialEq, Copy, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct Percentage(pub CSSFloat); @@ -754,7 +745,7 @@ impl Parse for Percentage { impl ComputedValueAsSpecified for Percentage {} /// A length or a percentage value. -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum LengthOrPercentage { @@ -786,16 +777,6 @@ impl From for LengthOrPercentage { } } -impl HasViewportPercentage for LengthOrPercentage { - fn has_viewport_percentage(&self) -> bool { - match *self { - LengthOrPercentage::Length(ref length) => length.has_viewport_percentage(), - LengthOrPercentage::Calc(ref calc) => calc.has_viewport_percentage(), - _ => false - } - } -} - impl ToCss for LengthOrPercentage { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -914,7 +895,7 @@ impl LengthOrPercentage { } /// Either a ``, a ``, or the `auto` keyword. -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum LengthOrPercentageOrAuto { @@ -938,16 +919,6 @@ impl From for LengthOrPercentageOrAuto { } } -impl HasViewportPercentage for LengthOrPercentageOrAuto { - fn has_viewport_percentage(&self) -> bool { - match *self { - LengthOrPercentageOrAuto::Length(ref length) => length.has_viewport_percentage(), - LengthOrPercentageOrAuto::Calc(ref calc) => calc.has_viewport_percentage(), - _ => false - } - } -} - impl ToCss for LengthOrPercentageOrAuto { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -1036,7 +1007,7 @@ impl LengthOrPercentageOrAuto { } /// Either a ``, a ``, or the `none` keyword. -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum LengthOrPercentageOrNone { @@ -1046,16 +1017,6 @@ pub enum LengthOrPercentageOrNone { None, } -impl HasViewportPercentage for LengthOrPercentageOrNone { - fn has_viewport_percentage(&self) -> bool { - match *self { - LengthOrPercentageOrNone::Length(ref length) => length.has_viewport_percentage(), - LengthOrPercentageOrNone::Calc(ref calc) => calc.has_viewport_percentage(), - _ => false - } - } -} - impl ToCss for LengthOrPercentageOrNone { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -1133,7 +1094,7 @@ pub type LengthOrAuto = Either; /// Either a `` or a `` or the `auto` keyword or the /// `content` keyword. -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub enum LengthOrPercentageOrAutoOrContent { /// A ``. @@ -1185,16 +1146,6 @@ impl LengthOrPercentageOrAutoOrContent { } } -impl HasViewportPercentage for LengthOrPercentageOrAutoOrContent { - fn has_viewport_percentage(&self) -> bool { - match *self { - LengthOrPercentageOrAutoOrContent::Length(ref length) => length.has_viewport_percentage(), - LengthOrPercentageOrAutoOrContent::Calc(ref calc) => calc.has_viewport_percentage(), - _ => false - } - } -} - impl ToCss for LengthOrPercentageOrAutoOrContent { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -1227,7 +1178,7 @@ impl LengthOrNumber { /// A value suitable for a `min-width` or `min-height` property. /// Unlike `max-width` or `max-height` properties, a MinLength can be /// `auto`, and cannot be `none`. -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum MinLength { @@ -1236,15 +1187,6 @@ pub enum MinLength { ExtremumLength(ExtremumLength), } -impl HasViewportPercentage for MinLength { - fn has_viewport_percentage(&self) -> bool { - match *self { - MinLength::LengthOrPercentage(ref lop) => lop.has_viewport_percentage(), - _ => false - } - } -} - impl ToCss for MinLength { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -1277,7 +1219,7 @@ impl MinLength { } /// A value suitable for a `max-width` or `max-height` property. -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum MaxLength { @@ -1286,14 +1228,6 @@ pub enum MaxLength { ExtremumLength(ExtremumLength), } -impl HasViewportPercentage for MaxLength { - fn has_viewport_percentage(&self) -> bool { - match *self { - MaxLength::LengthOrPercentage(ref lop) => lop.has_viewport_percentage(), - _ => false - } - } -} impl ToCss for MaxLength { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { diff --git a/servo/components/style/values/specified/mod.rs b/servo/components/style/values/specified/mod.rs index 3fb46c473b93..d687c4aaff9d 100644 --- a/servo/components/style/values/specified/mod.rs +++ b/servo/components/style/values/specified/mod.rs @@ -21,7 +21,7 @@ use std::fmt; use std::io::Write; use style_traits::ToCss; use style_traits::values::specified::AllowedNumericType; -use super::{Auto, CSSFloat, CSSInteger, HasViewportPercentage, Either, None_}; +use super::{Auto, CSSFloat, CSSInteger, Either, None_}; use super::computed::{self, Context}; use super::computed::{Shadow as ComputedShadow, ToComputedValue}; use super::generics::BorderRadiusSize as GenericBorderRadiusSize; @@ -76,8 +76,6 @@ impl ComputedValueAsSpecified for SpecifiedUrl {} no_viewport_percentage!(SpecifiedUrl); } -no_viewport_percentage!(i32); // For PropertyDeclaration::Order - #[derive(Clone, PartialEq, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] @@ -289,7 +287,7 @@ impl Parse for BorderRadiusSize { } } -#[derive(Clone, PartialEq, Copy, Debug)] +#[derive(Clone, Copy, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] /// An angle consisting of a value and a unit. /// @@ -455,7 +453,7 @@ pub fn parse_border_width(context: &ParserContext, input: &mut Parser) -> Result }) } -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub enum BorderWidth { @@ -507,15 +505,6 @@ impl ToCss for BorderWidth { } } -impl HasViewportPercentage for BorderWidth { - fn has_viewport_percentage(&self) -> bool { - match *self { - BorderWidth::Thin | BorderWidth::Medium | BorderWidth::Thick => false, - BorderWidth::Width(ref length) => length.has_viewport_percentage() - } - } -} - impl ToComputedValue for BorderWidth { type ComputedValue = Au; @@ -950,7 +939,7 @@ pub type TrackList = GenericTrackList; /// ` | none` pub type TrackListOrNone = Either; -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] pub struct Shadow { @@ -962,15 +951,6 @@ pub struct Shadow { pub inset: bool, } -impl HasViewportPercentage for Shadow { - fn has_viewport_percentage(&self) -> bool { - self.offset_x.has_viewport_percentage() || - self.offset_y.has_viewport_percentage() || - self.blur_radius.has_viewport_percentage() || - self.spread_radius.has_viewport_percentage() - } -} - impl ToComputedValue for Shadow { type ComputedValue = ComputedShadow; @@ -1230,16 +1210,7 @@ impl LengthOrPercentageOrNumber { } } -impl HasViewportPercentage for ClipRect { - fn has_viewport_percentage(&self) -> bool { - self.top.as_ref().map_or(false, |x| x.has_viewport_percentage()) || - self.right.as_ref().map_or(false, |x| x.has_viewport_percentage()) || - self.bottom.as_ref().map_or(false, |x| x.has_viewport_percentage()) || - self.left.as_ref().map_or(false, |x| x.has_viewport_percentage()) - } -} - -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] /// rect(, , , ) used by clip and image-region pub struct ClipRect { diff --git a/servo/components/style_derive/Cargo.toml b/servo/components/style_derive/Cargo.toml new file mode 100644 index 000000000000..d56f32256897 --- /dev/null +++ b/servo/components/style_derive/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "style_derive" +version = "0.0.1" +authors = ["The Servo Project Developers"] +license = "MPL-2.0" +publish = false + +[lib] +path = "lib.rs" +proc-macro = true + +[dependencies] +quote = "0.3" +syn = "0.11" +synstructure = "0.5.2" diff --git a/servo/components/style_derive/has_viewport_percentage.rs b/servo/components/style_derive/has_viewport_percentage.rs new file mode 100644 index 000000000000..24e4b919c222 --- /dev/null +++ b/servo/components/style_derive/has_viewport_percentage.rs @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use quote; +use syn; +use synstructure; + +pub fn derive(input: syn::DeriveInput) -> quote::Tokens { + let name = &input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + let mut where_clause = where_clause.clone(); + for param in &input.generics.ty_params { + where_clause.predicates.push(where_predicate(syn::Ty::Path(None, param.ident.clone().into()))) + } + + let style = synstructure::BindStyle::Ref.into(); + let match_body = synstructure::each_variant(&input, &style, |bindings, _| { + let (first, rest) = match bindings.split_first() { + None => return Some(quote!(false)), + Some(pair) => pair, + }; + let mut expr = quote!(::style_traits::HasViewportPercentage::has_viewport_percentage(#first)); + for binding in rest { + where_clause.predicates.push(where_predicate(binding.field.ty.clone())); + expr = quote!(#expr || ::style_traits::HasViewportPercentage::has_viewport_percentage(#binding)); + } + Some(expr) + }); + + quote! { + impl #impl_generics ::style_traits::HasViewportPercentage for #name #ty_generics #where_clause { + #[allow(unused_variables, unused_imports)] + #[inline] + fn has_viewport_percentage(&self) -> bool { + match *self { + #match_body + } + } + } + } +} + +fn where_predicate(ty: syn::Ty) -> syn::WherePredicate { + syn::WherePredicate::BoundPredicate(syn::WhereBoundPredicate { + bound_lifetimes: vec![], + bounded_ty: ty, + bounds: vec![syn::TyParamBound::Trait( + syn::PolyTraitRef { + bound_lifetimes: vec![], + trait_ref: syn::parse_path("::style_traits::HasViewportPercentage").unwrap(), + }, + syn::TraitBoundModifier::None + )], + }) +} diff --git a/servo/components/style_derive/lib.rs b/servo/components/style_derive/lib.rs new file mode 100644 index 000000000000..fd47a962ce9b --- /dev/null +++ b/servo/components/style_derive/lib.rs @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate proc_macro; +#[macro_use] extern crate quote; +extern crate syn; +extern crate synstructure; + +use proc_macro::TokenStream; + +mod has_viewport_percentage; + +#[proc_macro_derive(HasViewportPercentage)] +pub fn derive_has_viewport_percentage(stream: TokenStream) -> TokenStream { + let input = syn::parse_derive_input(&stream.to_string()).unwrap(); + has_viewport_percentage::derive(input).to_string().parse().unwrap() +} diff --git a/servo/components/style_traits/lib.rs b/servo/components/style_traits/lib.rs index 95cd0b3e3ddb..a7c20f051dc4 100644 --- a/servo/components/style_traits/lib.rs +++ b/servo/components/style_traits/lib.rs @@ -63,6 +63,8 @@ pub enum CSSPixel {} pub mod cursor; #[macro_use] pub mod values; +#[macro_use] pub mod viewport; pub use values::{ToCss, OneOrMoreCommaSeparated}; +pub use viewport::HasViewportPercentage; diff --git a/servo/components/style_traits/viewport.rs b/servo/components/style_traits/viewport.rs index 378e17c93c49..05e39f2b3709 100644 --- a/servo/components/style_traits/viewport.rs +++ b/servo/components/style_traits/viewport.rs @@ -20,6 +20,48 @@ define_css_keyword_enum!(Orientation: "portrait" => Portrait, "landscape" => Landscape); +/// A trait used to query whether this value has viewport units. +pub trait HasViewportPercentage { + /// Returns true if this value has viewport units. + fn has_viewport_percentage(&self) -> bool; +} + +/// A macro used to implement HasViewportPercentage trait +/// for a given type that may never contain viewport units. +#[macro_export] +macro_rules! no_viewport_percentage { + ($($name: ident),+) => { + $(impl $crate::HasViewportPercentage for $name { + #[inline] + fn has_viewport_percentage(&self) -> bool { + false + } + })+ + }; +} + +no_viewport_percentage!(bool, f32); + +impl HasViewportPercentage for Box { + #[inline] + fn has_viewport_percentage(&self) -> bool { + (**self).has_viewport_percentage() + } +} + +impl HasViewportPercentage for Option { + #[inline] + fn has_viewport_percentage(&self) -> bool { + self.as_ref().map_or(false, T::has_viewport_percentage) + } +} + +impl HasViewportPercentage for Vec { + #[inline] + fn has_viewport_percentage(&self) -> bool { + self.iter().any(T::has_viewport_percentage) + } +} /// A set of viewport descriptors: /// diff --git a/servo/tests/unit/style/attr.rs b/servo/tests/unit/style/attr.rs index 25fe085a6370..6bf72a5b969e 100644 --- a/servo/tests/unit/style/attr.rs +++ b/servo/tests/unit/style/attr.rs @@ -5,7 +5,6 @@ use app_units::Au; use style::attr::{AttrValue, LengthOrPercentageOrAuto, parse_length}; use style::values::computed::CalcLengthOrPercentage; -use style_traits::values::specified::AllowedLengthType; #[test] fn test_length_calc() { diff --git a/servo/tests/unit/style/restyle_hints.rs b/servo/tests/unit/style/restyle_hints.rs index b2e2cf3e9994..c50cfcc87bb1 100644 --- a/servo/tests/unit/style/restyle_hints.rs +++ b/servo/tests/unit/style/restyle_hints.rs @@ -6,7 +6,7 @@ fn smoke_restyle_hints() { use cssparser::Parser; use selectors::parser::SelectorList; - use style::restyle_hints::{DependencySet, RESTYLE_LATER_SIBLINGS}; + use style::restyle_hints::DependencySet; use style::selector_parser::SelectorParser; use style::stylesheets::{Origin, Namespaces}; let namespaces = Namespaces::default(); diff --git a/servo/tests/unit/style/stylist.rs b/servo/tests/unit/style/stylist.rs index 3c136edcef37..42fc3a8f6a06 100644 --- a/servo/tests/unit/style/stylist.rs +++ b/servo/tests/unit/style/stylist.rs @@ -212,7 +212,7 @@ fn test_insert() { #[test] fn test_get_universal_rules() { thread_state::initialize(thread_state::LAYOUT); - let (map, shared_lock) = get_mock_map(&["*|*", "#foo > *|*", "*|* > *|*", ".klass", "#id"]); + let (map, _shared_lock) = get_mock_map(&["*|*", "#foo > *|*", "*|* > *|*", ".klass", "#id"]); let decls = map.get_universal_rules(CascadeLevel::UserNormal);