Prechádzať zdrojové kódy

LibWeb: Implement Animation::set_effect()

Matthew Olsson 1 rok pred
rodič
commit
2358f64d00

+ 32 - 2
Userland/Libraries/LibWeb/Animations/Animation.cpp

@@ -44,8 +44,38 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Animation>> Animation::construct_impl(JS::R
 // https://www.w3.org/TR/web-animations-1/#animation-set-the-associated-effect-of-an-animation
 void Animation::set_effect(JS::GCPtr<AnimationEffect> new_effect)
 {
-    // FIXME: Implement
-    (void)new_effect;
+    // Setting this attribute updates the object’s associated effect using the procedure to set the associated effect of
+    // an animation.
+
+    // 1. Let old effect be the current associated effect of animation, if any.
+    auto old_effect = m_effect;
+
+    // 2. If new effect is the same object as old effect, abort this procedure.
+    if (new_effect == old_effect)
+        return;
+
+    // FIXME: 3. If animation has a pending pause task, reschedule that task to run as soon as animation is ready.
+
+    // FIXME: 4. If animation has a pending play task, reschedule that task to run as soon as animation is ready to play
+    //           new effect.
+
+    // 5. If new effect is not null and if new effect is the associated effect of another animation, previous animation,
+    //    run the procedure to set the associated effect of an animation (this procedure) on previous animation passing
+    //    null as new effect.
+    if (new_effect && new_effect->associated_animation() != this) {
+        if (auto animation = new_effect->associated_animation())
+            animation->set_effect({});
+    }
+
+    // 6. Let the associated effect of animation be new effect.
+    if (new_effect)
+        new_effect->set_associated_animation(this);
+    if (m_effect)
+        m_effect->set_associated_animation({});
+    m_effect = new_effect;
+
+    // FIXME: 7. Run the procedure to update an animation’s finished state for animation with the did seek flag set to
+    //           false, and the synchronously notify flag set to false.
 }
 
 // https://www.w3.org/TR/web-animations-1/#animation-set-the-timeline-of-an-animation

+ 6 - 0
Userland/Libraries/LibWeb/Animations/AnimationEffect.h

@@ -84,6 +84,9 @@ public:
     String const& easing_function() const { return m_easing_function; }
     void set_easing_function(String easing_function) { m_easing_function = move(easing_function); }
 
+    JS::GCPtr<Animation> associated_animation() const { return m_associated_animation; }
+    void set_associated_animation(JS::GCPtr<Animation> value) { m_associated_animation = value; }
+
 protected:
     AnimationEffect(JS::Realm&);
 
@@ -112,6 +115,9 @@ protected:
 
     // https://www.w3.org/TR/css-easing-1/#easing-function
     String m_easing_function { "linear"_string };
+
+    // https://www.w3.org/TR/web-animations-1/#animation-associated-effect
+    JS::GCPtr<Animation> m_associated_animation {};
 };
 
 }