diff options
-rw-r--r-- | components/style/properties/longhand/text.mako.rs | 71 | ||||
-rw-r--r-- | tests/unit/style/parsing/mod.rs | 1 | ||||
-rw-r--r-- | tests/unit/style/parsing/text.rs | 26 |
3 files changed, 98 insertions, 0 deletions
diff --git a/components/style/properties/longhand/text.mako.rs b/components/style/properties/longhand/text.mako.rs index 710150341d2..361ac238743 100644 --- a/components/style/properties/longhand/text.mako.rs +++ b/components/style/properties/longhand/text.mako.rs @@ -230,3 +230,74 @@ ${helpers.predefined_type( products="gecko", animatable=True, spec="https://drafts.csswg.org/css-text-decor/#propdef-text-decoration-color")} + +<%helpers:longhand name="initial-letter" + animatable="False" + products="none" + 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}; + + impl ComputedValueAsSpecified for SpecifiedValue {} + no_viewport_percentage!(SpecifiedValue); + + #[derive(PartialEq, Clone, Debug)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + pub enum SpecifiedValue { + Normal, + Specified(Number, Option<Integer>) + } + + pub mod computed_value { + pub use super::SpecifiedValue as T; + } + + impl ToCss for SpecifiedValue { + fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + match *self { + SpecifiedValue::Normal => try!(dest.write_str("normal")), + SpecifiedValue::Specified(size, sink) => { + try!(size.to_css(dest)); + if let Some(sink) = sink { + try!(dest.write_str(" ")); + try!(sink.to_css(dest)); + } + } + }; + + Ok(()) + } + } + + #[inline] + pub fn get_initial_value() -> computed_value::T { + computed_value::T::Normal + } + + #[inline] + pub fn get_initial_specified_value() -> SpecifiedValue { + SpecifiedValue::Normal + } + + /// normal | <number> <integer>? + pub fn parse(context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue, ()> { + if input.try(|input| input.expect_ident_matching("normal")).is_ok() { + return Ok(SpecifiedValue::Normal); + } + + let size = try!(Number::parse_at_least_one(input)); + + match input.try(|input| Integer::parse(context, input)) { + Ok(number) => { + if number.value() < 1 { + return Err(()); + } + Ok(SpecifiedValue::Specified(size, Some(number))) + } + Err(()) => Ok(SpecifiedValue::Specified(size, None)), + } + } +</%helpers:longhand> diff --git a/tests/unit/style/parsing/mod.rs b/tests/unit/style/parsing/mod.rs index 40899ab40c4..cb5181fc6cc 100644 --- a/tests/unit/style/parsing/mod.rs +++ b/tests/unit/style/parsing/mod.rs @@ -99,6 +99,7 @@ mod outline; mod position; mod selectors; mod supports; +mod text; mod text_overflow; mod transition_timing_function; mod ui; diff --git a/tests/unit/style/parsing/text.rs b/tests/unit/style/parsing/text.rs new file mode 100644 index 00000000000..d1646c0b887 --- /dev/null +++ b/tests/unit/style/parsing/text.rs @@ -0,0 +1,26 @@ +/* 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 cssparser::Parser; +use media_queries::CSSErrorReporterTest; +use parsing::parse; +use style::parser::ParserContext; +use style::stylesheets::Origin; +use style_traits::ToCss; + +#[test] +fn initial_letter_should_be_parsed_correctly() { + use style::properties::longhands::initial_letter; + + assert_roundtrip_with_context!(initial_letter::parse, "1.5"); + assert_roundtrip_with_context!(initial_letter::parse, "1.5 3"); + assert_roundtrip_with_context!(initial_letter::parse, "normal"); +} + +#[test] +fn initial_letter_doesnt_parse_invalid_input() { + use style::properties::longhands::initial_letter; + + assert!(parse(initial_letter::parse, "1.5x 5").is_err()); +} |