Combine AnimationAndTransitionDeclarations and AnimationRules

These two structs are very similar, so we can combine them.
This commit is contained in:
Martin Robinson 2020-06-16 19:13:52 +02:00
parent a84b06065b
commit 36701e0223
6 changed files with 38 additions and 50 deletions

View file

@ -14,6 +14,7 @@ use crate::properties::animated_properties::{AnimationValue, AnimationValueMap};
use crate::properties::longhands::animation_direction::computed_value::single_value::T as AnimationDirection; use crate::properties::longhands::animation_direction::computed_value::single_value::T as AnimationDirection;
use crate::properties::longhands::animation_fill_mode::computed_value::single_value::T as AnimationFillMode; use crate::properties::longhands::animation_fill_mode::computed_value::single_value::T as AnimationFillMode;
use crate::properties::longhands::animation_play_state::computed_value::single_value::T as AnimationPlayState; use crate::properties::longhands::animation_play_state::computed_value::single_value::T as AnimationPlayState;
use crate::properties::AnimationDeclarations;
use crate::properties::{ use crate::properties::{
ComputedValues, Importance, LonghandId, LonghandIdSet, PropertyDeclarationBlock, ComputedValues, Importance, LonghandId, LonghandIdSet, PropertyDeclarationBlock,
PropertyDeclarationId, PropertyDeclarationId,
@ -1235,13 +1236,13 @@ impl DocumentAnimationSet {
} }
/// Get all the animation declarations for the given key, returning an empty /// Get all the animation declarations for the given key, returning an empty
/// `AnimationAndTransitionDeclarations` if there are no animations. /// `AnimationDeclarations` if there are no animations.
pub(crate) fn get_all_declarations( pub(crate) fn get_all_declarations(
&self, &self,
key: &AnimationSetKey, key: &AnimationSetKey,
time: f64, time: f64,
shared_lock: &SharedRwLock, shared_lock: &SharedRwLock,
) -> AnimationAndTransitionDeclarations { ) -> AnimationDeclarations {
let sets = self.sets.read(); let sets = self.sets.read();
let set = match sets.get(key) { let set = match sets.get(key) {
Some(set) => set, Some(set) => set,
@ -1256,7 +1257,7 @@ impl DocumentAnimationSet {
let block = PropertyDeclarationBlock::from_animation_value_map(&map); let block = PropertyDeclarationBlock::from_animation_value_map(&map);
Arc::new(shared_lock.wrap(block)) Arc::new(shared_lock.wrap(block))
}); });
AnimationAndTransitionDeclarations { AnimationDeclarations {
animations, animations,
transitions, transitions,
} }
@ -1270,23 +1271,6 @@ impl DocumentAnimationSet {
} }
} }
/// A set of property declarations for a node, including animations and
/// transitions.
#[derive(Default)]
pub struct AnimationAndTransitionDeclarations {
/// Declarations for animations.
pub animations: Option<Arc<Locked<PropertyDeclarationBlock>>>,
/// Declarations for transitions.
pub transitions: Option<Arc<Locked<PropertyDeclarationBlock>>>,
}
impl AnimationAndTransitionDeclarations {
/// Whether or not this `AnimationAndTransitionDeclarations` is empty.
pub(crate) fn is_empty(&self) -> bool {
self.animations.is_none() && self.transitions.is_none()
}
}
/// Kick off any new transitions for this node and return all of the properties that are /// Kick off any new transitions for this node and return all of the properties that are
/// transitioning. This is at the end of calculating style for a single node. /// transitioning. This is at the end of calculating style for a single node.
pub fn start_transitions_if_applicable( pub fn start_transitions_if_applicable(

View file

@ -15,7 +15,7 @@ use crate::data::ElementData;
use crate::element_state::ElementState; use crate::element_state::ElementState;
use crate::font_metrics::FontMetricsProvider; use crate::font_metrics::FontMetricsProvider;
use crate::media_queries::Device; use crate::media_queries::Device;
use crate::properties::{AnimationRules, ComputedValues, PropertyDeclarationBlock}; use crate::properties::{AnimationDeclarations, ComputedValues, PropertyDeclarationBlock};
use crate::selector_parser::{AttrValue, Lang, PseudoElement, SelectorImpl}; use crate::selector_parser::{AttrValue, Lang, PseudoElement, SelectorImpl};
use crate::shared_lock::{Locked, SharedRwLock}; use crate::shared_lock::{Locked, SharedRwLock};
use crate::stylist::CascadeData; use crate::stylist::CascadeData;
@ -479,12 +479,15 @@ pub trait TElement:
/// Get the combined animation and transition rules. /// Get the combined animation and transition rules.
/// ///
/// FIXME(emilio): Is this really useful? /// FIXME(emilio): Is this really useful?
fn animation_rules(&self, context: &SharedStyleContext) -> AnimationRules { fn animation_declarations(&self, context: &SharedStyleContext) -> AnimationDeclarations {
if !self.may_have_animations() { if !self.may_have_animations() {
return AnimationRules(None, None); return Default::default();
} }
AnimationRules(self.animation_rule(context), self.transition_rule(context)) AnimationDeclarations {
animations: self.animation_rule(context),
transitions: self.transition_rule(context),
}
} }
/// Get this element's animation rule. /// Get this element's animation rule.

View file

@ -28,22 +28,23 @@ use std::iter::{DoubleEndedIterator, Zip};
use std::slice::Iter; use std::slice::Iter;
use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCss}; use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCss};
/// The animation rules. /// A set of property declarations including animations and transitions.
/// #[derive(Default)]
/// The first one is for Animation cascade level, and the second one is for pub struct AnimationDeclarations {
/// Transition cascade level. /// Declarations for animations.
pub struct AnimationRules( pub animations: Option<Arc<Locked<PropertyDeclarationBlock>>>,
pub Option<Arc<Locked<PropertyDeclarationBlock>>>, /// Declarations for transitions.
pub Option<Arc<Locked<PropertyDeclarationBlock>>>, pub transitions: Option<Arc<Locked<PropertyDeclarationBlock>>>,
); }
impl AnimationRules { impl AnimationDeclarations {
/// Returns whether these animation rules represents an actual rule or not. /// Whether or not this `AnimationDeclarations` is empty.
pub fn is_empty(&self) -> bool { pub(crate) fn is_empty(&self) -> bool {
self.0.is_none() && self.1.is_none() self.animations.is_none() && self.transitions.is_none()
} }
} }
/// An enum describes how a declaration should update /// An enum describes how a declaration should update
/// the declaration block. /// the declaration block.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]

