diff --git a/components/style/binding_tools/regen.py b/components/style/binding_tools/regen.py index 78a22738f1a..7fddb0566a8 100755 --- a/components/style/binding_tools/regen.py +++ b/components/style/binding_tools/regen.py @@ -188,6 +188,7 @@ COMPILATION_TARGETS = { "StyleTransition", "UniquePtr", ], + "bitfield_enum_types": ["nsChangeHint", "nsRestyleHint"], "opaque_types": [ "atomic___base", "nsAString_internal_char_traits", @@ -523,6 +524,11 @@ def build(objdir, target_name, debug, debugger, kind_name=None, flags.append("--whitelist-var") flags.append(header) + if "bitfield_enum_types" in current_target: + for ty in current_target["bitfield_enum_types"]: + flags.append("--bitfield-enum") + flags.append(ty) + if "opaque_types" in current_target: for ty in current_target["opaque_types"]: flags.append("--opaque-type") diff --git a/components/style/gecko/restyle_damage.rs b/components/style/gecko/restyle_damage.rs index ed23bb15062..33dd47c7daa 100644 --- a/components/style/gecko/restyle_damage.rs +++ b/components/style/gecko/restyle_damage.rs @@ -4,6 +4,7 @@ use dom::TRestyleDamage; use gecko_bindings::bindings; +use gecko_bindings::structs; use gecko_bindings::structs::{nsChangeHint, nsStyleContext}; use gecko_bindings::sugar::ownership::FFIArcHelpers; use properties::ComputedValues; @@ -23,8 +24,7 @@ impl TRestyleDamage for GeckoRestyleDamage { type PreExistingComputedValues = nsStyleContext; fn empty() -> Self { - use std::mem; - GeckoRestyleDamage(unsafe { mem::transmute(0u32) }) + GeckoRestyleDamage(nsChangeHint(0)) } fn compute(source: &nsStyleContext, @@ -38,7 +38,7 @@ impl TRestyleDamage for GeckoRestyleDamage { } fn rebuild_and_reflow() -> Self { - GeckoRestyleDamage(nsChangeHint::nsChangeHint_ReconstructFrame) + GeckoRestyleDamage(structs::nsChangeHint_nsChangeHint_ReconstructFrame) } } @@ -46,8 +46,7 @@ impl BitOr for GeckoRestyleDamage { type Output = Self; fn bitor(self, other: Self) -> Self { - use std::mem; - GeckoRestyleDamage(unsafe { mem::transmute(self.0 as u32 | other.0 as u32) }) + GeckoRestyleDamage(self.0 | other.0) } } diff --git a/components/style/gecko_bindings/structs_debug.rs b/components/style/gecko_bindings/structs_debug.rs index 86d08c50768..07116ef5a2b 100644 --- a/components/style/gecko_bindings/structs_debug.rs +++ b/components/style/gecko_bindings/structs_debug.rs @@ -3948,7 +3948,36 @@ fn bindgen_test_layout_EventStates() { impl Clone for EventStates { fn clone(&self) -> Self { *self } } -#[repr(u32)] +pub const nsRestyleHint_eRestyle_Self: nsRestyleHint = nsRestyleHint(1); +pub const nsRestyleHint_eRestyle_SomeDescendants: nsRestyleHint = + nsRestyleHint(2); +pub const nsRestyleHint_eRestyle_Subtree: nsRestyleHint = nsRestyleHint(4); +pub const nsRestyleHint_eRestyle_LaterSiblings: nsRestyleHint = + nsRestyleHint(8); +pub const nsRestyleHint_eRestyle_CSSTransitions: nsRestyleHint = + nsRestyleHint(16); +pub const nsRestyleHint_eRestyle_CSSAnimations: nsRestyleHint = + nsRestyleHint(32); +pub const nsRestyleHint_eRestyle_SVGAttrAnimations: nsRestyleHint = + nsRestyleHint(64); +pub const nsRestyleHint_eRestyle_StyleAttribute: nsRestyleHint = + nsRestyleHint(128); +pub const nsRestyleHint_eRestyle_StyleAttribute_Animations: nsRestyleHint = + nsRestyleHint(256); +pub const nsRestyleHint_eRestyle_Force: nsRestyleHint = nsRestyleHint(512); +pub const nsRestyleHint_eRestyle_ForceDescendants: nsRestyleHint = + nsRestyleHint(1024); +pub const nsRestyleHint_eRestyle_AllHintsWithAnimations: nsRestyleHint = + nsRestyleHint(368); +impl ::std::ops::BitOr for nsRestyleHint { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { nsRestyleHint(self.0 | other.0) } +} +#[repr(C)] /** * |nsRestyleHint| is a bitfield for the result of * |HasStateDependentStyle| and |HasAttributeDependentStyle|. When no @@ -3968,20 +3997,7 @@ impl Clone for EventStates { * RestyleManager::RestyleHintToString. */ #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum nsRestyleHint { - eRestyle_Self = 1, - eRestyle_SomeDescendants = 2, - eRestyle_Subtree = 4, - eRestyle_LaterSiblings = 8, - eRestyle_CSSTransitions = 16, - eRestyle_CSSAnimations = 32, - eRestyle_SVGAttrAnimations = 64, - eRestyle_StyleAttribute = 128, - eRestyle_StyleAttribute_Animations = 256, - eRestyle_Force = 512, - eRestyle_ForceDescendants = 1024, - eRestyle_AllHintsWithAnimations = 368, -} +pub struct nsRestyleHint(pub u32); /** * Instances of this class represent moments in time, or a special * "null" moment. We do not use the non-monotonic system clock or @@ -5089,39 +5105,78 @@ fn bindgen_test_layout_RestyleManagerHandle() { impl Clone for RestyleManagerHandle { fn clone(&self) -> Self { *self } } -#[repr(u32)] -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum nsChangeHint { - nsChangeHint_RepaintFrame = 1, - nsChangeHint_NeedReflow = 2, - nsChangeHint_ClearAncestorIntrinsics = 4, - nsChangeHint_ClearDescendantIntrinsics = 8, - nsChangeHint_NeedDirtyReflow = 16, - nsChangeHint_SyncFrameView = 32, - nsChangeHint_UpdateCursor = 64, - nsChangeHint_UpdateEffects = 128, - nsChangeHint_UpdateOpacityLayer = 256, - nsChangeHint_UpdateTransformLayer = 512, - nsChangeHint_ReconstructFrame = 1024, - nsChangeHint_UpdateOverflow = 2048, - nsChangeHint_UpdateSubtreeOverflow = 4096, - nsChangeHint_UpdatePostTransformOverflow = 8192, - nsChangeHint_UpdateParentOverflow = 16384, - nsChangeHint_ChildrenOnlyTransform = 32768, - nsChangeHint_RecomputePosition = 65536, - nsChangeHint_UpdateContainingBlock = 131072, - nsChangeHint_BorderStyleNoneChange = 262144, - nsChangeHint_UpdateTextPath = 524288, - nsChangeHint_SchedulePaint = 1048576, - nsChangeHint_NeutralChange = 2097152, - nsChangeHint_InvalidateRenderingObservers = 4194304, - nsChangeHint_ReflowChangesSizeOrPosition = 8388608, - nsChangeHint_UpdateComputedBSize = 16777216, - nsChangeHint_UpdateUsesOpacity = 33554432, - nsChangeHint_UpdateBackgroundPosition = 67108864, - nsChangeHint_AddOrRemoveTransform = 134217728, - nsChangeHint_AllHints = 268435455, +pub const nsChangeHint_nsChangeHint_RepaintFrame: nsChangeHint = + nsChangeHint(1); +pub const nsChangeHint_nsChangeHint_NeedReflow: nsChangeHint = + nsChangeHint(2); +pub const nsChangeHint_nsChangeHint_ClearAncestorIntrinsics: nsChangeHint = + nsChangeHint(4); +pub const nsChangeHint_nsChangeHint_ClearDescendantIntrinsics: nsChangeHint = + nsChangeHint(8); +pub const nsChangeHint_nsChangeHint_NeedDirtyReflow: nsChangeHint = + nsChangeHint(16); +pub const nsChangeHint_nsChangeHint_SyncFrameView: nsChangeHint = + nsChangeHint(32); +pub const nsChangeHint_nsChangeHint_UpdateCursor: nsChangeHint = + nsChangeHint(64); +pub const nsChangeHint_nsChangeHint_UpdateEffects: nsChangeHint = + nsChangeHint(128); +pub const nsChangeHint_nsChangeHint_UpdateOpacityLayer: nsChangeHint = + nsChangeHint(256); +pub const nsChangeHint_nsChangeHint_UpdateTransformLayer: nsChangeHint = + nsChangeHint(512); +pub const nsChangeHint_nsChangeHint_ReconstructFrame: nsChangeHint = + nsChangeHint(1024); +pub const nsChangeHint_nsChangeHint_UpdateOverflow: nsChangeHint = + nsChangeHint(2048); +pub const nsChangeHint_nsChangeHint_UpdateSubtreeOverflow: nsChangeHint = + nsChangeHint(4096); +pub const nsChangeHint_nsChangeHint_UpdatePostTransformOverflow: nsChangeHint + = + nsChangeHint(8192); +pub const nsChangeHint_nsChangeHint_UpdateParentOverflow: nsChangeHint = + nsChangeHint(16384); +pub const nsChangeHint_nsChangeHint_ChildrenOnlyTransform: nsChangeHint = + nsChangeHint(32768); +pub const nsChangeHint_nsChangeHint_RecomputePosition: nsChangeHint = + nsChangeHint(65536); +pub const nsChangeHint_nsChangeHint_UpdateContainingBlock: nsChangeHint = + nsChangeHint(131072); +pub const nsChangeHint_nsChangeHint_BorderStyleNoneChange: nsChangeHint = + nsChangeHint(262144); +pub const nsChangeHint_nsChangeHint_UpdateTextPath: nsChangeHint = + nsChangeHint(524288); +pub const nsChangeHint_nsChangeHint_SchedulePaint: nsChangeHint = + nsChangeHint(1048576); +pub const nsChangeHint_nsChangeHint_NeutralChange: nsChangeHint = + nsChangeHint(2097152); +pub const nsChangeHint_nsChangeHint_InvalidateRenderingObservers: nsChangeHint + = + nsChangeHint(4194304); +pub const nsChangeHint_nsChangeHint_ReflowChangesSizeOrPosition: nsChangeHint + = + nsChangeHint(8388608); +pub const nsChangeHint_nsChangeHint_UpdateComputedBSize: nsChangeHint = + nsChangeHint(16777216); +pub const nsChangeHint_nsChangeHint_UpdateUsesOpacity: nsChangeHint = + nsChangeHint(33554432); +pub const nsChangeHint_nsChangeHint_UpdateBackgroundPosition: nsChangeHint = + nsChangeHint(67108864); +pub const nsChangeHint_nsChangeHint_AddOrRemoveTransform: nsChangeHint = + nsChangeHint(134217728); +pub const nsChangeHint_nsChangeHint_AllHints: nsChangeHint = + nsChangeHint(268435455); +impl ::std::ops::BitOr for nsChangeHint { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { nsChangeHint(self.0 | other.0) } } +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct nsChangeHint(pub u32); pub type nscolor = u32; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] diff --git a/components/style/gecko_bindings/structs_release.rs b/components/style/gecko_bindings/structs_release.rs index 33f07ca461f..4de131632c0 100644 --- a/components/style/gecko_bindings/structs_release.rs +++ b/components/style/gecko_bindings/structs_release.rs @@ -3930,7 +3930,36 @@ fn bindgen_test_layout_EventStates() { impl Clone for EventStates { fn clone(&self) -> Self { *self } } -#[repr(u32)] +pub const nsRestyleHint_eRestyle_Self: nsRestyleHint = nsRestyleHint(1); +pub const nsRestyleHint_eRestyle_SomeDescendants: nsRestyleHint = + nsRestyleHint(2); +pub const nsRestyleHint_eRestyle_Subtree: nsRestyleHint = nsRestyleHint(4); +pub const nsRestyleHint_eRestyle_LaterSiblings: nsRestyleHint = + nsRestyleHint(8); +pub const nsRestyleHint_eRestyle_CSSTransitions: nsRestyleHint = + nsRestyleHint(16); +pub const nsRestyleHint_eRestyle_CSSAnimations: nsRestyleHint = + nsRestyleHint(32); +pub const nsRestyleHint_eRestyle_SVGAttrAnimations: nsRestyleHint = + nsRestyleHint(64); +pub const nsRestyleHint_eRestyle_StyleAttribute: nsRestyleHint = + nsRestyleHint(128); +pub const nsRestyleHint_eRestyle_StyleAttribute_Animations: nsRestyleHint = + nsRestyleHint(256); +pub const nsRestyleHint_eRestyle_Force: nsRestyleHint = nsRestyleHint(512); +pub const nsRestyleHint_eRestyle_ForceDescendants: nsRestyleHint = + nsRestyleHint(1024); +pub const nsRestyleHint_eRestyle_AllHintsWithAnimations: nsRestyleHint = + nsRestyleHint(368); +impl ::std::ops::BitOr for nsRestyleHint { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { nsRestyleHint(self.0 | other.0) } +} +#[repr(C)] /** * |nsRestyleHint| is a bitfield for the result of * |HasStateDependentStyle| and |HasAttributeDependentStyle|. When no @@ -3950,20 +3979,7 @@ impl Clone for EventStates { * RestyleManager::RestyleHintToString. */ #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum nsRestyleHint { - eRestyle_Self = 1, - eRestyle_SomeDescendants = 2, - eRestyle_Subtree = 4, - eRestyle_LaterSiblings = 8, - eRestyle_CSSTransitions = 16, - eRestyle_CSSAnimations = 32, - eRestyle_SVGAttrAnimations = 64, - eRestyle_StyleAttribute = 128, - eRestyle_StyleAttribute_Animations = 256, - eRestyle_Force = 512, - eRestyle_ForceDescendants = 1024, - eRestyle_AllHintsWithAnimations = 368, -} +pub struct nsRestyleHint(pub u32); /** * Instances of this class represent moments in time, or a special * "null" moment. We do not use the non-monotonic system clock or @@ -5068,39 +5084,78 @@ fn bindgen_test_layout_RestyleManagerHandle() { impl Clone for RestyleManagerHandle { fn clone(&self) -> Self { *self } } -#[repr(u32)] -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum nsChangeHint { - nsChangeHint_RepaintFrame = 1, - nsChangeHint_NeedReflow = 2, - nsChangeHint_ClearAncestorIntrinsics = 4, - nsChangeHint_ClearDescendantIntrinsics = 8, - nsChangeHint_NeedDirtyReflow = 16, - nsChangeHint_SyncFrameView = 32, - nsChangeHint_UpdateCursor = 64, - nsChangeHint_UpdateEffects = 128, - nsChangeHint_UpdateOpacityLayer = 256, - nsChangeHint_UpdateTransformLayer = 512, - nsChangeHint_ReconstructFrame = 1024, - nsChangeHint_UpdateOverflow = 2048, - nsChangeHint_UpdateSubtreeOverflow = 4096, - nsChangeHint_UpdatePostTransformOverflow = 8192, - nsChangeHint_UpdateParentOverflow = 16384, - nsChangeHint_ChildrenOnlyTransform = 32768, - nsChangeHint_RecomputePosition = 65536, - nsChangeHint_UpdateContainingBlock = 131072, - nsChangeHint_BorderStyleNoneChange = 262144, - nsChangeHint_UpdateTextPath = 524288, - nsChangeHint_SchedulePaint = 1048576, - nsChangeHint_NeutralChange = 2097152, - nsChangeHint_InvalidateRenderingObservers = 4194304, - nsChangeHint_ReflowChangesSizeOrPosition = 8388608, - nsChangeHint_UpdateComputedBSize = 16777216, - nsChangeHint_UpdateUsesOpacity = 33554432, - nsChangeHint_UpdateBackgroundPosition = 67108864, - nsChangeHint_AddOrRemoveTransform = 134217728, - nsChangeHint_AllHints = 268435455, +pub const nsChangeHint_nsChangeHint_RepaintFrame: nsChangeHint = + nsChangeHint(1); +pub const nsChangeHint_nsChangeHint_NeedReflow: nsChangeHint = + nsChangeHint(2); +pub const nsChangeHint_nsChangeHint_ClearAncestorIntrinsics: nsChangeHint = + nsChangeHint(4); +pub const nsChangeHint_nsChangeHint_ClearDescendantIntrinsics: nsChangeHint = + nsChangeHint(8); +pub const nsChangeHint_nsChangeHint_NeedDirtyReflow: nsChangeHint = + nsChangeHint(16); +pub const nsChangeHint_nsChangeHint_SyncFrameView: nsChangeHint = + nsChangeHint(32); +pub const nsChangeHint_nsChangeHint_UpdateCursor: nsChangeHint = + nsChangeHint(64); +pub const nsChangeHint_nsChangeHint_UpdateEffects: nsChangeHint = + nsChangeHint(128); +pub const nsChangeHint_nsChangeHint_UpdateOpacityLayer: nsChangeHint = + nsChangeHint(256); +pub const nsChangeHint_nsChangeHint_UpdateTransformLayer: nsChangeHint = + nsChangeHint(512); +pub const nsChangeHint_nsChangeHint_ReconstructFrame: nsChangeHint = + nsChangeHint(1024); +pub const nsChangeHint_nsChangeHint_UpdateOverflow: nsChangeHint = + nsChangeHint(2048); +pub const nsChangeHint_nsChangeHint_UpdateSubtreeOverflow: nsChangeHint = + nsChangeHint(4096); +pub const nsChangeHint_nsChangeHint_UpdatePostTransformOverflow: nsChangeHint + = + nsChangeHint(8192); +pub const nsChangeHint_nsChangeHint_UpdateParentOverflow: nsChangeHint = + nsChangeHint(16384); +pub const nsChangeHint_nsChangeHint_ChildrenOnlyTransform: nsChangeHint = + nsChangeHint(32768); +pub const nsChangeHint_nsChangeHint_RecomputePosition: nsChangeHint = + nsChangeHint(65536); +pub const nsChangeHint_nsChangeHint_UpdateContainingBlock: nsChangeHint = + nsChangeHint(131072); +pub const nsChangeHint_nsChangeHint_BorderStyleNoneChange: nsChangeHint = + nsChangeHint(262144); +pub const nsChangeHint_nsChangeHint_UpdateTextPath: nsChangeHint = + nsChangeHint(524288); +pub const nsChangeHint_nsChangeHint_SchedulePaint: nsChangeHint = + nsChangeHint(1048576); +pub const nsChangeHint_nsChangeHint_NeutralChange: nsChangeHint = + nsChangeHint(2097152); +pub const nsChangeHint_nsChangeHint_InvalidateRenderingObservers: nsChangeHint + = + nsChangeHint(4194304); +pub const nsChangeHint_nsChangeHint_ReflowChangesSizeOrPosition: nsChangeHint + = + nsChangeHint(8388608); +pub const nsChangeHint_nsChangeHint_UpdateComputedBSize: nsChangeHint = + nsChangeHint(16777216); +pub const nsChangeHint_nsChangeHint_UpdateUsesOpacity: nsChangeHint = + nsChangeHint(33554432); +pub const nsChangeHint_nsChangeHint_UpdateBackgroundPosition: nsChangeHint = + nsChangeHint(67108864); +pub const nsChangeHint_nsChangeHint_AddOrRemoveTransform: nsChangeHint = + nsChangeHint(134217728); +pub const nsChangeHint_nsChangeHint_AllHints: nsChangeHint = + nsChangeHint(268435455); +impl ::std::ops::BitOr for nsChangeHint { + type + Output + = + Self; + #[inline] + fn bitor(self, other: Self) -> Self { nsChangeHint(self.0 | other.0) } } +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct nsChangeHint(pub u32); pub type nscolor = u32; #[repr(u32)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] diff --git a/tests/unit/stylo/sanity_checks.rs b/tests/unit/stylo/sanity_checks.rs index 662a1d0e637..fe49449637c 100644 --- a/tests/unit/stylo/sanity_checks.rs +++ b/tests/unit/stylo/sanity_checks.rs @@ -23,24 +23,24 @@ macro_rules! check_enum_value { // const-fn and no other way to access the numerical value :-( macro_rules! check_enum_value_non_static { ($a:expr, $b:expr) => { - assert_eq!($a as usize, $b as usize); + assert_eq!($a.0 as usize, $b as usize); } } #[test] fn assert_restyle_hints_match() { use style::restyle_hints::*; // For flags - use style::gecko_bindings::structs::nsRestyleHint; + use style::gecko_bindings::structs; - check_enum_value_non_static!(nsRestyleHint::eRestyle_Self, RESTYLE_SELF.bits()); + check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_Self, RESTYLE_SELF.bits()); // XXX This for Servo actually means something like an hypothetical // Restyle_AllDescendants (but without running selector matching on the // element). ServoRestyleManager interprets it like that, but in practice we // should align the behavior with Gecko adding a new restyle hint, maybe? // // See https://bugzilla.mozilla.org/show_bug.cgi?id=1291786 - check_enum_value_non_static!(nsRestyleHint::eRestyle_SomeDescendants, RESTYLE_DESCENDANTS.bits()); - check_enum_value_non_static!(nsRestyleHint::eRestyle_LaterSiblings, RESTYLE_LATER_SIBLINGS.bits()); + check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_SomeDescendants, RESTYLE_DESCENDANTS.bits()); + check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_LaterSiblings, RESTYLE_LATER_SIBLINGS.bits()); } // Note that we can't call each_pseudo_element, parse_pseudo_element, or