Selaa lähdekoodia

LibWeb: Handle persisting an animation after it has been removed

Matthew Olsson 1 vuosi sitten
vanhempi
commit
6859826e3d

+ 1 - 0
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

+ 8 - 0
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 });

+ 7 - 2
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