aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/properties/longhand/text.mako.rs71
-rw-r--r--tests/unit/style/parsing/mod.rs1
-rw-r--r--tests/unit/style/parsing/text.rs26
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());
+}