mirror of
https://github.com/servo/servo.git
synced 2025-06-14 11:24:33 +00:00
Cancel animations for nodes which are removed from the DOM
This includes nodes which are being reparented.
This commit is contained in:
parent
6d9b2eef29
commit
e901fa2c39
8 changed files with 32 additions and 31 deletions
|
@ -99,6 +99,27 @@ impl Animations {
|
||||||
self.unroot_unused_nodes(&sets);
|
self.unroot_unused_nodes(&sets);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Cancel animations for the given node, if any exist.
|
||||||
|
pub(crate) fn cancel_animations_for_node(&self, node: &Node) {
|
||||||
|
let mut animations = self.sets.sets.write();
|
||||||
|
let mut cancel_animations_for = |key| {
|
||||||
|
animations.get_mut(&key).map(|set| {
|
||||||
|
set.cancel_all_animations();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
let opaque_node = node.to_opaque();
|
||||||
|
cancel_animations_for(AnimationSetKey::new_for_non_pseudo(opaque_node));
|
||||||
|
cancel_animations_for(AnimationSetKey::new_for_pseudo(
|
||||||
|
opaque_node,
|
||||||
|
PseudoElement::Before,
|
||||||
|
));
|
||||||
|
cancel_animations_for(AnimationSetKey::new_for_pseudo(
|
||||||
|
opaque_node,
|
||||||
|
PseudoElement::After,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
/// Processes any new animations that were discovered after reflow. Collect messages
|
/// Processes any new animations that were discovered after reflow. Collect messages
|
||||||
/// that trigger events for any animations that changed state.
|
/// that trigger events for any animations that changed state.
|
||||||
pub(crate) fn do_post_reflow_update(&self, window: &Window, now: f64) {
|
pub(crate) fn do_post_reflow_update(&self, window: &Window, now: f64) {
|
||||||
|
|
|
@ -3855,6 +3855,10 @@ impl Document {
|
||||||
.borrow()
|
.borrow()
|
||||||
.do_post_reflow_update(&self.window, self.current_animation_timeline_value());
|
.do_post_reflow_update(&self.window, self.current_animation_timeline_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn cancel_animations_for_node(&self, node: &Node) {
|
||||||
|
self.animations.borrow().cancel_animations_for_node(node);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Element {
|
impl Element {
|
||||||
|
|
|
@ -281,6 +281,11 @@ impl Node {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clean_up_layout_data(&self) {
|
||||||
|
self.owner_doc().cancel_animations_for_node(self);
|
||||||
|
self.style_and_layout_data.borrow_mut().take();
|
||||||
|
}
|
||||||
|
|
||||||
/// Clean up flags and unbind from tree.
|
/// Clean up flags and unbind from tree.
|
||||||
pub fn complete_remove_subtree(root: &Node, context: &UnbindContext) {
|
pub fn complete_remove_subtree(root: &Node, context: &UnbindContext) {
|
||||||
for node in root.traverse_preorder(ShadowIncluding::Yes) {
|
for node in root.traverse_preorder(ShadowIncluding::Yes) {
|
||||||
|
@ -295,6 +300,8 @@ impl Node {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
for node in root.traverse_preorder(ShadowIncluding::Yes) {
|
for node in root.traverse_preorder(ShadowIncluding::Yes) {
|
||||||
|
node.clean_up_layout_data();
|
||||||
|
|
||||||
// This needs to be in its own loop, because unbind_from_tree may
|
// This needs to be in its own loop, because unbind_from_tree may
|
||||||
// rely on the state of IS_IN_DOC of the context node's descendants,
|
// rely on the state of IS_IN_DOC of the context node's descendants,
|
||||||
// e.g. when removing a <form>.
|
// e.g. when removing a <form>.
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[disconnected-element-001.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Transitions are canceled when an element is re-parented to the same node]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[Transitions are canceled when an element is re-parented]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -212,9 +212,6 @@
|
||||||
[text-indent length(in) / events]
|
[text-indent length(in) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / events]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[text-indent length(pc) / events]
|
[text-indent length(pc) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -227,9 +224,6 @@
|
||||||
[text-indent length(cm) / events]
|
[text-indent length(cm) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / values]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[outline-width length(cm) / events]
|
[outline-width length(cm) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -104,9 +104,6 @@
|
||||||
[vertical-align length(cm) / values]
|
[vertical-align length(cm) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / events]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[vertical-align length(ex) / values]
|
[vertical-align length(ex) / values]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -212,9 +212,6 @@
|
||||||
[text-indent length(in) / events]
|
[text-indent length(in) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / events]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[text-indent length(pc) / events]
|
[text-indent length(pc) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -227,9 +224,6 @@
|
||||||
[text-indent length(cm) / events]
|
[text-indent length(cm) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[visibility visibility(keyword) / values]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[outline-width length(cm) / events]
|
[outline-width length(cm) / events]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[disconnected-element-001.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Transitions are canceled when an element is re-parented to the same node]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[Transitions are canceled when an element is re-parented]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue