diff --git a/Tests/LibWeb/Text/expected/WebAnimations/animation-methods/persist.txt b/Tests/LibWeb/Text/expected/WebAnimations/animation-methods/persist.txt index bfeb4083b4c..96b2640b4a2 100644 --- a/Tests/LibWeb/Text/expected/WebAnimations/animation-methods/persist.txt +++ b/Tests/LibWeb/Text/expected/WebAnimations/animation-methods/persist.txt @@ -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 diff --git a/Tests/LibWeb/Text/input/WebAnimations/animation-methods/persist.html b/Tests/LibWeb/Text/input/WebAnimations/animation-methods/persist.html index 3680188be09..372fb4ad7cb 100644 --- a/Tests/LibWeb/Text/input/WebAnimations/animation-methods/persist.html +++ b/Tests/LibWeb/Text/input/WebAnimations/animation-methods/persist.html @@ -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 }); diff --git a/Userland/Libraries/LibWeb/Animations/Animation.cpp b/Userland/Libraries/LibWeb/Animations/Animation.cpp index c64a6615972..f7e86073973 100644 --- a/Userland/Libraries/LibWeb/Animations/Animation.cpp +++ b/Userland/Libraries/LibWeb/Animations/Animation.cpp @@ -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