From 4f525f6fa04195cdb93fc4394fbc0c78f2626bd7 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Sun, 30 Jul 2017 13:32:40 +0800 Subject: [PATCH] style: Preserve font-family identifier sequence when serializing. --- components/style/properties/gecko.mako.rs | 20 ++++---- .../style/properties/longhand/font.mako.rs | 46 ++++++++++++++----- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 24bf2471633..22e725a1679 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1782,7 +1782,7 @@ fn static_assert() { } pub fn set_font_family(&mut self, v: longhands::font_family::computed_value::T) { - use properties::longhands::font_family::computed_value::FontFamily; + use properties::longhands::font_family::computed_value::{FontFamily, FamilyNameSyntax}; let list = &mut self.gecko.mFont.fontlist; unsafe { Gecko_FontFamilyList_Clear(list); } @@ -1792,7 +1792,8 @@ fn static_assert() { for family in &v.0 { match *family { FontFamily::FamilyName(ref f) => { - unsafe { Gecko_FontFamilyList_AppendNamed(list, f.name.as_ptr(), f.quoted); } + let quoted = matches!(f.syntax, FamilyNameSyntax::Quoted); + unsafe { Gecko_FontFamilyList_AppendNamed(list, f.name.as_ptr(), quoted); } } FontFamily::Generic(ref name) => { let (family_type, generic) = FontFamily::generic(name); @@ -1819,7 +1820,7 @@ fn static_assert() { } pub fn clone_font_family(&self) -> longhands::font_family::computed_value::T { - use properties::longhands::font_family::computed_value::{FontFamily, FamilyName}; + use properties::longhands::font_family::computed_value::{FontFamily, FamilyName, FamilyNameSyntax}; use gecko_bindings::structs::FontFamilyType; use gecko_string_cache::Atom; @@ -1832,13 +1833,16 @@ fn static_assert() { FontFamilyType::eFamily_cursive => FontFamily::Generic(atom!("cursive")), FontFamilyType::eFamily_fantasy => FontFamily::Generic(atom!("fantasy")), FontFamilyType::eFamily_moz_fixed => FontFamily::Generic(Atom::from("-moz-fixed")), - FontFamilyType::eFamily_named => FontFamily::FamilyName(FamilyName { - name: (&*gecko_font_family_name.mName).into(), - quoted: false - }), + FontFamilyType::eFamily_named => { + let name = Atom::from(&*gecko_font_family_name.mName); + FontFamily::FamilyName(FamilyName { + name: name.clone(), + syntax: FamilyNameSyntax::Identifiers(vec![name]), + }) + }, FontFamilyType::eFamily_named_quoted => FontFamily::FamilyName(FamilyName { name: (&*gecko_font_family_name.mName).into(), - quoted: true + syntax: FamilyNameSyntax::Quoted, }), x => panic!("Found unexpected font FontFamilyType: {:?}", x), } diff --git a/components/style/properties/longhand/font.mako.rs b/components/style/properties/longhand/font.mako.rs index f6b78a91749..e47600a8a4e 100644 --- a/components/style/properties/longhand/font.mako.rs +++ b/components/style/properties/longhand/font.mako.rs @@ -96,7 +96,14 @@ macro_rules! impl_gecko_keyword_conversions { #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] pub struct FamilyName { pub name: Atom, - pub quoted: bool, + pub syntax: FamilyNameSyntax, + } + + #[derive(Debug, PartialEq, Eq, Clone, Hash)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] + pub enum FamilyNameSyntax { + Quoted, + Identifiers(Vec), } impl FontFamily { @@ -139,7 +146,7 @@ macro_rules! impl_gecko_keyword_conversions { // quoted by default. FontFamily::FamilyName(FamilyName { name: input, - quoted: true, + syntax: FamilyNameSyntax::Quoted, }) } @@ -148,10 +155,14 @@ macro_rules! impl_gecko_keyword_conversions { if let Ok(value) = input.try(|i| i.expect_string_cloned()) { return Ok(FontFamily::FamilyName(FamilyName { name: Atom::from(&*value), - quoted: true, + syntax: FamilyNameSyntax::Quoted, })) } + + let mut identifiers = vec![]; + let first_ident = input.expect_ident()?.clone(); + identifiers.push(Atom::from(&*first_ident)); // FIXME(bholley): The fast thing to do here would be to look up the // string (as lowercase) in the static atoms table. We don't have an @@ -188,14 +199,16 @@ macro_rules! impl_gecko_keyword_conversions { let ident = input.expect_ident()?; value.push_str(" "); value.push_str(&ident); + identifiers.push(Atom::from(&*ident.clone())); } while let Ok(ident) = input.try(|i| i.expect_ident_cloned()) { value.push_str(" "); value.push_str(&ident); + identifiers.push(Atom::from(&*ident)); } Ok(FontFamily::FamilyName(FamilyName { name: Atom::from(value), - quoted: false, + syntax: FamilyNameSyntax::Identifiers(identifiers), })) } @@ -229,12 +242,23 @@ macro_rules! impl_gecko_keyword_conversions { impl ToCss for FamilyName { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - if self.quoted { - dest.write_char('"')?; - write!(CssStringWriter::new(dest), "{}", self.name)?; - dest.write_char('"') - } else { - serialize_identifier(&*self.name.to_string(), dest) + match self.syntax { + FamilyNameSyntax::Quoted => { + dest.write_char('"')?; + write!(CssStringWriter::new(dest), "{}", self.name)?; + dest.write_char('"') + } + FamilyNameSyntax::Identifiers(ref identifiers) => { + let mut first = true; + for identifier in identifiers { + if !first { + dest.write_char(' ')?; + } + serialize_identifier(&*identifier.to_string(), dest)?; + first = false; + } + Ok(()) + } } } } @@ -2471,7 +2495,7 @@ ${helpers.single_keyword("-moz-math-variant", use properties::longhands::font_family::computed_value::*; FontFamily::FamilyName(FamilyName { name: (&*font.mName).into(), - quoted: true + syntax: FamilyNameSyntax::Quoted, }) }).collect::>(); let weight = longhands::font_weight::computed_value::T::from_gecko_weight(system.weight);