diff options
author | bors-servo <servo-ops@mozilla.com> | 2020-06-16 03:25:29 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-16 03:25:29 -0400 |
commit | ba5568a0a60cbd4bbedd3b766b7182824d75b131 (patch) | |
tree | ebf1b7c38ff7d98f195b331c81fbcb88287393f0 /components/layout_thread_2020 | |
parent | 19c1f72eb2fe5178311161b6c85a67956a5a69b3 (diff) | |
parent | 4a3995bb375d43d53666a348ec0c08065784f6ea (diff) | |
download | servo-ba5568a0a60cbd4bbedd3b766b7182824d75b131.tar.gz servo-ba5568a0a60cbd4bbedd3b766b7182824d75b131.zip |
Auto merge of #26921 - mrobinson:animation-set-key, r=jdm
Add DocumentAnimationSet and AnimationSetKey
This will be used in order to hold animations for pseudo elements in the
DocumentAnimationSet. Also no longer store the OpaqueNode in the
animation and transition data structures. This is already part of the
DocumentAnimationSet key.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes do not require tests because they should not change behavior.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
Diffstat (limited to 'components/layout_thread_2020')
-rw-r--r-- | components/layout_thread_2020/dom_wrapper.rs | 55 | ||||
-rw-r--r-- | components/layout_thread_2020/lib.rs | 20 |
2 files changed, 25 insertions, 50 deletions
diff --git a/components/layout_thread_2020/dom_wrapper.rs b/components/layout_thread_2020/dom_wrapper.rs index 037b927539e..c8a7aa4dd05 100644 --- a/components/layout_thread_2020/dom_wrapper.rs +++ b/components/layout_thread_2020/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; @@ -482,20 +483,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( @@ -504,20 +496,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 { @@ -642,21 +625,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_2020/lib.rs b/components/layout_thread_2020/lib.rs index 4ae69e6255a..4e04f6f0c4b 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -27,7 +27,7 @@ use crossbeam_channel::{Receiver, Sender}; use embedder_traits::resources::{self, Resource}; use euclid::{default::Size2D as UntypedSize2D, Point2D, Rect, Scale, Size2D}; use fnv::FnvHashMap; -use fxhash::{FxHashMap, FxHashSet}; +use fxhash::FxHashMap; use gfx::font_cache_thread::FontCacheThread; use gfx::font_context; use gfx_traits::{node_id_from_scroll_id, Epoch}; @@ -81,11 +81,10 @@ 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::DocumentAnimationSet; use style::context::{ QuirksMode, RegisteredSpeculativePainter, RegisteredSpeculativePainters, SharedStyleContext, }; -use style::dom::OpaqueNode; use style::dom::{TDocument, TElement, TNode}; use style::driver; use style::error_reporting::RustLogReporter; @@ -568,7 +567,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 { @@ -584,7 +583,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, @@ -1065,7 +1064,7 @@ impl LayoutThread { &map, origin, data.animation_timeline_value, - data.animations.clone(), + &data.animations, data.stylesheets_changed, ); @@ -1292,7 +1291,7 @@ impl LayoutThread { context: &mut LayoutContext, ) { Self::cancel_animations_for_nodes_not_in_fragment_tree( - &mut *(context.style_context.animation_states.write()), + &context.style_context.animations, &fragment_tree, ); @@ -1380,16 +1379,17 @@ 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_fragment_tree( - animation_states: &mut FxHashMap<OpaqueNode, ElementAnimationSet>, + animations: &DocumentAnimationSet, root: &FragmentTree, ) { // Assume all nodes have been removed until proven otherwise. - let mut invalid_nodes: FxHashSet<OpaqueNode> = animation_states.keys().cloned().collect(); + let mut animations = animations.sets.write(); + let mut invalid_nodes = animations.keys().cloned().collect(); root.remove_nodes_in_fragment_tree_from_set(&mut invalid_nodes); // Cancel animations for any nodes that are no longer in the fragment 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(); } } |