Bug 1349417 - Part 8: stylo: Serialize system fonts correctly; r?xidorn draft
authorManish Goregaokar <manishearth@gmail.com>
Tue, 21 Mar 2017 20:38:12 -0700
changeset 564175 908b317f9207890fa5ff9ba11406913239cca43f
parent 564174 b7412c05d863397487fb748cd2514658db925750
child 564176 9a962b20cf5b43c401e2f8b789632e95a4d84e9f
push id54548
push userbmo:manishearth@gmail.com
push dateTue, 18 Apr 2017 10:18:30 +0000
reviewersxidorn
bugs1349417
milestone55.0a1
Bug 1349417 - Part 8: stylo: Serialize system fonts correctly; r?xidorn MozReview-Commit-ID: 4q1zZUcw6zF
servo/components/style/properties/longhand/font.mako.rs
servo/components/style/properties/shorthand/font.mako.rs
--- a/servo/components/style/properties/longhand/font.mako.rs
+++ b/servo/components/style/properties/longhand/font.mako.rs
@@ -2098,17 +2098,19 @@ macro_rules! exclusive_value {
 </%helpers:longhand>
 
 
 % if product == "gecko":
     pub mod system_font {
         use app_units::Au;
         use cssparser::Parser;
         use properties::longhands;
+        use std::fmt;
         use std::hash::{Hash, Hasher};
+        use style_traits::ToCss;
         use values::computed::{ToComputedValue, Context};
         <%
             system_fonts = """caption icon menu message-box small-caption status-bar
                               -moz-window -moz-document -moz-workspace -moz-desktop
                               -moz-info -moz-dialog -moz-button -moz-pull-down-menu
                               -moz-list -moz-field""".split()
             kw_font_props = """font_style font_variant_caps font_stretch
                                font_kerning font_variant_position font_variant_alternates
@@ -2119,16 +2121,26 @@ macro_rules! exclusive_value {
         %>
         #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
         pub enum SystemFont {
             % for font in system_fonts:
                 ${to_camel_case(font)},
             % endfor
         }
 
+        impl ToCss for SystemFont {
+            fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+                dest.write_str(match *self {
+                    % for font in system_fonts:
+                        SystemFont::${to_camel_case(font)} => "${font}",
+                    % endfor
+                })
+            }
+        }
+
         // ComputedValues are compared at times
         // so we need these impls. We don't want to
         // add Eq to Number (which contains a float)
         // so instead we have an eq impl which skips the
         // cached values
         impl PartialEq for ComputedSystemFont {
             fn eq(&self, other: &Self) -> bool {
                 self.system_font == other.system_font
--- a/servo/components/style/properties/shorthand/font.mako.rs
+++ b/servo/components/style/properties/shorthand/font.mako.rs
@@ -109,19 +109,61 @@
             % if product == "gecko" or data.testing:
                 % for name in gecko_sub_properties:
                     font_${name}: font_${name}::get_initial_specified_value(),
                 % endfor
             % endif
         })
     }
 
+    enum CheckSystemResult {
+        AllSystem(SystemFont),
+        SomeSystem,
+        None
+    }
+
+    % if product == "gecko":
+        impl<'a> LonghandsToSerialize<'a> {
+            /// Check if some or all members are system fonts
+            fn check_system(&self) -> CheckSystemResult {
+                let mut sys = None;
+                let mut all = true;
+
+                % for prop in SYSTEM_FONT_LONGHANDS:
+                    if let Some(s) = self.${prop}.get_system() {
+                        debug_assert!(sys.is_none() || s == sys.unwrap());
+                        sys = Some(s);
+                    } else {
+                        all = false;
+                    }
+                % endfor
+                if self.line_height != &line_height::get_initial_specified_value() {
+                    all = false
+                }
+                if all {
+                    CheckSystemResult::AllSystem(sys.unwrap())
+                } else if sys.is_some() {
+                    CheckSystemResult::SomeSystem
+                } else {
+                    CheckSystemResult::None
+                }
+            }
+        }
+    % endif
+
     // This may be a bit off, unsure, possibly needs changes
     impl<'a> ToCss for LonghandsToSerialize<'a>  {
         fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+            % if product == "gecko":
+                match self.check_system() {
+                    CheckSystemResult::AllSystem(sys) => return sys.to_css(dest),
+                    CheckSystemResult::SomeSystem => return Ok(()),
+                    CheckSystemResult::None => ()
+                }
+            % endif
 
     % if product == "gecko" or data.testing:
         % for name in gecko_sub_properties:
             if self.font_${name} != &font_${name}::get_initial_specified_value() {
                 return Ok(());
             }
         % endfor
     % endif