Title: [200047] trunk
Revision
200047
Author
[email protected]
Date
2016-04-25 13:56:47 -0700 (Mon, 25 Apr 2016)

Log Message

Toggling animation-play-state can re-start a finished animation
https://bugs.webkit.org/show_bug.cgi?id=156731

Reviewed by Dean Jackson.

Source/WebCore:

After an animation completed, CompositeAnimation::updateKeyframeAnimations() cleared
all state that the animation had run on the element, so changing the value of some
animation property triggered the animation to run again. This is wrong, since animation-name
still applied to the element.

Fix by keeping state for keyframe animations in the Done state in the m_keyframeAnimations
map. This allows for the removal of the index property on KeyframeAnimation.

Tests: animations/change-completed-animation-transform.html
       animations/change-completed-animation.html

* page/animation/AnimationBase.cpp:
(WebCore::AnimationBase::timeToNextService):
* page/animation/AnimationBase.h:
(WebCore::AnimationBase::isAnimatingProperty):
* page/animation/CompositeAnimation.cpp: Add animations that should stick around to AnimationNameMap,
and swap with m_keyframeAnimations at the end.
(WebCore::CompositeAnimation::updateKeyframeAnimations):
* page/animation/KeyframeAnimation.cpp:
(WebCore::KeyframeAnimation::KeyframeAnimation):
(WebCore::KeyframeAnimation::getAnimatedStyle):
* page/animation/KeyframeAnimation.h:

LayoutTests:

* animations/animation-direction-reverse-expected.txt:
* animations/animation-direction-reverse.html: This is a progression. The test was detecting a
restarted animation.
* animations/change-completed-animation-expected.txt: Added.
* animations/change-completed-animation-transform-expected.html: Added.
* animations/change-completed-animation-transform.html: Added. Ref test that ensures that the final
state for normal and accelerated animations is correct.
* animations/change-completed-animation.html: Added. Tests that changing a property doesn't trigger
another animation, by detecting a second animationstart event.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (200046 => 200047)


--- trunk/LayoutTests/ChangeLog	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/LayoutTests/ChangeLog	2016-04-25 20:56:47 UTC (rev 200047)
@@ -1,5 +1,22 @@
 2016-04-25  Simon Fraser  <[email protected]>
 
+        Toggling animation-play-state can re-start a finished animation
+        https://bugs.webkit.org/show_bug.cgi?id=156731
+
+        Reviewed by Dean Jackson.
+
+        * animations/animation-direction-reverse-expected.txt:
+        * animations/animation-direction-reverse.html: This is a progression. The test was detecting a
+        restarted animation.
+        * animations/change-completed-animation-expected.txt: Added.
+        * animations/change-completed-animation-transform-expected.html: Added.
+        * animations/change-completed-animation-transform.html: Added. Ref test that ensures that the final
+        state for normal and accelerated animations is correct.
+        * animations/change-completed-animation.html: Added. Tests that changing a property doesn't trigger
+        another animation, by detecting a second animationstart event.
+
+2016-04-25  Simon Fraser  <[email protected]>
+
         play-state not parsed as part of animation shorthand
         https://bugs.webkit.org/show_bug.cgi?id=156959
 

Modified: trunk/LayoutTests/animations/animation-direction-reverse-expected.txt (200046 => 200047)


--- trunk/LayoutTests/animations/animation-direction-reverse-expected.txt	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/LayoutTests/animations/animation-direction-reverse-expected.txt	2016-04-25 20:56:47 UTC (rev 200047)
@@ -1,4 +1,4 @@
 PASS - "webkitTransform" property for "box" element at 0.5s saw something close to: 1,0,0,1,150,0
 PASS - "webkitTransform" property for "box" element at 1s saw something close to: 1,0,0,1,100,0
-PASS - "webkitTransform" property for "box" element at 2.5s saw something close to: 1,0,0,1,200,0
+PASS - "webkitTransform" property for "box" element at 2.5s saw something close to: none
 

Modified: trunk/LayoutTests/animations/animation-direction-reverse.html (200046 => 200047)


