diff options
Diffstat (limited to 'components/layout_thread')
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 55 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 24 |
2 files changed, 28 insertions, 51 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index b477a653188..3d3f50317a9 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -72,6 +72,7 @@ use std::fmt::Debug; use std::hash::{Hash, Hasher}; use std::sync::atomic::Ordering; use std::sync::Arc as StdArc; +use style::animation::AnimationSetKey; use style::applicable_declarations::ApplicableDeclarationBlock; use style::attr::AttrValue; use style::context::SharedStyleContext; @@ -474,20 +475,11 @@ impl<'le> TElement for ServoLayoutElement<'le> { ) -> Option<Arc<StyleLocked<PropertyDeclarationBlock>>> { let node = self.as_node(); let document = node.owner_doc(); - context - .animation_states - .read() - .get(&node.opaque()) - .and_then(|set| { - set.get_value_map_for_active_animations(context.current_time_for_animations) - }) - .map(|map| { - Arc::new( - document - .style_shared_lock() - .wrap(PropertyDeclarationBlock::from_animation_value_map(&map)), - ) - }) + context.animations.get_animation_declarations( + &AnimationSetKey(node.opaque()), + context.current_time_for_animations, + document.style_shared_lock(), + ) } fn transition_rule( @@ -496,20 +488,11 @@ impl<'le> TElement for ServoLayoutElement<'le> { ) -> Option<Arc<StyleLocked<PropertyDeclarationBlock>>> { let node = self.as_node(); let document = node.owner_doc(); - context - .animation_states - .read() - .get(&node.opaque()) - .and_then(|set| { - set.get_value_map_for_active_transitions(context.current_time_for_animations) - }) - .map(|map| { - Arc::new( - document - .style_shared_lock() - .wrap(PropertyDeclarationBlock::from_animation_value_map(&map)), - ) - }) + context.animations.get_transition_declarations( + &AnimationSetKey(node.opaque()), + context.current_time_for_animations, + document.style_shared_lock(), + ) } fn state(&self) -> ElementState { @@ -634,21 +617,13 @@ impl<'le> TElement for ServoLayoutElement<'le> { } fn has_css_animations(&self, context: &SharedStyleContext) -> bool { - context - .animation_states - .read() - .get(&self.as_node().opaque()) - .map(|set| set.has_active_animation()) - .unwrap_or(false) + let key = AnimationSetKey(self.as_node().opaque()); + context.animations.has_active_animations(&key) } fn has_css_transitions(&self, context: &SharedStyleContext) -> bool { - context - .animation_states - .read() - .get(&self.as_node().opaque()) - .map(|set| set.has_active_transition()) - .unwrap_or(false) + let key = AnimationSetKey(self.as_node().opaque()); + context.animations.has_active_transitions(&key) } #[inline] diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 14dbfc0c80e..5930e85b08c 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -42,7 +42,7 @@ use layout::context::malloc_size_of_persistent_local_context; use layout::context::LayoutContext; use layout::context::RegisteredPainter; use layout::context::RegisteredPainters; -use layout::display_list::items::{OpaqueNode, WebRenderImageInfo}; +use layout::display_list::items::WebRenderImageInfo; use layout::display_list::{IndexableText, ToLayout}; use layout::flow::{Flow, GetBaseFlow, ImmutableFlowUtils, MutableOwnedFlowUtils}; use layout::flow_ref::FlowRef; @@ -98,7 +98,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, MutexGuard}; use std::thread; use std::time::Duration; -use style::animation::ElementAnimationSet; +use style::animation::{AnimationSetKey, DocumentAnimationSet, ElementAnimationSet}; use style::context::SharedStyleContext; use style::context::{QuirksMode, RegisteredSpeculativePainter, RegisteredSpeculativePainters}; use style::dom::{ShowSubtree, ShowSubtreeDataAndPrimaryValues, TDocument, TElement, TNode}; @@ -604,7 +604,7 @@ impl LayoutThread { snapshot_map: &'a SnapshotMap, origin: ImmutableOrigin, animation_timeline_value: f64, - animation_states: ServoArc<RwLock<FxHashMap<OpaqueNode, ElementAnimationSet>>>, + animations: &DocumentAnimationSet, stylesheets_changed: bool, ) -> LayoutContext<'a> { let traversal_flags = match stylesheets_changed { @@ -620,7 +620,7 @@ impl LayoutThread { options: GLOBAL_STYLE_DATA.options.clone(), guards, visited_styles_enabled: false, - animation_states, + animations: animations.clone(), registered_speculative_painters: &self.registered_painters, current_time_for_animations: animation_timeline_value, traversal_flags, @@ -1402,7 +1402,7 @@ impl LayoutThread { &map, origin, data.animation_timeline_value, - data.animations.clone(), + &data.animations, data.stylesheets_changed, ); @@ -1643,24 +1643,26 @@ impl LayoutThread { /// TODO(mrobinson): We should look into a way of doing this during flow tree construction. /// This also doesn't yet handles nodes that have been reparented. fn cancel_animations_for_nodes_not_in_flow_tree( - animation_states: &mut FxHashMap<OpaqueNode, ElementAnimationSet>, + animations: &mut FxHashMap<AnimationSetKey, ElementAnimationSet>, root_flow: &mut dyn Flow, ) { // Assume all nodes have been removed until proven otherwise. - let mut invalid_nodes: FxHashSet<OpaqueNode> = animation_states.keys().cloned().collect(); - fn traverse_flow(flow: &mut dyn Flow, invalid_nodes: &mut FxHashSet<OpaqueNode>) { + let mut invalid_nodes = animations.keys().cloned().collect(); + + fn traverse_flow(flow: &mut dyn Flow, invalid_nodes: &mut FxHashSet<AnimationSetKey>) { flow.mutate_fragments(&mut |fragment| { - invalid_nodes.remove(&fragment.node); + invalid_nodes.remove(&AnimationSetKey(fragment.node)); }); for kid in flow.mut_base().children.iter_mut() { traverse_flow(kid, invalid_nodes) } } + traverse_flow(root_flow, &mut invalid_nodes); // Cancel animations for any nodes that are no longer in the flow tree. for node in &invalid_nodes { - if let Some(state) = animation_states.get_mut(node) { + if let Some(state) = animations.get_mut(node) { state.cancel_all_animations(); } } @@ -1676,7 +1678,7 @@ impl LayoutThread { context: &mut LayoutContext, ) { Self::cancel_animations_for_nodes_not_in_flow_tree( - &mut *(context.style_context.animation_states.write()), + &mut *(context.style_context.animations.sets.write()), FlowRef::deref_mut(root_flow), ); |