LibWeb: Handle persisting an animation after it has been removed

This commit is contained in:
Matthew Olsson 2024-05-28 04:39:58 -07:00 committed by Andreas Kling
parent a80af938eb
commit 6859826e3d
3 changed files with 16 additions and 2 deletions

View file

@ -1,3 +1,4 @@
persist() sets animation's replaceState to persist
persist() undoes the Document removal effects: true
Animations are properly replaced when covered by another animation
persist() keeps an animation from being replaced

View file

@ -10,6 +10,14 @@
anim.persist();
if (prevReplaceState === "active" && anim.replaceState === "persisted")
println("persist() sets animation's replaceState to persist");
anim.cancel();
// "Undo" the removal of an animation by the Document
anim1 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
anim2 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
await anim1.finished;
anim1.persist();
println(`persist() undoes the Document removal effects: ${foo.getAnimations().length === 2}`);
const timeline = internals.createInternalAnimationTimeline();
let anim1 = foo.animate({ opacity: 0 }, { duration: 1000, fill: "forwards", timeline });

View file

@ -358,8 +358,6 @@ bool Animation::is_replaceable() const
void Animation::set_replace_state(Bindings::AnimationReplaceState value)
{
m_replace_state = value;
if (value == Bindings::AnimationReplaceState::Removed) {
// Remove the associated effect from its target, if applicable
if (m_effect && m_effect->target())
@ -367,7 +365,14 @@ void Animation::set_replace_state(Bindings::AnimationReplaceState value)
// Remove this animation from its timeline
m_timeline->disassociate_with_animation(*this);
} else if (value == Bindings::AnimationReplaceState::Persisted && m_replace_state == Bindings::AnimationReplaceState::Removed) {
// This animation was removed, but is now being "unremoved"; undo the effects from the if-statement above
if (m_effect && m_effect->target())
m_effect->target()->associate_with_animation(*this);
m_timeline->associate_with_animation(*this);
}
m_replace_state = value;
}
// https://www.w3.org/TR/web-animations-1/#dom-animation-onfinish