CSS Animations with triggers should map scroll position to duration
[WebKit-https.git] / Source / WebCore / platform / animation / AnimationTrigger.h
1 /*
2  * Copyright (C) 2015 Apple 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
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef AnimationTrigger_h
27 #define AnimationTrigger_h
28
29 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
30
31 #include "Length.h"
32 #include <wtf/RefCounted.h>
33 #include <wtf/RefPtr.h>
34 #include <wtf/TypeCasts.h>
35
36 namespace WebCore {
37
38 class AnimationTrigger : public RefCounted<AnimationTrigger> {
39 public:
40
41     virtual PassRefPtr<AnimationTrigger> clone() const = 0;
42
43     enum class AnimationTriggerType {
44         AutoAnimationTriggerType, ScrollAnimationTriggerType
45     };
46
47     virtual ~AnimationTrigger() { }
48
49     AnimationTriggerType type() const { return m_type; }
50
51     bool isAutoAnimationTrigger() const { return m_type == AnimationTriggerType::AutoAnimationTriggerType; }
52     bool isScrollAnimationTrigger() const { return m_type == AnimationTriggerType::ScrollAnimationTriggerType; }
53
54     virtual bool operator==(const AnimationTrigger& other) = 0;
55
56 protected:
57     AnimationTrigger(AnimationTriggerType type)
58         : m_type(type)
59     {
60     }
61
62     AnimationTriggerType m_type;
63 };
64
65 class AutoAnimationTrigger : public AnimationTrigger {
66 public:
67     static PassRefPtr<AutoAnimationTrigger> create()
68     {
69         return adoptRef(new AutoAnimationTrigger);
70     }
71
72     virtual ~AutoAnimationTrigger() { }
73
74     virtual bool operator==(const AnimationTrigger& other) override
75     {
76         return other.isAutoAnimationTrigger();
77     }
78
79 private:
80     AutoAnimationTrigger()
81         : AnimationTrigger(AnimationTriggerType::AutoAnimationTriggerType)
82     {
83     }
84
85     virtual PassRefPtr<AnimationTrigger> clone() const override
86     {
87         return adoptRef(new AutoAnimationTrigger);
88     }
89 };
90
91 class ScrollAnimationTrigger : public AnimationTrigger {
92 public:
93     static PassRefPtr<ScrollAnimationTrigger> create(Length startValue, Length endValue)
94     {
95         return adoptRef(new ScrollAnimationTrigger(startValue, endValue));
96     }
97
98     virtual ~ScrollAnimationTrigger() { }
99
100     virtual bool operator==(const AnimationTrigger& other) override
101     {
102         if (!other.isScrollAnimationTrigger())
103             return false;
104
105         const ScrollAnimationTrigger* otherTrigger = static_cast<const ScrollAnimationTrigger*>(&other);
106         return m_startValue == otherTrigger->m_startValue
107             && m_endValue == otherTrigger->m_endValue
108             && m_hasEndValue == otherTrigger->m_hasEndValue;
109     }
110
111     Length startValue() const { return m_startValue; }
112
113     void setStartValue(Length value)
114     {
115         m_startValue = value;
116     }
117
118     Length endValue() const { return m_endValue; }
119
120     void setEndValue(Length value)
121     {
122         m_endValue = value;
123     }
124
125     bool hasEndValue() const { return !m_endValue.isAuto() && m_endValue.value() > m_startValue.value(); }
126
127 private:
128     explicit ScrollAnimationTrigger(Length startValue, Length endValue)
129         : AnimationTrigger(AnimationTriggerType::ScrollAnimationTriggerType)
130         , m_startValue(startValue)
131     {
132         if (!endValue.isAuto() && endValue.value() > startValue.value())
133             m_endValue = endValue;
134     }
135
136     virtual PassRefPtr<AnimationTrigger> clone() const override
137     {
138         return adoptRef(new ScrollAnimationTrigger(m_startValue, m_endValue));
139     }
140
141     Length m_startValue;
142     Length m_endValue;
143     bool m_hasEndValue;
144 };
145
146 } // namespace WebCore
147
148 #define SPECIALIZE_TYPE_TRAITS_ANIMATION_TRIGGER(ToClassName, TriggerTest) \
149 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToClassName) \
150 static bool isType(const WebCore::AnimationTrigger& trigger) { return trigger.TriggerTest(); } \
151 SPECIALIZE_TYPE_TRAITS_END()
152
153 SPECIALIZE_TYPE_TRAITS_ANIMATION_TRIGGER(AutoAnimationTrigger, isAutoAnimationTrigger);
154 SPECIALIZE_TYPE_TRAITS_ANIMATION_TRIGGER(ScrollAnimationTrigger, isScrollAnimationTrigger);
155
156 #endif
157
158 #endif // AnimationTrigger_h