--- trunk/LayoutTests/animations/animation-direction-reverse.html	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/LayoutTests/animations/animation-direction-reverse.html	2016-04-25 20:56:47 UTC (rev 200047)
@@ -34,7 +34,7 @@
       // [animation-name, time, element-id, property, expected-value, tolerance]
       ["move1", 0.5, "box", "webkitTransform", [1,0,0,1, 150,0], 20],
       ["move1", 1.0, "box", "webkitTransform", [1,0,0,1,100,0], 20],
-      ["move1", 2.5, "box", "webkitTransform", [1,0,0,1, 200,0], 20],
+      ["move1", 2.5, "box", "webkitTransform", 'none', 20],
     ];
 
     function pauseAnimation()

Added: trunk/LayoutTests/animations/change-completed-animation-expected.txt (0 => 200047)


--- trunk/LayoutTests/animations/change-completed-animation-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/animations/change-completed-animation-expected.txt	2016-04-25 20:56:47 UTC (rev 200047)
@@ -0,0 +1 @@
+PASS: animation did not restart after changing animation-duration.

Added: trunk/LayoutTests/animations/change-completed-animation-transform-expected.html (0 => 200047)


--- trunk/LayoutTests/animations/change-completed-animation-transform-expected.html	                        (rev 0)
+++ trunk/LayoutTests/animations/change-completed-animation-transform-expected.html	2016-04-25 20:56:47 UTC (rev 200047)
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        .container {
+            height: 100px;
+            width: 500px;
+            margin: 4px;
+            border: 1px solid black;
+        }
+        .box {
+            position: relative;
+            width: 100px;
+            height: 100px;
+            background-color: green;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div id="box" class="mover box"></div>
+    </div>
+    <div class="container">
+        <div id="box" class="slider box"></div>
+    </div>
+</body>
+</html>

Added: trunk/LayoutTests/animations/change-completed-animation-transform.html (0 => 200047)


--- trunk/LayoutTests/animations/change-completed-animation-transform.html	                        (rev 0)
+++ trunk/LayoutTests/animations/change-completed-animation-transform.html	2016-04-25 20:56:47 UTC (rev 200047)
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        .container {
+            height: 100px;
+            width: 500px;
+            margin: 4px;
+            border: 1px solid black;
+        }
+        .box {
+            position: relative;
+            width: 100px;
+            height: 100px;
+            background-color: green;
+        }
+        
+        .mover {
+            animation: move 0.25s linear;
+        }
+        
+        body.changed .mover {
+            animation-duration: 0.2s;
+        }
+
+        .slider {
+            animation: slide 0.25s linear;
+        }
+        
+        body.changed .slider {
+            animation-duration: 0.2s;
+        }
+
+        @keyframes move {
+            from { left: 100px; }
+            to   { left: 400px; }
+        }
+
+        @keyframes slide {
+            from { transform: translateX(100px); }
+            to   { transform: translateX(400px); }
+        }
+    </style>
+    <script>
+        if (window.testRunner)
+            testRunner.waitUntilDone();
+
+        function doTest()
+        {
+            var box = document.getElementById('box1');
+            box.addEventListener('animationend', function() {
+                window.setTimeout(function() {
+                    document.body.classList.add('changed');
+                    window.setTimeout(function() {
+                        if (window.testRunner)
+                            testRunner.notifyDone();
+                    }, 10);
+                }, 0);
+            }, false);
+            
+            box.classList.add('mover');
+            document.getElementById('box2').classList.add('slider');
+        }
+        
+        window.addEventListener('load', doTest, false);
+    </script>
+</head>
+<body>
+    <div class="container">
+        <div id="box1" class="box"></div>
+    </div>
+    <div class="container">
+        <div id="box2" class="box"></div>
+    </div>
+</body>
+</html>

Added: trunk/LayoutTests/animations/change-completed-animation.html (0 => 200047)


--- trunk/LayoutTests/animations/change-completed-animation.html	                        (rev 0)
+++ trunk/LayoutTests/animations/change-completed-animation.html	2016-04-25 20:56:47 UTC (rev 200047)
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        .container {
+            height: 100px;
+            width: 500px;
+            margin: 4px;
+            border: 1px solid black;
+        }
+        .box {
+            position: relative;
+            width: 100px;
+            height: 100px;
+            background-color: green;
+        }
+        
+        .mover {
+            animation: move 0.25s linear;
+        }
+        
+        .mover.changed {
+            animation-duration: 0.2s;
+        }
+        
+        @keyframes move {
+            from { left: 100px; }
+            to   { left: 400px; }
+        }
+    </style>
+    <script>
+        if (window.testRunner) {
+            testRunner.waitUntilDone();
+            testRunner.dumpAsText();
+        }
+
+        function doTest()
+        {
+            var box = document.getElementById('box');
+            box.addEventListener('animationend', function() {
+                window.setTimeout(function() {
+                    box.addEventListener('animationstart', function() {
+                        document.getElementById('results').textContent = "FAIL: animation restarted after changing animation-duration"
+                        if (window.testRunner)
+                            testRunner.notifyDone();
+                    }, false);
+
+                    // In the success case, wait a bit to make sure no animationstart event comes in.
+                    window.setTimeout(function() {
+                        if (window.testRunner)
+                            testRunner.notifyDone();
+                    }, 50);
+
+                    box.classList.add('changed');
+                }, 0);
+            }, false);
+            
+            box.classList.add('mover');
+        }
+        
+        window.addEventListener('load', doTest, false);
+    </script>
+</head>
+<body>
+    <div class="container">
+        <div id="box" class="box"></div>
+    </div>
+    <div id="results">
+        PASS: animation did not restart after changing animation-duration.
+    </div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (200046 => 200047)


--- trunk/Source/WebCore/ChangeLog	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/ChangeLog	2016-04-25 20:56:47 UTC (rev 200047)
@@ -1,3 +1,33 @@
+2016-04-25  Simon Fraser  <[email protected]>
+
+        Toggling animation-play-state can re-start a finished animation
+        https://bugs.webkit.org/show_bug.cgi?id=156731
+
+        Reviewed by Dean Jackson.
+
+        After an animation completed, CompositeAnimation::updateKeyframeAnimations() cleared
+        all state that the animation had run on the element, so changing the value of some
+        animation property triggered the animation to run again. This is wrong, since animation-name
+        still applied to the element.
+
+        Fix by keeping state for keyframe animations in the Done state in the m_keyframeAnimations
+        map. This allows for the removal of the index property on KeyframeAnimation.
+
+        Tests: animations/change-completed-animation-transform.html
+               animations/change-completed-animation.html
+
+        * page/animation/AnimationBase.cpp:
+        (WebCore::AnimationBase::timeToNextService):
+        * page/animation/AnimationBase.h:
+        (WebCore::AnimationBase::isAnimatingProperty):
+        * page/animation/CompositeAnimation.cpp: Add animations that should stick around to AnimationNameMap,
+        and swap with m_keyframeAnimations at the end.
+        (WebCore::CompositeAnimation::updateKeyframeAnimations):
+        * page/animation/KeyframeAnimation.cpp:
+        (WebCore::KeyframeAnimation::KeyframeAnimation):
+        (WebCore::KeyframeAnimation::getAnimatedStyle):
+        * page/animation/KeyframeAnimation.h:
+
 2016-04-25  Alberto Garcia  <[email protected]>
 
         [GTK] Crashes if DISPLAY is unset

Modified: trunk/Source/WebCore/page/animation/AnimationBase.cpp (200046 => 200047)


--- trunk/Source/WebCore/page/animation/AnimationBase.cpp	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/page/animation/AnimationBase.cpp	2016-04-25 20:56:47 UTC (rev 200047)
@@ -560,7 +560,7 @@
 {
     // Returns the time at which next service is required. -1 means no service is required. 0 means 
     // service is required now, and > 0 means service is required that many seconds in the future.
-    if (paused() || isNew() || m_animationState == AnimationState::FillingForwards)
+    if (paused() || isNew() || postActive() || fillingForwards())
         return -1;
     
     if (m_animationState == AnimationState::StartWaitTimer) {

Modified: trunk/Source/WebCore/page/animation/AnimationBase.h (200046 => 200047)


--- trunk/Source/WebCore/page/animation/AnimationBase.h	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/page/animation/AnimationBase.h	2016-04-25 20:56:47 UTC (rev 200047)
@@ -181,7 +181,7 @@
         if ((runningState & Paused) && inPausedState())
             return true;
 
-        if ((runningState & Running) && !inPausedState() && (m_animationState >= AnimationState::StartWaitStyleAvailable && m_animationState <= AnimationState::Done))
+        if ((runningState & Running) && !inPausedState() && (m_animationState >= AnimationState::StartWaitStyleAvailable && m_animationState < AnimationState::Done))
             return true;
 
         return false;

Modified: trunk/Source/WebCore/page/animation/CompositeAnimation.cpp (200046 => 200047)


--- trunk/Source/WebCore/page/animation/CompositeAnimation.cpp	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/page/animation/CompositeAnimation.cpp	2016-04-25 20:56:47 UTC (rev 200047)
@@ -203,99 +203,85 @@
 
     m_keyframeAnimations.checkConsistency();
     
-    if (currentStyle && currentStyle->hasAnimations() && targetStyle->hasAnimations() && *(currentStyle->animations()) == *(targetStyle->animations())) {
-        // The current and target animations are the same so we just need to toss any 
-        // animation which is finished (postActive).
-        for (auto& animation : m_keyframeAnimations.values()) {
-            if (animation->postActive())
-                animation->setIndex(-1);
-        }
-    } else {
-        // Mark all existing animations as no longer active.
-        for (auto& animation : m_keyframeAnimations.values())
-            animation->setIndex(-1);
+    if (currentStyle && currentStyle->hasAnimations() && targetStyle->hasAnimations() && *(currentStyle->animations()) == *(targetStyle->animations()))
+        return;
 
 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
-        m_hasScrollTriggeredAnimation = false;
+    m_hasScrollTriggeredAnimation = false;
 #endif
 
-        // Toss the animation order map.
-        m_keyframeAnimationOrderMap.clear();
+    AnimationNameMap newAnimations;
 
-        static NeverDestroyed<const AtomicString> none("none", AtomicString::ConstructFromLiteral);
-        
-        // Now mark any still active animations as active and add any new animations.
-        if (targetStyle->animations()) {
-            int numAnims = targetStyle->animations()->size();
-            for (int i = 0; i < numAnims; ++i) {
-                Animation& animation = targetStyle->animations()->animation(i);
-                AtomicString animationName(animation.name());
+    // Toss the animation order map.
+    m_keyframeAnimationOrderMap.clear();
 
-                if (!animation.isValidAnimation())
+    static NeverDestroyed<const AtomicString> none("none", AtomicString::ConstructFromLiteral);
+    
+    // Now mark any still active animations as active and add any new animations.
+    if (targetStyle->animations()) {
+        int numAnims = targetStyle->animations()->size();
+        for (int i = 0; i < numAnims; ++i) {
+            Animation& animation = targetStyle->animations()->animation(i);
+            AtomicString animationName(animation.name());
+
+            if (!animation.isValidAnimation())
+                continue;
+            
+            // See if there is a current animation for this name.
+            RefPtr<KeyframeAnimation> keyframeAnim = m_keyframeAnimations.get(animationName.impl());
+            if (keyframeAnim) {
+                newAnimations.add(keyframeAnim->name().impl(), keyframeAnim);
+
+                if (keyframeAnim->postActive())
                     continue;
-                
-                // See if there is a current animation for this name.
-                RefPtr<KeyframeAnimation> keyframeAnim = m_keyframeAnimations.get(animationName.impl());
-                
-                if (keyframeAnim) {
-                    // If this animation is postActive, skip it so it gets removed at the end of this function.
-                    if (keyframeAnim->postActive())
-                        continue;
 
 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
-                    if (animation.trigger()->isScrollAnimationTrigger())
-                        m_hasScrollTriggeredAnimation = true;
+                if (animation.trigger()->isScrollAnimationTrigger())
+                    m_hasScrollTriggeredAnimation = true;
 #endif
 
-                    // This one is still active.
+                // Animations match, but play states may differ. Update if needed.
+                keyframeAnim->updatePlayState(animation.playState());
 
-                    // Animations match, but play states may differ. Update if needed.
-                    keyframeAnim->updatePlayState(animation.playState());
-                                
-                    // Set the saved animation to this new one, just in case the play state has changed.
-                    keyframeAnim->setAnimation(animation);
-                    keyframeAnim->setIndex(i);
-                } else if ((animation.duration() || animation.delay()) && animation.iterationCount() && animationName != none) {
-                    keyframeAnim = KeyframeAnimation::create(animation, renderer, i, this, targetStyle);
-                    LOG(Animations, "Creating KeyframeAnimation %p on renderer %p with keyframes %s, duration %.2f, delay %.2f, iterations %.2f", keyframeAnim.get(), renderer, animation.name().utf8().data(), animation.duration(), animation.delay(), animation.iterationCount());
-                    if (m_suspended) {
-                        keyframeAnim->updatePlayState(AnimPlayStatePaused);
-                        LOG(Animations, "  (created in suspended/paused state)");
-                    }
+                // Set the saved animation to this new one, just in case the play state has changed.
+                keyframeAnim->setAnimation(animation);
+            } else if ((animation.duration() || animation.delay()) && animation.iterationCount() && animationName != none) {
+                keyframeAnim = KeyframeAnimation::create(animation, renderer, this, targetStyle);
+                LOG(Animations, "Creating KeyframeAnimation %p on renderer %p with keyframes %s, duration %.2f, delay %.2f, iterations %.2f", keyframeAnim.get(), renderer, animation.name().utf8().data(), animation.duration(), animation.delay(), animation.iterationCount());
+
+                if (m_suspended) {
+                    keyframeAnim->updatePlayState(AnimPlayStatePaused);
+                    LOG(Animations, "  (created in suspended/paused state)");
+                }
 #if !LOG_DISABLED
-                    for (auto propertyID : keyframeAnim->keyframes().properties())
-                        LOG(Animations, "  property %s", getPropertyName(propertyID));
+                for (auto propertyID : keyframeAnim->keyframes().properties())
+                    LOG(Animations, "  property %s", getPropertyName(propertyID));
 #endif
 
 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
-                    if (animation.trigger()->isScrollAnimationTrigger())
-                        m_hasScrollTriggeredAnimation = true;
+                if (animation.trigger()->isScrollAnimationTrigger())
+                    m_hasScrollTriggeredAnimation = true;
 #endif
 
-                    m_keyframeAnimations.set(keyframeAnim->name().impl(), keyframeAnim);
-                }
-                
-                // Add this to the animation order map.
-                if (keyframeAnim)
-                    m_keyframeAnimationOrderMap.append(keyframeAnim->name().impl());
+                newAnimations.set(keyframeAnim->name().impl(), keyframeAnim);
             }
+            
+            // Add this to the animation order map.
+            if (keyframeAnim)
+                m_keyframeAnimationOrderMap.append(keyframeAnim->name().impl());
         }
     }
     
     // Make a list of animations to be removed.
-    Vector<AtomicStringImpl*> animsToBeRemoved;
     for (auto& animation : m_keyframeAnimations.values()) {
-        if (animation->index() < 0) {
-            animsToBeRemoved.append(animation->name().impl());
+        if (!newAnimations.contains(animation->name().impl())) {
             animationController().animationWillBeRemoved(animation.get());
             animation->clear();
             LOG(Animations, "Removing KeyframeAnimation %p from renderer %p", animation.get(), renderer);
         }
     }
     
-    // Now remove the animations from the list.
-    for (auto* nameForRemoval : animsToBeRemoved)
-        m_keyframeAnimations.remove(nameForRemoval);
+    std::swap(newAnimations, m_keyframeAnimations);
 }
 
 bool CompositeAnimation::animate(RenderElement& renderer, RenderStyle* currentStyle, RenderStyle& targetStyle, std::unique_ptr<RenderStyle>& blendedStyle)

Modified: trunk/Source/WebCore/page/animation/KeyframeAnimation.cpp (200046 => 200047)


--- trunk/Source/WebCore/page/animation/KeyframeAnimation.cpp	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/page/animation/KeyframeAnimation.cpp	2016-04-25 20:56:47 UTC (rev 200047)
@@ -41,11 +41,10 @@
 
 namespace WebCore {
 
-KeyframeAnimation::KeyframeAnimation(Animation& animation, RenderElement* renderer, int index, CompositeAnimation* compositeAnimation, RenderStyle* unanimatedStyle)
+KeyframeAnimation::KeyframeAnimation(Animation& animation, RenderElement* renderer, CompositeAnimation* compositeAnimation, RenderStyle* unanimatedStyle)
     : AnimationBase(animation, renderer, compositeAnimation)
     , m_keyframes(animation.name())
     , m_unanimatedStyle(RenderStyle::clonePtr(*unanimatedStyle))
-    , m_index(index)
 {
     // Get the keyframe RenderStyles
     if (m_object && m_object->element())
@@ -190,9 +189,8 @@
 
 void KeyframeAnimation::getAnimatedStyle(std::unique_ptr<RenderStyle>& animatedStyle)
 {
-    // If we're in the delay phase and we're not backwards filling, tell the caller
-    // to use the current style.
-    if (waitingToStart() && m_animation->delay() > 0 && !m_animation->fillsBackwards())
+    // If we're done, or in the delay phase and we're not backwards filling, tell the caller to use the current style.
+    if (postActive() || (waitingToStart() && m_animation->delay() > 0 && !m_animation->fillsBackwards()))
         return;
 
     if (!m_keyframes.size())

Modified: trunk/Source/WebCore/page/animation/KeyframeAnimation.h (200046 => 200047)


--- trunk/Source/WebCore/page/animation/KeyframeAnimation.h	2016-04-25 20:48:04 UTC (rev 200046)
+++ trunk/Source/WebCore/page/animation/KeyframeAnimation.h	2016-04-25 20:56:47 UTC (rev 200047)
@@ -40,9 +40,9 @@
 // A KeyframeAnimation tracks the state of an explicit animation for a single RenderElement.
 class KeyframeAnimation final : public AnimationBase {
 public:
-    static Ref<KeyframeAnimation> create(Animation& animation, RenderElement* renderer, int index, CompositeAnimation* compositeAnimation, RenderStyle* unanimatedStyle)
+    static Ref<KeyframeAnimation> create(Animation& animation, RenderElement* renderer, CompositeAnimation* compositeAnimation, RenderStyle* unanimatedStyle)
     {
-        return adoptRef(*new KeyframeAnimation(animation, renderer, index, compositeAnimation, unanimatedStyle));
+        return adoptRef(*new KeyframeAnimation(animation, renderer, compositeAnimation, unanimatedStyle));
     }
 
     bool animate(CompositeAnimation*, RenderElement*, const RenderStyle* currentStyle, RenderStyle* targetStyle, std::unique_ptr<RenderStyle>& animatedStyle) override;
@@ -53,8 +53,6 @@
     const KeyframeList& keyframes() const { return m_keyframes; }
 
     const AtomicString& name() const { return m_keyframes.animationName(); }
-    int index() const { return m_index; }
-    void setIndex(int i) { m_index = i; }
 
     bool hasAnimationForProperty(CSSPropertyID) const;
     
@@ -90,7 +88,7 @@
 #endif
 
 private:
-    KeyframeAnimation(Animation&, RenderElement*, int index, CompositeAnimation*, RenderStyle* unanimatedStyle);
+    KeyframeAnimation(Animation&, RenderElement*, CompositeAnimation*, RenderStyle* unanimatedStyle);
     virtual ~KeyframeAnimation();
     
     // Get the styles for the given property surrounding the current animation time and the progress between them.
@@ -99,7 +97,6 @@
     KeyframeList m_keyframes;
     std::unique_ptr<RenderStyle> m_unanimatedStyle; // The style just before we started animation
 
-    int m_index; // The order in which this animation appears in the animation-name style.
     bool m_startEventDispatched { false };
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to