style/traversal_flags.rs
1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! Flags that control the traversal process.
6//!
7//! We CamelCase rather than UPPER_CASING so that we can grep for the same
8//! strings across gecko and servo.
9#![allow(non_upper_case_globals)]
10
11bitflags! {
12 /// Flags that control the traversal process.
13 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
14 pub struct TraversalFlags: u32 {
15 /// Traverse only elements for animation restyles.
16 const AnimationOnly = 1 << 0;
17 /// Traverse and update all elements with CSS animations since
18 /// @keyframes rules may have changed. Triggered by CSS rule changes.
19 const ForCSSRuleChanges = 1 << 1;
20 /// The final animation-only traversal, which shouldn't really care about other
21 /// style changes anymore.
22 const FinalAnimationTraversal = 1 << 2;
23 /// Allows the traversal to run in parallel if there are sufficient cores on
24 /// the machine.
25 const ParallelTraversal = 1 << 7;
26 /// Flush throttled animations. By default, we only update throttled animations
27 /// when we have other non-throttled work to do. With this flag, we
28 /// unconditionally tick and process them.
29 const FlushThrottledAnimations = 1 << 8;
30
31 }
32}
33
34/// Asserts that all TraversalFlags flags have a matching ServoTraversalFlags value in gecko.
35#[cfg(feature = "gecko")]
36#[inline]
37pub fn assert_traversal_flags_match() {
38 use crate::gecko_bindings::structs;
39
40 macro_rules! check_traversal_flags {
41 ( $( $a:ident => $b:path ),*, ) => {
42 if cfg!(debug_assertions) {
43 let mut modes = TraversalFlags::all();
44 $(
45 assert_eq!(structs::$a as usize, $b.bits() as usize, stringify!($b));
46 modes.remove($b);
47 )*
48 assert_eq!(modes, TraversalFlags::empty(), "all TraversalFlags bits should have an assertion");
49 }
50 }
51 }
52
53 check_traversal_flags! {
54 ServoTraversalFlags_AnimationOnly => TraversalFlags::AnimationOnly,
55 ServoTraversalFlags_ForCSSRuleChanges => TraversalFlags::ForCSSRuleChanges,
56 ServoTraversalFlags_FinalAnimationTraversal => TraversalFlags::FinalAnimationTraversal,
57 ServoTraversalFlags_ParallelTraversal => TraversalFlags::ParallelTraversal,
58 ServoTraversalFlags_FlushThrottledAnimations => TraversalFlags::FlushThrottledAnimations,
59 }
60}
61
62impl TraversalFlags {
63 /// Returns true if the traversal is for animation-only restyles.
64 #[inline]
65 pub fn for_animation_only(&self) -> bool {
66 self.contains(TraversalFlags::AnimationOnly)
67 }
68}