From 6cf87d23f809e2945d8d285bea00033fe361f01a Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Tue, 9 Jul 2019 08:59:27 +0000 Subject: [PATCH] style: Add an 'auto' value for the CSS 'quotes' property, and make it use language-dependent quote marks. Differential Revision: https://phabricator.services.mozilla.com/D36429 --- components/style/values/computed/list.rs | 20 ++---------- components/style/values/computed/mod.rs | 2 +- components/style/values/specified/list.rs | 40 ++++++++++++++++++++--- components/style/values/specified/mod.rs | 2 +- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/components/style/values/computed/list.rs b/components/style/values/computed/list.rs index bdcf62ba2f8..2ae3776041b 100644 --- a/components/style/values/computed/list.rs +++ b/components/style/values/computed/list.rs @@ -7,28 +7,12 @@ #[cfg(feature = "gecko")] pub use crate::values::specified::list::ListStyleType; pub use crate::values::specified::list::MozListReversed; -pub use crate::values::specified::list::{QuotePair, Quotes}; - -lazy_static! { - static ref INITIAL_QUOTES: crate::ArcSlice = crate::ArcSlice::from_iter_leaked( - vec![ - QuotePair { - opening: "\u{201c}".to_owned().into(), - closing: "\u{201d}".to_owned().into(), - }, - QuotePair { - opening: "\u{2018}".to_owned().into(), - closing: "\u{2019}".to_owned().into(), - }, - ] - .into_iter() - ); -} +pub use crate::values::specified::list::Quotes; impl Quotes { /// Initial value for `quotes`. #[inline] pub fn get_initial_value() -> Quotes { - Quotes(INITIAL_QUOTES.clone()) + Quotes::Auto } } diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index cea768abeff..aa37189f051 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -64,7 +64,7 @@ pub use self::length::{NonNegativeLengthPercentage, NonNegativeLengthPercentageO #[cfg(feature = "gecko")] pub use self::list::ListStyleType; pub use self::list::MozListReversed; -pub use self::list::{QuotePair, Quotes}; +pub use self::list::Quotes; pub use self::motion::{OffsetPath, OffsetRotate}; pub use self::outline::OutlineStyle; pub use self::percentage::{NonNegativePercentage, Percentage}; diff --git a/components/style/values/specified/list.rs b/components/style/values/specified/list.rs index 0519053b902..f5bda33ce73 100644 --- a/components/style/values/specified/list.rs +++ b/components/style/values/specified/list.rs @@ -104,7 +104,7 @@ pub struct QuotePair { pub closing: crate::OwnedStr, } -/// Specified and computed `quotes` property. +/// List of quote pairs for the specified/computed value of `quotes` property. #[derive( Clone, Debug, @@ -117,23 +117,53 @@ pub struct QuotePair { ToResolvedValue, ToShmem, )] -#[repr(C)] -pub struct Quotes( +#[repr(transparent)] +pub struct QuoteList( #[css(iterable, if_empty = "none")] #[ignore_malloc_size_of = "Arc"] pub crate::ArcSlice, ); +/// Specified and computed `quotes` property: `auto`, `none`, or a list +/// of characters. +/// +/// cbindgen:derive-tagged-enum-copy-constructor=true +#[derive( + Clone, + Debug, + MallocSizeOf, + PartialEq, + SpecifiedValueInfo, + ToComputedValue, + ToCss, + ToResolvedValue, + ToShmem, +)] +#[repr(C)] +pub enum Quotes { + /// list of quote pairs + QuoteList(QuoteList), + /// auto (use lang-dependent quote marks) + Auto, +} + impl Parse for Quotes { fn parse<'i, 't>( _: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { + if input + .try(|input| input.expect_ident_matching("auto")) + .is_ok() + { + return Ok(Quotes::Auto); + } + if input .try(|input| input.expect_ident_matching("none")) .is_ok() { - return Ok(Self::default()); + return Ok(Quotes::QuoteList(QuoteList::default())) } let mut quotes = Vec::new(); @@ -150,7 +180,7 @@ impl Parse for Quotes { } if !quotes.is_empty() { - Ok(Quotes(crate::ArcSlice::from_iter(quotes.into_iter()))) + Ok(Quotes::QuoteList(QuoteList(crate::ArcSlice::from_iter(quotes.into_iter())))) } else { Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError)) } diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 14439d2eea0..b22292a9dce 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -65,7 +65,7 @@ pub use self::length::{NonNegativeLengthPercentage, NonNegativeLengthPercentageO #[cfg(feature = "gecko")] pub use self::list::ListStyleType; pub use self::list::MozListReversed; -pub use self::list::{QuotePair, Quotes}; +pub use self::list::Quotes; pub use self::motion::{OffsetPath, OffsetRotate}; pub use self::outline::OutlineStyle; pub use self::percentage::Percentage;