aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_thread
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_thread')
-rw-r--r--components/layout_thread/dom_wrapper.rs55
-rw-r--r--components/layout_thread/lib.rs24
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),
);