• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef ActiveAnimations_h
32 #define ActiveAnimations_h
33 
34 #include "core/animation/AnimationStack.h"
35 #include "core/animation/css/CSSAnimations.h"
36 #include "wtf/HashCountedSet.h"
37 #include "wtf/HashMap.h"
38 #include "wtf/RefPtr.h"
39 #include "wtf/Vector.h"
40 
41 namespace WebCore {
42 
43 class CSSAnimations;
44 class RenderObject;
45 class Element;
46 
47 class ActiveAnimations : public NoBaseWillBeGarbageCollectedFinalized<ActiveAnimations> {
48     WTF_MAKE_NONCOPYABLE(ActiveAnimations);
49 public:
ActiveAnimations()50     ActiveAnimations()
51         : m_animationStyleChange(false)
52     {
53     }
54 
55     ~ActiveAnimations();
56 
57     // Animations that are currently active for this element, their effects will be applied
58     // during a style recalc. CSS Transitions are included in this stack.
defaultStack()59     AnimationStack& defaultStack() { return m_defaultStack; }
60     // Tracks the state of active CSS Animations and Transitions. The individual animations
61     // will also be part of the default stack, but the mapping betwen animation name and
62     // player is kept here.
cssAnimations()63     CSSAnimations& cssAnimations() { return m_cssAnimations; }
cssAnimations()64     const CSSAnimations& cssAnimations() const { return m_cssAnimations; }
65 
66     typedef WillBeHeapHashMap<RawPtrWillBeWeakMember<AnimationPlayer>, int> AnimationPlayerCountedSet;
67     // AnimationPlayers which have animations targeting this element.
players()68     const AnimationPlayerCountedSet& players() const { return m_players; }
69     void addPlayer(AnimationPlayer*);
70     void removePlayer(AnimationPlayer*);
71 
72 #if ENABLE(OILPAN)
isEmpty()73     bool isEmpty() const { return m_defaultStack.isEmpty() && m_cssAnimations.isEmpty(); }
74 #else
isEmpty()75     bool isEmpty() const { return m_defaultStack.isEmpty() && m_cssAnimations.isEmpty() && m_animations.isEmpty(); }
76 #endif
77 
78     void cancelAnimationOnCompositor();
79 
80     void updateAnimationFlags(RenderStyle&);
setAnimationStyleChange(bool animationStyleChange)81     void setAnimationStyleChange(bool animationStyleChange) { m_animationStyleChange = animationStyleChange; }
82 
83 #if !ENABLE(OILPAN)
addAnimation(Animation * animation)84     void addAnimation(Animation* animation) { m_animations.append(animation); }
notifyAnimationDestroyed(Animation * animation)85     void notifyAnimationDestroyed(Animation* animation) { m_animations.remove(m_animations.find(animation)); }
86 #endif
87 
88     void trace(Visitor*);
89 
90 private:
isAnimationStyleChange()91     bool isAnimationStyleChange() const { return m_animationStyleChange; }
92 
93     AnimationStack m_defaultStack;
94     CSSAnimations m_cssAnimations;
95     AnimationPlayerCountedSet m_players;
96     bool m_animationStyleChange;
97 
98 #if !ENABLE(OILPAN)
99     // FIXME: Oilpan: This is to avoid a reference cycle that keeps Elements alive
100     // and won't be needed once the Node hierarchy becomes traceable.
101     Vector<Animation*> m_animations;
102 #endif
103 
104     // CSSAnimations checks if a style change is due to animation.
105     friend class CSSAnimations;
106 };
107 
108 } // namespace WebCore
109 
110 #endif
111