diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 5b87bdc853d..c03e64e316c 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -680,6 +680,25 @@ impl Debug for ${style_struct.gecko_struct_name} { %endif +<%def name="impl_simple_type_with_conversion(ident, gecko_ffi_name=None)"> + <% + if gecko_ffi_name is None: + gecko_ffi_name = "m" + to_camel_case(ident) + %> + + #[allow(non_snake_case)] + pub fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) { + self.gecko.${gecko_ffi_name} = From::from(v) + } + + <% impl_simple_copy(ident, gecko_ffi_name) %> + + #[allow(non_snake_case)] + pub fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T { + From::from(self.gecko.${gecko_ffi_name}) + } + + <%def name="raw_impl_trait(style_struct, skip_longhands='', skip_additionals='')"> <% longhands = [x for x in style_struct.longhands @@ -998,17 +1017,19 @@ fn static_assert() { % endfor } + <% + border_image_repeat_keywords = ["Stretch", "Repeat", "Round", "Space"] + %> + pub fn set_border_image_repeat(&mut self, v: longhands::border_image_repeat::computed_value::T) { use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; - use gecko_bindings::structs::{NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH, NS_STYLE_BORDER_IMAGE_REPEAT_REPEAT}; - use gecko_bindings::structs::{NS_STYLE_BORDER_IMAGE_REPEAT_ROUND, NS_STYLE_BORDER_IMAGE_REPEAT_SPACE}; + use gecko_bindings::structs; % for i, side in enumerate(["H", "V"]): let k = match v.${i} { - RepeatKeyword::Stretch => NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH, - RepeatKeyword::Repeat => NS_STYLE_BORDER_IMAGE_REPEAT_REPEAT, - RepeatKeyword::Round => NS_STYLE_BORDER_IMAGE_REPEAT_ROUND, - RepeatKeyword::Space => NS_STYLE_BORDER_IMAGE_REPEAT_SPACE, + % for keyword in border_image_repeat_keywords: + RepeatKeyword::${keyword} => structs::NS_STYLE_BORDER_IMAGE_REPEAT_${keyword.upper()}, + % endfor }; self.gecko.mBorderImageRepeat${side} = k as u8; @@ -1020,6 +1041,21 @@ fn static_assert() { self.gecko.mBorderImageRepeatV = other.gecko.mBorderImageRepeatV; } + pub fn clone_border_image_repeat(&self) -> longhands::border_image_repeat::computed_value::T { + use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; + use gecko_bindings::structs; + + % for side in ["H", "V"]: + let servo_${side.lower()} = match self.gecko.mBorderImageRepeat${side} as u32 { + % for keyword in border_image_repeat_keywords: + structs::NS_STYLE_BORDER_IMAGE_REPEAT_${keyword.upper()} => RepeatKeyword::${keyword}, + % endfor + x => panic!("Found unexpected value in mBorderImageRepeat${side}: {:?}", x), + }; + % endfor + longhands::border_image_repeat::computed_value::T(servo_h, servo_v) + } + pub fn set_border_image_width(&mut self, v: longhands::border_image_width::computed_value::T) { use values::generics::border::BorderImageSideWidth; @@ -1134,53 +1170,11 @@ fn static_assert() { } } - pub fn set_align_content(&mut self, v: longhands::align_content::computed_value::T) { - self.gecko.mAlignContent = v.bits() - } - - ${impl_simple_copy('align_content', 'mAlignContent')} - - pub fn set_justify_content(&mut self, v: longhands::justify_content::computed_value::T) { - self.gecko.mJustifyContent = v.bits() - } - - ${impl_simple_copy('justify_content', 'mJustifyContent')} - - pub fn set_align_self(&mut self, v: longhands::align_self::computed_value::T) { - self.gecko.mAlignSelf = v.0.bits() - } - - ${impl_simple_copy('align_self', 'mAlignSelf')} - - pub fn set_justify_self(&mut self, v: longhands::justify_self::computed_value::T) { - self.gecko.mJustifySelf = v.0.bits() - } - - ${impl_simple_copy('justify_self', 'mJustifySelf')} - - pub fn set_align_items(&mut self, v: longhands::align_items::computed_value::T) { - self.gecko.mAlignItems = v.0.bits() - } - - ${impl_simple_copy('align_items', 'mAlignItems')} - - pub fn clone_align_items(&self) -> longhands::align_items::computed_value::T { - use values::specified::align::{AlignFlags, AlignItems}; - AlignItems(AlignFlags::from_bits(self.gecko.mAlignItems) - .expect("mAlignItems contains valid flags")) - } - - pub fn set_justify_items(&mut self, v: longhands::justify_items::computed_value::T) { - self.gecko.mJustifyItems = v.0.bits() - } - - ${impl_simple_copy('justify_items', 'mJustifyItems')} - - pub fn clone_justify_items(&self) -> longhands::justify_items::computed_value::T { - use values::specified::align::{AlignFlags, JustifyItems}; - JustifyItems(AlignFlags::from_bits(self.gecko.mJustifyItems) - .expect("mJustifyItems contains valid flags")) - } + % for kind in ["align", "justify"]: + ${impl_simple_type_with_conversion(kind + "_content")} + ${impl_simple_type_with_conversion(kind + "_self")} + ${impl_simple_type_with_conversion(kind + "_items")} + % endfor pub fn set_order(&mut self, v: longhands::order::computed_value::T) { self.gecko.mOrder = v; @@ -1372,27 +1366,7 @@ fn static_assert() { } % endfor - pub fn set_grid_auto_flow(&mut self, v: longhands::grid_auto_flow::computed_value::T) { - use gecko_bindings::structs::NS_STYLE_GRID_AUTO_FLOW_ROW; - use gecko_bindings::structs::NS_STYLE_GRID_AUTO_FLOW_COLUMN; - use gecko_bindings::structs::NS_STYLE_GRID_AUTO_FLOW_DENSE; - use properties::longhands::grid_auto_flow::computed_value::AutoFlow::{Row, Column}; - - self.gecko.mGridAutoFlow = 0; - - let value = match v.autoflow { - Row => NS_STYLE_GRID_AUTO_FLOW_ROW, - Column => NS_STYLE_GRID_AUTO_FLOW_COLUMN, - }; - - self.gecko.mGridAutoFlow |= value as u8; - - if v.dense { - self.gecko.mGridAutoFlow |= NS_STYLE_GRID_AUTO_FLOW_DENSE as u8; - } - } - - ${impl_simple_copy('grid_auto_flow', 'mGridAutoFlow')} + ${impl_simple_type_with_conversion("grid_auto_flow")} pub fn set_grid_template_areas(&mut self, v: longhands::grid_template_areas::computed_value::T) { use gecko_bindings::bindings::Gecko_NewGridTemplateAreasValue; @@ -1814,21 +1788,7 @@ fn static_assert() { unsafe { transmute(self.gecko.mFont.weight) } } - pub fn set_font_synthesis(&mut self, v: longhands::font_synthesis::computed_value::T) { - use gecko_bindings::structs::{NS_FONT_SYNTHESIS_WEIGHT, NS_FONT_SYNTHESIS_STYLE}; - - self.gecko.mFont.synthesis = 0; - if v.weight { - self.gecko.mFont.synthesis |= NS_FONT_SYNTHESIS_WEIGHT as u8; - } - if v.style { - self.gecko.mFont.synthesis |= NS_FONT_SYNTHESIS_STYLE as u8; - } - } - - pub fn copy_font_synthesis_from(&mut self, other: &Self) { - self.gecko.mFont.synthesis = other.gecko.mFont.synthesis; - } + ${impl_simple_type_with_conversion("font_synthesis", "mFont.synthesis")} pub fn set_font_size_adjust(&mut self, v: longhands::font_size_adjust::computed_value::T) { use properties::longhands::font_size_adjust::computed_value::T; @@ -1863,10 +1823,7 @@ fn static_assert() { } } - pub fn set_font_language_override(&mut self, v: longhands::font_language_override::computed_value::T) { - self.gecko.mFont.languageOverride = v.0; - } - ${impl_simple_copy('font_language_override', 'mFont.languageOverride')} + <% impl_simple_type_with_conversion("font_language_override", "mFont.languageOverride") %> pub fn set_font_variant_alternates(&mut self, v: longhands::font_variant_alternates::computed_value::T) { self.gecko.mFont.variantAlternates = v.to_gecko_keyword() @@ -1879,23 +1836,9 @@ fn static_assert() { // self.gecko.mFont.alternateValues = other.gecko.mFont.alternateValues; } - pub fn set_font_variant_ligatures(&mut self, v: longhands::font_variant_ligatures::computed_value::T) { - self.gecko.mFont.variantLigatures = v.to_gecko_keyword() - } - - ${impl_simple_copy('font_variant_ligatures', 'mFont.variantLigatures')} - - pub fn set_font_variant_east_asian(&mut self, v: longhands::font_variant_east_asian::computed_value::T) { - self.gecko.mFont.variantEastAsian = v.to_gecko_keyword() - } - - ${impl_simple_copy('font_variant_east_asian', 'mFont.variantEastAsian')} - - pub fn set_font_variant_numeric(&mut self, v: longhands::font_variant_numeric::computed_value::T) { - self.gecko.mFont.variantNumeric = v.to_gecko_keyword() - } - - ${impl_simple_copy('font_variant_numeric', 'mFont.variantNumeric')} + ${impl_simple_type_with_conversion("font_variant_ligatures", "mFont.variantLigatures")} + ${impl_simple_type_with_conversion("font_variant_east_asian", "mFont.variantEastAsian")} + ${impl_simple_type_with_conversion("font_variant_numeric", "mFont.variantNumeric")} #[allow(non_snake_case)] pub fn set__moz_min_font_size_ratio(&mut self, v: longhands::_moz_min_font_size_ratio::computed_value::T) { @@ -2654,7 +2597,7 @@ fn static_assert() { <% scroll_snap_type_keyword = Keyword("scroll-snap-type", "none mandatory proximity") %> - ${impl_keyword('scroll_snap_type_y', 'mScrollSnapTypeY', scroll_snap_type_keyword, need_clone=False)} + ${impl_keyword('scroll_snap_type_y', 'mScrollSnapTypeY', scroll_snap_type_keyword, need_clone=True)} pub fn set_perspective_origin(&mut self, v: longhands::perspective_origin::computed_value::T) { self.gecko.mPerspectiveOrigin[0].set(v.horizontal); @@ -2855,11 +2798,7 @@ fn static_assert() { ${impl_simple_copy("contain", "mContain")} - pub fn set_touch_action(&mut self, v: longhands::touch_action::computed_value::T) { - self.gecko.mTouchAction = v.bits(); - } - - ${impl_simple_copy("touch_action", "mTouchAction")} + ${impl_simple_type_with_conversion("touch_action")} <%def name="simple_image_array_property(name, shorthand, field_name)"> @@ -3637,7 +3576,7 @@ fn static_assert() { <%self:impl_trait style_struct_name="InheritedText" skip_longhands="text-align text-emphasis-style text-shadow line-height letter-spacing word-spacing - -webkit-text-stroke-width text-emphasis-position -moz-tab-size -moz-text-size-adjust"> + -webkit-text-stroke-width text-emphasis-position -moz-tab-size"> <% text_align_keyword = Keyword("text-align", "start end left right center justify -moz-center -moz-left -moz-right char", @@ -3744,25 +3683,7 @@ fn static_assert() { } } - pub fn set_text_emphasis_position(&mut self, v: longhands::text_emphasis_position::computed_value::T) { - use properties::longhands::text_emphasis_position::*; - - let mut result = match v.0 { - HorizontalWritingModeValue::Over => structs::NS_STYLE_TEXT_EMPHASIS_POSITION_OVER as u8, - HorizontalWritingModeValue::Under => structs::NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER as u8, - }; - match v.1 { - VerticalWritingModeValue::Right => { - result |= structs::NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT as u8; - } - VerticalWritingModeValue::Left => { - result |= structs::NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT as u8; - } - } - self.gecko.mTextEmphasisPosition = result; - } - - <%call expr="impl_simple_copy('text_emphasis_position', 'mTextEmphasisPosition')"> + ${impl_simple_type_with_conversion("text_emphasis_position")} pub fn set_text_emphasis_style(&mut self, v: longhands::text_emphasis_style::computed_value::T) { use properties::longhands::text_emphasis_style::computed_value::T; @@ -3804,7 +3725,7 @@ fn static_assert() { self.gecko.mTextEmphasisStyle = other.gecko.mTextEmphasisStyle; } - <%call expr="impl_app_units('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth', need_clone=False)"> + <%call expr="impl_app_units('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth', need_clone=True)"> #[allow(non_snake_case)] pub fn set__moz_tab_size(&mut self, v: longhands::_moz_tab_size::computed_value::T) { @@ -3832,39 +3753,13 @@ fn static_assert() { } <%call expr="impl_coord_copy('_moz_tab_size', 'mTabSize')"> - - <% text_size_adjust_keyword = Keyword("text-size-adjust", "auto none") %> - - ${impl_keyword('_moz_text_size_adjust', 'mTextSizeAdjust', text_size_adjust_keyword, need_clone=False)} - <%self:impl_trait style_struct_name="Text" skip_longhands="text-decoration-line text-overflow initial-letter" skip_additionals="*"> - pub fn set_text_decoration_line(&mut self, v: longhands::text_decoration_line::computed_value::T) { - let mut bits: u8 = 0; - if v.contains(longhands::text_decoration_line::UNDERLINE) { - bits |= structs::NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE as u8; - } - if v.contains(longhands::text_decoration_line::OVERLINE) { - bits |= structs::NS_STYLE_TEXT_DECORATION_LINE_OVERLINE as u8; - } - if v.contains(longhands::text_decoration_line::LINE_THROUGH) { - bits |= structs::NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH as u8; - } - if v.contains(longhands::text_decoration_line::BLINK) { - bits |= structs::NS_STYLE_TEXT_DECORATION_LINE_BLINK as u8; - } - if v.contains(longhands::text_decoration_line::COLOR_OVERRIDE) { - bits |= structs::NS_STYLE_TEXT_DECORATION_LINE_OVERRIDE_ALL as u8; - } - self.gecko.mTextDecorationLine = bits; - } - - ${impl_simple_copy('text_decoration_line', 'mTextDecorationLine')} - + ${impl_simple_type_with_conversion("text_decoration_line")} fn clear_overflow_sides_if_string(&mut self) { use gecko_bindings::structs::nsStyleTextOverflowSide; @@ -3938,6 +3833,18 @@ fn static_assert() { self.gecko.mInitialLetterSink = other.gecko.mInitialLetterSink; } + pub fn clone_initial_letter(&self) -> longhands::initial_letter::computed_value::T { + use values::generics::text::InitialLetter; + + if self.gecko.mInitialLetterSize == 0. && self.gecko.mInitialLetterSink == 0 { + InitialLetter::Normal + } else if self.gecko.mInitialLetterSize.floor() as i32 == self.gecko.mInitialLetterSink { + InitialLetter::Specified(self.gecko.mInitialLetterSize, None) + } else { + InitialLetter::Specified(self.gecko.mInitialLetterSize, Some(self.gecko.mInitialLetterSink)) + } + } + #[inline] pub fn has_underline(&self) -> bool { (self.gecko.mTextDecorationLine & (structs::NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE as u8)) != 0 @@ -4491,12 +4398,7 @@ clip-path <%self:impl_trait style_struct_name="UI" skip_longhands="-moz-force-broken-image-icon"> - #[allow(non_snake_case)] - pub fn set__moz_force_broken_image_icon(&mut self, v: longhands::_moz_force_broken_image_icon::computed_value::T) { - self.gecko.mForceBrokenImageIcon = v.0 as u8; - } - - ${impl_simple_copy("_moz_force_broken_image_icon", "mForceBrokenImageIcon")} + ${impl_simple_type_with_conversion("_moz_force_broken_image_icon", "mForceBrokenImageIcon")} <%self:impl_trait style_struct_name="XUL" @@ -4507,6 +4409,11 @@ clip-path } ${impl_simple_copy("_moz_box_ordinal_group", "mBoxOrdinal")} + + #[allow(non_snake_case)] + pub fn clone__moz_box_ordinal_group(&self) -> i32{ + self.gecko.mBoxOrdinal as i32 + } <%def name="define_ffi_struct_accessor(style_struct)"> diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index 0fd7196baf5..36bedc41754 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -212,7 +212,7 @@ ${helpers.predefined_type("border-image-outset", "LengthOrNumberRect", animation_value_type="none", boxed=True)} -<%helpers:longhand name="border-image-repeat" animation_value_type="none" +<%helpers:longhand name="border-image-repeat" animation_value_type="discrete" spec="https://drafts.csswg.org/css-backgrounds/#border-image-repeat"> use std::fmt; use style_traits::ToCss; diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index 03891fe3b54..44d80cf7b15 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -1612,7 +1612,7 @@ ${helpers.single_keyword("scroll-snap-type-x", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-snap-type-x)", animation_value_type="discrete")} -<%helpers:longhand products="gecko" name="scroll-snap-type-y" animation_value_type="none" +<%helpers:longhand products="gecko" name="scroll-snap-type-y" animation_value_type="discrete" spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-snap-type-x)"> pub use super::scroll_snap_type_x::SpecifiedValue; pub use super::scroll_snap_type_x::computed_value; @@ -1710,7 +1710,7 @@ ${helpers.predefined_type("transform-origin", // FIXME: `size` and `content` values are not implemented and `strict` is implemented // like `content`(layout style paint) in gecko. We should implement `size` and `content`, // also update the glue once they are implemented in gecko. -<%helpers:longhand name="contain" animation_value_type="none" products="gecko" need_clone="True" +<%helpers:longhand name="contain" animation_value_type="discrete" products="gecko" need_clone="True" flags="FIXPOS_CB" spec="https://drafts.csswg.org/css-contain/#contain-property"> use std::fmt; @@ -1925,7 +1925,7 @@ ${helpers.predefined_type("shape-outside", "basic_shape::FloatAreaShape", <%helpers:longhand name="touch-action" products="gecko" - animation_value_type="none" + animation_value_type="discrete" disable_when_testing="True" spec="https://compat.spec.whatwg.org/#touch-action"> use gecko_bindings::structs; @@ -1999,4 +1999,7 @@ ${helpers.predefined_type("shape-outside", "basic_shape::FloatAreaShape", _ => Err(()), } } + + #[cfg(feature = "gecko")] + impl_bitflags_conversions!(SpecifiedValue); diff --git a/components/style/properties/longhand/font.mako.rs b/components/style/properties/longhand/font.mako.rs index 127a1856e3e..4deb7111aef 100644 --- a/components/style/properties/longhand/font.mako.rs +++ b/components/style/properties/longhand/font.mako.rs @@ -16,6 +16,23 @@ %endif +#[cfg(feature = "gecko")] +macro_rules! impl_gecko_keyword_from_trait { + ($name: ident, $utype: ty) => { + impl From<$utype> for $name { + fn from(bits: $utype) -> $name { + $name::from_gecko_keyword(bits) + } + } + + impl From<$name> for $utype { + fn from(v: $name) -> $utype { + v.to_gecko_keyword() + } + } + }; +} + // Define ToComputedValue, ToCss, and other boilerplate for a specified value // which is of the form `enum SpecifiedValue {Value(..), System(SystemFont)}` <%def name="simple_system_boilerplate(name)"> @@ -1144,7 +1161,7 @@ ${helpers.single_keyword_system("font-variant-caps", } -<%helpers:longhand products="gecko" name="font-synthesis" animation_value_type="none" +<%helpers:longhand products="gecko" name="font-synthesis" animation_value_type="discrete" spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis"> use std::fmt; use style_traits::ToCss; @@ -1204,6 +1221,34 @@ ${helpers.single_keyword_system("font-variant-caps", _ => Err(()) } } + + #[cfg(feature = "gecko")] + impl From for SpecifiedValue { + fn from(bits: u8) -> SpecifiedValue { + use gecko_bindings::structs; + + SpecifiedValue { + weight: bits & structs::NS_FONT_SYNTHESIS_WEIGHT as u8 != 0, + style: bits & structs::NS_FONT_SYNTHESIS_STYLE as u8 != 0 + } + } + } + + #[cfg(feature = "gecko")] + impl From for u8 { + fn from(v: SpecifiedValue) -> u8 { + use gecko_bindings::structs; + + let mut bits: u8 = 0; + if v.weight { + bits |= structs::NS_FONT_SYNTHESIS_WEIGHT as u8; + } + if v.style { + bits |= structs::NS_FONT_SYNTHESIS_STYLE as u8; + } + bits + } + } ${helpers.single_keyword_system("font-stretch", @@ -1362,7 +1407,7 @@ macro_rules! exclusive_value { } } -<%helpers:longhand name="font-variant-east-asian" products="gecko" animation_value_type="none" +<%helpers:longhand name="font-variant-east-asian" products="gecko" animation_value_type="discrete" spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian"> use properties::longhands::system_font::SystemFont; use std::fmt; @@ -1500,9 +1545,12 @@ macro_rules! exclusive_value { Err(()) } } + + #[cfg(feature = "gecko")] + impl_gecko_keyword_from_trait!(VariantEastAsian, u16); -<%helpers:longhand name="font-variant-ligatures" products="gecko" animation_value_type="none" +<%helpers:longhand name="font-variant-ligatures" products="gecko" animation_value_type="discrete" spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-ligatures"> use properties::longhands::system_font::SystemFont; use std::fmt; @@ -1650,9 +1698,12 @@ macro_rules! exclusive_value { Err(()) } } + + #[cfg(feature = "gecko")] + impl_gecko_keyword_from_trait!(VariantLigatures, u16); -<%helpers:longhand name="font-variant-numeric" products="gecko" animation_value_type="none" +<%helpers:longhand name="font-variant-numeric" products="gecko" animation_value_type="discrete" spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-numeric"> use properties::longhands::system_font::SystemFont; use std::fmt; @@ -1793,6 +1844,9 @@ macro_rules! exclusive_value { Err(()) } } + + #[cfg(feature = "gecko")] + impl_gecko_keyword_from_trait!(VariantNumeric, u8); ${helpers.single_keyword_system("font-variant-position", @@ -1875,7 +1929,7 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control- } -<%helpers:longhand name="font-language-override" products="gecko" animation_value_type="none" +<%helpers:longhand name="font-language-override" products="gecko" animation_value_type="discrete" extra_prefixes="moz" boxed="True" spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override"> use properties::longhands::system_font::SystemFont; @@ -2009,6 +2063,20 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control- }) } } + + #[cfg(feature = "gecko")] + impl From for computed_value::T { + fn from(bits: u32) -> computed_value::T { + computed_value::T(bits) + } + } + + #[cfg(feature = "gecko")] + impl From for u32 { + fn from(v: computed_value::T) -> u32 { + v.0 + } + } <%helpers:longhand name="-x-lang" products="gecko" animation_value_type="none" internal="True" diff --git a/components/style/properties/longhand/inherited_text.mako.rs b/components/style/properties/longhand/inherited_text.mako.rs index c5301e31378..ae312a021b3 100644 --- a/components/style/properties/longhand/inherited_text.mako.rs +++ b/components/style/properties/longhand/inherited_text.mako.rs @@ -18,18 +18,20 @@ ${helpers.predefined_type("line-height", ${helpers.single_keyword("text-transform", "none capitalize uppercase lowercase", extra_gecko_values="full-width", - animation_value_type="none", + animation_value_type="discrete", spec="https://drafts.csswg.org/css-text/#propdef-text-transform")} ${helpers.single_keyword("hyphens", "manual none auto", gecko_enum_prefix="StyleHyphens", - products="gecko", animation_value_type="none", extra_prefixes="moz", + gecko_inexhaustive=True, + products="gecko", animation_value_type="discrete", extra_prefixes="moz", spec="https://drafts.csswg.org/css-text/#propdef-hyphens")} // TODO: Support ${helpers.single_keyword("-moz-text-size-adjust", "auto none", gecko_constant_prefix="NS_STYLE_TEXT_SIZE_ADJUST", - products="gecko", animation_value_type="none", + gecko_ffi_name="mTextSizeAdjust", + products="gecko", animation_value_type="discrete", spec="https://drafts.csswg.org/css-size-adjust/#adjustment-control", alias="-webkit-text-size-adjust")} @@ -45,7 +47,7 @@ ${helpers.predefined_type("text-indent", ${helpers.single_keyword("overflow-wrap", "normal break-word", gecko_constant_prefix="NS_STYLE_OVERFLOWWRAP", - animation_value_type="none", + animation_value_type="discrete", spec="https://drafts.csswg.org/css-text/#propdef-overflow-wrap", alias="word-wrap")} @@ -53,7 +55,7 @@ ${helpers.single_keyword("overflow-wrap", ${helpers.single_keyword("word-break", "normal break-all keep-all", gecko_constant_prefix="NS_STYLE_WORDBREAK", - animation_value_type="none", + animation_value_type="discrete", spec="https://drafts.csswg.org/css-text/#propdef-word-break")} // TODO(pcwalton): Support `text-justify: distribute`. @@ -62,7 +64,8 @@ ${helpers.single_keyword("word-break", extra_gecko_values="inter-character" extra_specified="${'distribute' if product == 'gecko' else ''}" gecko_enum_prefix="StyleTextJustify" - animation_value_type="none" + gecko_inexhaustive="True" + animation_value_type="discrete" spec="https://drafts.csswg.org/css-text/#propdef-text-justify"> no_viewport_percentage!(SpecifiedValue); @@ -101,11 +104,11 @@ ${helpers.single_keyword("text-align-last", "auto start end left right center justify", products="gecko", gecko_constant_prefix="NS_STYLE_TEXT_ALIGN", - animation_value_type="none", + animation_value_type="discrete", spec="https://drafts.csswg.org/css-text/#propdef-text-align-last")} // TODO make this a shorthand and implement text-align-last/text-align-all -<%helpers:longhand name="text-align" animation_value_type="none" need_clone="True" +<%helpers:longhand name="text-align" animation_value_type="discrete" spec="https://drafts.csswg.org/css-text/#propdef-text-align"> no_viewport_percentage!(SpecifiedValue); pub mod computed_value { @@ -360,7 +363,8 @@ ${helpers.predefined_type("word-spacing", extra_gecko_values="-moz-pre-space" gecko_enum_prefix="StyleWhiteSpace" needs_conversion="True" - animation_value_type="none" + gecko_inexhaustive="True" + animation_value_type="discrete" spec="https://drafts.csswg.org/css-text/#propdef-white-space"> use values::computed::ComputedValueAsSpecified; impl ComputedValueAsSpecified for SpecifiedValue {} @@ -605,7 +609,7 @@ ${helpers.predefined_type("word-spacing", } -<%helpers:longhand name="text-emphasis-position" animation_value_type="none" products="gecko" +<%helpers:longhand name="text-emphasis-position" animation_value_type="discrete" products="gecko" spec="https://drafts.csswg.org/css-text-decor/#propdef-text-emphasis-position"> use values::computed::ComputedValueAsSpecified; use style_traits::ToCss; @@ -663,6 +667,32 @@ ${helpers.predefined_type("word-spacing", SpecifiedValue(horiz, vert) } } + + impl From for SpecifiedValue { + fn from(bits: u8) -> SpecifiedValue { + SpecifiedValue::from_gecko_keyword(bits as u32) + } + } + + impl From for u8 { + fn from(v: SpecifiedValue) -> u8 { + use gecko_bindings::structs; + + let mut result = match v.0 { + HorizontalWritingModeValue::Over => structs::NS_STYLE_TEXT_EMPHASIS_POSITION_OVER, + HorizontalWritingModeValue::Under => structs::NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER, + }; + match v.1 { + VerticalWritingModeValue::Right => { + result |= structs::NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT; + } + VerticalWritingModeValue::Left => { + result |= structs::NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT; + } + }; + result as u8 + } + } % endif diff --git a/components/style/properties/longhand/outline.mako.rs b/components/style/properties/longhand/outline.mako.rs index 2b5b2841ba6..70f5b920361 100644 --- a/components/style/properties/longhand/outline.mako.rs +++ b/components/style/properties/longhand/outline.mako.rs @@ -16,7 +16,7 @@ ${helpers.predefined_type("outline-color", "Color", "computed_value::T::currentc ignored_when_colors_disabled=True, spec="https://drafts.csswg.org/css-ui/#propdef-outline-color")} -<%helpers:longhand name="outline-style" need_clone="True" animation_value_type="none" +<%helpers:longhand name="outline-style" animation_value_type="discrete" spec="https://drafts.csswg.org/css-ui/#propdef-outline-style"> use values::specified::BorderStyle; diff --git a/components/style/properties/longhand/position.mako.rs b/components/style/properties/longhand/position.mako.rs index 748f8a4ae81..9a13d1db6f8 100644 --- a/components/style/properties/longhand/position.mako.rs +++ b/components/style/properties/longhand/position.mako.rs @@ -24,6 +24,24 @@ animation_value_type="ComputedValue", logical=True)} % endfor +#[cfg(feature = "gecko")] +macro_rules! impl_align_conversions { + ($name: path) => { + impl From for $name { + fn from(bits: u8) -> $name { + $name(::values::specified::align::AlignFlags::from_bits(bits) + .expect("bits contain valid flag")) + } + } + + impl From<$name> for u8 { + fn from(v: $name) -> u8 { + v.0.bits() + } + } + }; +} + ${helpers.predefined_type("z-index", "IntegerOrAuto", "Either::Second(Auto)", spec="https://www.w3.org/TR/CSS2/visuren.html#z-index", @@ -48,14 +66,14 @@ ${helpers.single_keyword("flex-wrap", "nowrap wrap wrap-reverse", ${helpers.single_keyword("justify-content", "flex-start stretch flex-end center space-between space-around", extra_prefixes="webkit", spec="https://drafts.csswg.org/css-align/#propdef-justify-content", - animation_value_type="none")} + animation_value_type="discrete")} % else: ${helpers.predefined_type(name="justify-content", type="AlignJustifyContent", initial_value="specified::AlignJustifyContent::normal()", spec="https://drafts.csswg.org/css-align/#propdef-justify-content", extra_prefixes="webkit", - animation_value_type="none")} + animation_value_type="discrete")} % endif % if product == "servo": @@ -63,7 +81,7 @@ ${helpers.single_keyword("flex-wrap", "nowrap wrap wrap-reverse", ${helpers.single_keyword("align-content", "stretch flex-start flex-end center space-between space-around", extra_prefixes="webkit", spec="https://drafts.csswg.org/css-align/#propdef-align-content", - animation_value_type="none")} + animation_value_type="discrete")} ${helpers.single_keyword("align-items", "stretch flex-start flex-end center baseline", @@ -76,7 +94,7 @@ ${helpers.single_keyword("flex-wrap", "nowrap wrap wrap-reverse", initial_value="specified::AlignJustifyContent::normal()", spec="https://drafts.csswg.org/css-align/#propdef-align-content", extra_prefixes="webkit", - animation_value_type="none")} + animation_value_type="discrete")} ${helpers.predefined_type(name="align-items", type="AlignItems", @@ -85,11 +103,17 @@ ${helpers.single_keyword("flex-wrap", "nowrap wrap wrap-reverse", extra_prefixes="webkit", animation_value_type="discrete")} + #[cfg(feature = "gecko")] + impl_align_conversions!(::values::specified::align::AlignItems); + ${helpers.predefined_type(name="justify-items", type="JustifyItems", initial_value="specified::JustifyItems::auto()", spec="https://drafts.csswg.org/css-align/#propdef-justify-items", - animation_value_type="none")} + animation_value_type="discrete")} + + #[cfg(feature = "gecko")] + impl_align_conversions!(::values::specified::align::JustifyItems); % endif // Flex item properties @@ -109,23 +133,25 @@ ${helpers.predefined_type("flex-shrink", "Number", % if product == "servo": // FIXME: Update Servo to support the same syntax as Gecko. ${helpers.single_keyword("align-self", "auto stretch flex-start flex-end center baseline", - need_clone=True, extra_prefixes="webkit", spec="https://drafts.csswg.org/css-flexbox/#propdef-align-self", - animation_value_type="none")} + animation_value_type="discrete")} % else: ${helpers.predefined_type(name="align-self", type="AlignJustifySelf", initial_value="specified::AlignJustifySelf::auto()", spec="https://drafts.csswg.org/css-align/#align-self-property", extra_prefixes="webkit", - animation_value_type="none")} + animation_value_type="discrete")} ${helpers.predefined_type(name="justify-self", type="AlignJustifySelf", initial_value="specified::AlignJustifySelf::auto()", spec="https://drafts.csswg.org/css-align/#justify-self-property", - animation_value_type="none")} + animation_value_type="discrete")} + + #[cfg(feature = "gecko")] + impl_align_conversions!(::values::specified::align::AlignJustifySelf); % endif // https://drafts.csswg.org/css-flexbox/#propdef-order @@ -266,7 +292,7 @@ ${helpers.predefined_type("object-position", <%helpers:longhand name="grid-auto-flow" spec="https://drafts.csswg.org/css-grid/#propdef-grid-auto-flow" products="gecko" - animation_value_type="none"> + animation_value_type="discrete"> use std::fmt; use style_traits::ToCss; use values::computed::ComputedValueAsSpecified; @@ -346,6 +372,43 @@ ${helpers.predefined_type("object-position", Err(()) } } + + #[cfg(feature = "gecko")] + impl From for SpecifiedValue { + fn from(bits: u8) -> SpecifiedValue { + use gecko_bindings::structs; + use self::computed_value::AutoFlow; + + SpecifiedValue { + autoflow: + if bits & structs::NS_STYLE_GRID_AUTO_FLOW_ROW as u8 != 0 { + AutoFlow::Row + } else { + AutoFlow::Column + }, + dense: + bits & structs::NS_STYLE_GRID_AUTO_FLOW_DENSE as u8 != 0, + } + } + } + + #[cfg(feature = "gecko")] + impl From for u8 { + fn from(v: SpecifiedValue) -> u8 { + use gecko_bindings::structs; + use self::computed_value::AutoFlow; + + let mut result: u8 = match v.autoflow { + AutoFlow::Row => structs::NS_STYLE_GRID_AUTO_FLOW_ROW as u8, + AutoFlow::Column => structs::NS_STYLE_GRID_AUTO_FLOW_COLUMN as u8, + }; + + if v.dense { + result |= structs::NS_STYLE_GRID_AUTO_FLOW_DENSE as u8; + } + result + } + } <%helpers:longhand name="grid-template-areas" diff --git a/components/style/properties/longhand/text.mako.rs b/components/style/properties/longhand/text.mako.rs index 6ebf1e9d277..40ee7b0b496 100644 --- a/components/style/properties/longhand/text.mako.rs +++ b/components/style/properties/longhand/text.mako.rs @@ -143,10 +143,9 @@ ${helpers.single_keyword("unicode-bidi", animation_value_type="discrete", spec="https://drafts.csswg.org/css-writing-modes/#propdef-unicode-bidi")} -// FIXME: This prop should be animatable. <%helpers:longhand name="text-decoration-line" custom_cascade="${product == 'servo'}" - animation_value_type="none" + animation_value_type="discrete" spec="https://drafts.csswg.org/css-text-decor/#propdef-text-decoration-line"> use std::fmt; use style_traits::ToCss; @@ -159,8 +158,8 @@ ${helpers.single_keyword("unicode-bidi", #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub flags SpecifiedValue: u8 { const NONE = 0, - const OVERLINE = 0x01, - const UNDERLINE = 0x02, + const UNDERLINE = 0x01, + const OVERLINE = 0x02, const LINE_THROUGH = 0x04, const BLINK = 0x08, % if product == "gecko": @@ -256,6 +255,9 @@ ${helpers.single_keyword("unicode-bidi", longhands::_servo_text_decorations_in_effect::derive_from_text_decoration(context); } % endif + + #[cfg(feature = "gecko")] + impl_bitflags_conversions!(SpecifiedValue); ${helpers.single_keyword("text-decoration-style", @@ -278,6 +280,6 @@ ${helpers.predefined_type( "InitialLetter", "computed::InitialLetter::normal()", initial_specified_value="specified::InitialLetter::normal()", - animation_value_type="none", + animation_value_type="discrete", products="gecko", spec="https://drafts.csswg.org/css-inline/#sizing-drop-initials")} diff --git a/components/style/properties/longhand/ui.mako.rs b/components/style/properties/longhand/ui.mako.rs index e06a6feb41c..21a349db959 100644 --- a/components/style/properties/longhand/ui.mako.rs +++ b/components/style/properties/longhand/ui.mako.rs @@ -42,7 +42,7 @@ ${helpers.single_keyword("-moz-window-shadow", "none default menu tooltip sheet" <%helpers:longhand name="-moz-force-broken-image-icon" products="gecko" - animation_value_type="none" + animation_value_type="discrete" spec="None (Nonstandard Firefox-only property)"> use std::fmt; use style_traits::ToCss; @@ -83,4 +83,19 @@ ${helpers.single_keyword("-moz-window-shadow", "none default menu tooltip sheet" _ => Err(()), } } + + impl From for SpecifiedValue { + fn from(bits: u8) -> SpecifiedValue { + SpecifiedValue(bits == 1) + } + } + + impl From for u8 { + fn from(v: SpecifiedValue) -> u8 { + match v.0 { + true => 1u8, + false => 0u8, + } + } + } diff --git a/components/style/properties/longhand/xul.mako.rs b/components/style/properties/longhand/xul.mako.rs index 9573a2a6c38..5d9ec6623e2 100644 --- a/components/style/properties/longhand/xul.mako.rs +++ b/components/style/properties/longhand/xul.mako.rs @@ -59,5 +59,5 @@ ${helpers.predefined_type("-moz-box-ordinal-group", "Integer", "0", products="gecko", alias="-webkit-box-ordinal-group", gecko_ffi_name="mBoxOrdinal", - animation_value_type="none", + animation_value_type="discrete", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-box-ordinal-group)")} diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 9e8420fa471..f140e07939b 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -53,6 +53,23 @@ macro_rules! property_name { ($s: tt) => { atom!($s) } } +#[cfg(feature = "gecko")] +macro_rules! impl_bitflags_conversions { + ($name: ident) => { + impl From for $name { + fn from(bits: u8) -> $name { + $name::from_bits(bits).expect("bits contain valid flag") + } + } + + impl From<$name> for u8 { + fn from(v: $name) -> u8 { + v.bits() + } + } + }; +} + <%! from data import Method, Keyword, to_rust_ident, to_camel_case, SYSTEM_FONT_LONGHANDS import os.path diff --git a/components/style/values/specified/align.rs b/components/style/values/specified/align.rs index 6fb637b6942..0d202ea0db5 100644 --- a/components/style/values/specified/align.rs +++ b/components/style/values/specified/align.rs @@ -137,10 +137,6 @@ impl AlignJustifyContent { AlignJustifyContent(flags.bits() as u16 | ((fallback.bits() as u16) << ALIGN_ALL_SHIFT)) } - /// The combined 16-bit flags, for copying into a Gecko style struct. - #[inline] - pub fn bits(self) -> u16 { self.0 } - /// The primary alignment #[inline] pub fn primary(self) -> AlignFlags { @@ -325,6 +321,20 @@ impl Parse for JustifyItems { } } +#[cfg(feature = "gecko")] +impl From for AlignJustifyContent { + fn from(bits: u16) -> AlignJustifyContent { + AlignJustifyContent(bits) + } +} + +#[cfg(feature = "gecko")] +impl From for u16 { + fn from(v: AlignJustifyContent) -> u16 { + v.0 + } +} + // auto | normal | stretch | fn parse_auto_normal_stretch_baseline(input: &mut Parser) -> Result { if let Ok(baseline) = input.try(parse_baseline) {