View file

@ -6,7 +6,7 @@
use crate::applicable_declarations::{ApplicableDeclarationBlock, ApplicableDeclarationList}; use crate::applicable_declarations::{ApplicableDeclarationBlock, ApplicableDeclarationList};
use crate::dom::{TElement, TNode, TShadowRoot}; use crate::dom::{TElement, TNode, TShadowRoot};
use crate::properties::{AnimationRules, PropertyDeclarationBlock}; use crate::properties::{AnimationDeclarations, PropertyDeclarationBlock};
use crate::rule_tree::{CascadeLevel, ShadowCascadeOrder}; use crate::rule_tree::{CascadeLevel, ShadowCascadeOrder};
use crate::selector_map::SelectorMap; use crate::selector_map::SelectorMap;
use crate::selector_parser::PseudoElement; use crate::selector_parser::PseudoElement;
@ -70,7 +70,7 @@ where
pseudo_element: Option<&'a PseudoElement>, pseudo_element: Option<&'a PseudoElement>,
style_attribute: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>, style_attribute: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>,
smil_override: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>, smil_override: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>,
animation_rules: AnimationRules, animation_declarations: AnimationDeclarations,
rule_inclusion: RuleInclusion, rule_inclusion: RuleInclusion,
rules: &'a mut ApplicableDeclarationList, rules: &'a mut ApplicableDeclarationList,
context: &'a mut MatchingContext<'b, E::Impl>, context: &'a mut MatchingContext<'b, E::Impl>,
@ -92,7 +92,7 @@ where
pseudo_element: Option<&'a PseudoElement>, pseudo_element: Option<&'a PseudoElement>,
style_attribute: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>, style_attribute: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>,
smil_override: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>, smil_override: Option<ArcBorrow<'a, Locked<PropertyDeclarationBlock>>>,
animation_rules: AnimationRules, animation_declarations: AnimationDeclarations,
rule_inclusion: RuleInclusion, rule_inclusion: RuleInclusion,
rules: &'a mut ApplicableDeclarationList, rules: &'a mut ApplicableDeclarationList,
context: &'a mut MatchingContext<'b, E::Impl>, context: &'a mut MatchingContext<'b, E::Impl>,
@ -123,7 +123,7 @@ where
pseudo_element, pseudo_element,
style_attribute, style_attribute,
smil_override, smil_override,
animation_rules, animation_declarations,
rule_inclusion, rule_inclusion,
context, context,
flags_setter, flags_setter,
@ -450,7 +450,7 @@ where
// The animations sheet (CSS animations, script-generated // The animations sheet (CSS animations, script-generated
// animations, and CSS transitions that are no longer tied to CSS // animations, and CSS transitions that are no longer tied to CSS
// markup). // markup).
if let Some(anim) = self.animation_rules.0.take() { if let Some(anim) = self.animation_declarations.animations.take() {
self.rules self.rules
.push(ApplicableDeclarationBlock::from_declarations( .push(ApplicableDeclarationBlock::from_declarations(
anim, anim,
@ -460,7 +460,7 @@ where
// The transitions sheet (CSS transitions that are tied to CSS // The transitions sheet (CSS transitions that are tied to CSS
// markup). // markup).
if let Some(anim) = self.animation_rules.1.take() { if let Some(anim) = self.animation_declarations.transitions.take() {
self.rules self.rules
.push(ApplicableDeclarationBlock::from_declarations( .push(ApplicableDeclarationBlock::from_declarations(
anim, anim,

View file

@ -10,7 +10,7 @@ use crate::data::{EagerPseudoStyles, ElementStyles};
use crate::dom::TElement; use crate::dom::TElement;
use crate::matching::MatchMethods; use crate::matching::MatchMethods;
use crate::properties::longhands::display::computed_value::T as Display; use crate::properties::longhands::display::computed_value::T as Display;
use crate::properties::{AnimationRules, ComputedValues}; use crate::properties::ComputedValues;
use crate::rule_tree::StrongRuleNode; use crate::rule_tree::StrongRuleNode;
use crate::selector_parser::{PseudoElement, SelectorImpl}; use crate::selector_parser::{PseudoElement, SelectorImpl};
use crate::stylist::RuleInclusion; use crate::stylist::RuleInclusion;
@ -473,7 +473,7 @@ where
implemented_pseudo.as_ref(), implemented_pseudo.as_ref(),
self.element.style_attribute(), self.element.style_attribute(),
self.element.smil_override(), self.element.smil_override(),
self.element.animation_rules(self.context.shared), self.element.animation_declarations(self.context.shared),
self.rule_inclusion, self.rule_inclusion,
&mut applicable_declarations, &mut applicable_declarations,
&mut matching_context, &mut matching_context,
@ -552,7 +552,7 @@ where
Some(pseudo_element), Some(pseudo_element),
None, None,
None, None,
AnimationRules(None, None), /* animation_declarations = */ Default::default(),
self.rule_inclusion, self.rule_inclusion,
&mut applicable_declarations, &mut applicable_declarations,
&mut matching_context, &mut matching_context,

View file

@ -15,7 +15,7 @@ use crate::invalidation::element::invalidation_map::InvalidationMap;
use crate::invalidation::media_queries::{EffectiveMediaQueryResults, ToMediaListKey}; use crate::invalidation::media_queries::{EffectiveMediaQueryResults, ToMediaListKey};
use crate::media_queries::Device; use crate::media_queries::Device;
use crate::properties::{self, CascadeMode, ComputedValues}; use crate::properties::{self, CascadeMode, ComputedValues};
use crate::properties::{AnimationRules, PropertyDeclarationBlock}; use crate::properties::{AnimationDeclarations, PropertyDeclarationBlock};
use crate::rule_cache::{RuleCache, RuleCacheConditions}; use crate::rule_cache::{RuleCache, RuleCacheConditions};
use crate::rule_collector::{containing_shadow_ignoring_svg_use, RuleCollector}; use crate::rule_collector::{containing_shadow_ignoring_svg_use, RuleCollector};
use crate::rule_tree::{CascadeLevel, RuleTree, StrongRuleNode, StyleSource}; use crate::rule_tree::{CascadeLevel, RuleTree, StrongRuleNode, StyleSource};
@ -974,7 +974,7 @@ impl Stylist {
Some(&pseudo), Some(&pseudo),
None, None,
None, None,
AnimationRules(None, None), /* animation_declarations = */ Default::default(),
rule_inclusion, rule_inclusion,
&mut declarations, &mut declarations,
&mut matching_context, &mut matching_context,
@ -1004,7 +1004,7 @@ impl Stylist {
Some(&pseudo), Some(&pseudo),
None, None,
None, None,
AnimationRules(None, None), /* animation_declarations = */ Default::default(),
rule_inclusion, rule_inclusion,
&mut declarations, &mut declarations,
&mut matching_context, &mut matching_context,
@ -1127,7 +1127,7 @@ impl Stylist {
pseudo_element: Option<&PseudoElement>, pseudo_element: Option<&PseudoElement>,
style_attribute: Option<ArcBorrow<Locked<PropertyDeclarationBlock>>>, style_attribute: Option<ArcBorrow<Locked<PropertyDeclarationBlock>>>,
smil_override: Option<ArcBorrow<Locked<PropertyDeclarationBlock>>>, smil_override: Option<ArcBorrow<Locked<PropertyDeclarationBlock>>>,
animation_rules: AnimationRules, animation_declarations: AnimationDeclarations,
rule_inclusion: RuleInclusion, rule_inclusion: RuleInclusion,
applicable_declarations: &mut ApplicableDeclarationList, applicable_declarations: &mut ApplicableDeclarationList,
context: &mut MatchingContext<E::Impl>, context: &mut MatchingContext<E::Impl>,
@ -1142,7 +1142,7 @@ impl Stylist {
pseudo_element, pseudo_element,
style_attribute, style_attribute,
smil_override, smil_override,
animation_rules, animation_declarations,
rule_inclusion, rule_inclusion,
applicable_declarations, applicable_declarations,
context, context,