diff --git a/components/style/properties/shorthand/font.mako.rs b/components/style/properties/shorthand/font.mako.rs index a94c2efa7c1..19ec505ee0c 100644 --- a/components/style/properties/shorthand/font.mako.rs +++ b/components/style/properties/shorthand/font.mako.rs @@ -6,18 +6,18 @@ <%helpers:shorthand name="font" sub_properties="font-style font-variant font-weight font-stretch font-size line-height font-family - ${'font-size-adjust' if product == 'gecko' else ''} - ${'font-kerning' if product == 'gecko' else ''} - ${'font-variant-caps' if product == 'gecko' else ''} - ${'font-variant-position' if product == 'gecko' else ''} - ${'font-language-override' if product == 'none' else ''}" + ${'font-size-adjust' if product == 'gecko' or data.testing else ''} + ${'font-kerning' if product == 'gecko' or data.testing else ''} + ${'font-variant-caps' if product == 'gecko' or data.testing else ''} + ${'font-variant-position' if product == 'gecko' or data.testing else ''} + ${'font-language-override' if data.testing else ''}" spec="https://drafts.csswg.org/css-fonts-3/#propdef-font"> use properties::longhands::{font_style, font_variant, font_weight, font_stretch}; use properties::longhands::{font_size, line_height}; - % if product == "gecko": + % if product == "gecko" or data.testing: use properties::longhands::{font_size_adjust, font_kerning, font_variant_caps, font_variant_position}; % endif - % if product == "none": + % if data.testing: use properties::longhands::font_language_override; % endif use properties::longhands::font_family::SpecifiedValue as FontFamily; @@ -83,12 +83,12 @@ % endfor line_height: unwrap_or_initial!(line_height), font_family: family, - % if product == "gecko": + % if product == "gecko" or data.testing: % for name in "size_adjust kerning variant_caps variant_position".split(): font_${name}: font_${name}::get_initial_specified_value(), % endfor % endif - % if product == "none": + % if data.testing: font_language_override: font_language_override::get_initial_specified_value(), % endif }) @@ -97,16 +97,28 @@ // This may be a bit off, unsure, possibly needs changes impl<'a> ToCss for LonghandsToSerialize<'a> { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - self.font_style.to_css(dest)?; - dest.write_str(" ")?; - self.font_variant.to_css(dest)?; - dest.write_str(" ")?; - self.font_weight.to_css(dest)?; - dest.write_str(" ")?; - self.font_stretch.to_css(dest)?; + + % if product == "gecko" or data.testing: + % for name in "size_adjust kerning variant_caps variant_position".split(): + if self.font_${name} != &font_${name}::get_initial_specified_value() { + return Ok(()); + } + % endfor + % endif + + % if data.testing: + if self.font_language_override != &font_language_override::get_initial_specified_value() { + return Ok(()); + } + % endif + + % for name in "style variant weight stretch".split(): + self.font_${name}.to_css(dest)?; dest.write_str(" ")?; + % endfor self.font_size.to_css(dest)?; + match *self.line_height { line_height::SpecifiedValue::Normal => {}, _ => { @@ -116,7 +128,9 @@ } dest.write_str(" ")?; - self.font_family.to_css(dest) + self.font_family.to_css(dest)?; + + Ok(()) } } diff --git a/tests/unit/style/properties/serialization.rs b/tests/unit/style/properties/serialization.rs index d1dc87ce011..962db4f63d5 100644 --- a/tests/unit/style/properties/serialization.rs +++ b/tests/unit/style/properties/serialization.rs @@ -608,51 +608,58 @@ mod shorthand_serialization { assert_eq!(serialization, "flex-flow: row wrap;"); } - // TODO: Populate Atom Cache for testing so that the font shorthand can be tested - /* mod font { use super::*; - use style::properties::longhands::font_family::computed_value::T as FamilyContainer; - use style::properties::longhands::font_family::computed_value::FontFamily; - use style::properties::longhands::font_style::computed_value::T as FontStyle; - use style::properties::longhands::font_variant::computed_value::T as FontVariant; - use style::properties::longhands::font_weight::SpecifiedValue as FontWeight; - use style::properties::longhands::font_size::SpecifiedValue as FontSizeContainer; - use style::properties::longhands::font_stretch::computed_value::T as FontStretch; - use style::properties::longhands::line_height::SpecifiedValue as LineHeight; + + #[test] + fn font_should_serialize_to_empty_if_there_are_nondefault_subproperties() { + // Test with non-default font-kerning value + let block_text = "font-style: italic; \ + font-variant: normal; \ + font-weight: bolder; \ + font-stretch: expanded; \ + font-size: 4px; \ + line-height: 3; \ + font-family: serif; \ + font-size-adjust: none; \ + font-variant-caps: normal; \ + font-variant-position: normal; \ + font-language-override: normal; \ + font-kerning: none"; + + let block = parse_declaration_block(block_text); + + let mut s = String::new(); + let id = PropertyId::parse("font".into()).unwrap(); + let x = block.property_value_to_css(&id, &mut s); + + assert_eq!(x.is_ok(), true); + assert_eq!(s, ""); + } #[test] fn font_should_serialize_all_available_properties() { - let mut properties = Vec::new(); + let block_text = "font-style: italic; \ + font-variant: normal; \ + font-weight: bolder; \ + font-stretch: expanded; \ + font-size: 4px; \ + line-height: 3; \ + font-family: serif; \ + font-size-adjust: none; \ + font-kerning: auto; \ + font-variant-caps: normal; \ + font-variant-position: normal; \ + font-language-override: normal;"; + let block = parse_declaration_block(block_text); - let font_family = DeclaredValue::Value( - FamilyContainer(vec![FontFamily::Generic(atom!("serif"))]) - ); + let serialization = block.to_css_string(); - - let font_style = DeclaredValue::Value(FontStyle::italic); - let font_variant = DeclaredValue::Value(FontVariant::normal); - let font_weight = DeclaredValue::Value(FontWeight::Bolder); - let font_size = DeclaredValue::Value(FontSizeContainer( - LengthOrPercentage::Length(NoCalcLength::from_px(4f32))) - ); - let font_stretch = DeclaredValue::Value(FontStretch::expanded); - let line_height = DeclaredValue::Value(LineHeight::Number(3f32)); - - properties.push(PropertyDeclaration::FontFamily(font_family)); - properties.push(PropertyDeclaration::FontStyle(font_style)); - properties.push(PropertyDeclaration::FontVariant(font_variant)); - properties.push(PropertyDeclaration::FontWeight(font_weight)); - properties.push(PropertyDeclaration::FontSize(font_size)); - properties.push(PropertyDeclaration::FontStretch(font_stretch)); - properties.push(PropertyDeclaration::LineHeight(line_height)); - - let serialization = shorthand_properties_to_string(properties); - assert_eq!(serialization, "font:;"); + assert_eq!(serialization, "font: italic normal bolder expanded 4px/3 serif;"); } + } - */ mod background { use super::*;