Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / animation / AnimationNodeTiming.cpp
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/animation/AnimationNodeTiming.h"
7
8 #include "bindings/core/v8/UnionTypesCore.h"
9 #include "core/animation/Animation.h"
10 #include "core/animation/AnimationNode.h"
11 #include "platform/animation/TimingFunction.h"
12
13 namespace blink {
14
15 PassRefPtrWillBeRawPtr<AnimationNodeTiming> AnimationNodeTiming::create(AnimationNode* parent)
16 {
17     return adoptRefWillBeNoop(new AnimationNodeTiming(parent));
18 }
19
20 AnimationNodeTiming::AnimationNodeTiming(AnimationNode* parent)
21     : m_parent(parent)
22 {
23 }
24
25 double AnimationNodeTiming::delay()
26 {
27     return m_parent->specifiedTiming().startDelay * 1000;
28 }
29
30 double AnimationNodeTiming::endDelay()
31 {
32     return m_parent->specifiedTiming().endDelay * 1000;
33 }
34
35 String AnimationNodeTiming::fill()
36 {
37     Timing::FillMode fillMode = m_parent->specifiedTiming().fillMode;
38     switch (fillMode) {
39     case Timing::FillModeNone:
40         return "none";
41     case Timing::FillModeForwards:
42         return "forwards";
43     case Timing::FillModeBackwards:
44         return "backwards";
45     case Timing::FillModeBoth:
46         return "both";
47     case Timing::FillModeAuto:
48         return "auto";
49     }
50     ASSERT_NOT_REACHED();
51     return "auto";
52 }
53
54 double AnimationNodeTiming::iterationStart()
55 {
56     return m_parent->specifiedTiming().iterationStart;
57 }
58
59 double AnimationNodeTiming::iterations()
60 {
61     return m_parent->specifiedTiming().iterationCount;
62 }
63
64 // This logic was copied from the example in bindings/tests/idls/TestInterface.idl
65 // and bindings/tests/results/V8TestInterface.cpp.
66 // FIXME: It might be possible to have 'duration' defined as an attribute in the idl.
67 // If possible, fix will be in a follow-up patch.
68 // http://crbug.com/240176
69 void AnimationNodeTiming::getDuration(String propertyName, DoubleOrString& returnValue)
70 {
71     if (propertyName != "duration")
72         return;
73
74     if (std::isnan(m_parent->specifiedTiming().iterationDuration)) {
75         returnValue.setString("auto");
76         return;
77     }
78     returnValue.setDouble(m_parent->specifiedTiming().iterationDuration * 1000);
79     return;
80 }
81
82 double AnimationNodeTiming::playbackRate()
83 {
84     return m_parent->specifiedTiming().playbackRate;
85 }
86
87 String AnimationNodeTiming::direction()
88 {
89     Timing::PlaybackDirection direction = m_parent->specifiedTiming().direction;
90     switch (direction) {
91     case Timing::PlaybackDirectionNormal:
92         return "normal";
93     case Timing::PlaybackDirectionReverse:
94         return "reverse";
95     case Timing::PlaybackDirectionAlternate:
96         return "alternate";
97     case Timing::PlaybackDirectionAlternateReverse:
98         return "alternate-reverse";
99     }
100     ASSERT_NOT_REACHED();
101     return "normal";
102 }
103
104 String AnimationNodeTiming::easing()
105 {
106     return m_parent->specifiedTiming().timingFunction->toString();
107 }
108
109 void AnimationNodeTiming::setDelay(double delay)
110 {
111     Timing timing = m_parent->specifiedTiming();
112     TimingInput::setStartDelay(timing, delay);
113     m_parent->updateSpecifiedTiming(timing);
114 }
115
116 void AnimationNodeTiming::setEndDelay(double endDelay)
117 {
118     Timing timing = m_parent->specifiedTiming();
119     TimingInput::setEndDelay(timing, endDelay);
120     m_parent->updateSpecifiedTiming(timing);
121 }
122
123 void AnimationNodeTiming::setFill(String fill)
124 {
125     Timing timing = m_parent->specifiedTiming();
126     TimingInput::setFillMode(timing, fill);
127     m_parent->updateSpecifiedTiming(timing);
128 }
129
130 void AnimationNodeTiming::setIterationStart(double iterationStart)
131 {
132     Timing timing = m_parent->specifiedTiming();
133     TimingInput::setIterationStart(timing, iterationStart);
134     m_parent->updateSpecifiedTiming(timing);
135 }
136
137 void AnimationNodeTiming::setIterations(double iterations)
138 {
139     Timing timing = m_parent->specifiedTiming();
140     TimingInput::setIterationCount(timing, iterations);
141     m_parent->updateSpecifiedTiming(timing);
142 }
143
144 bool AnimationNodeTiming::setDuration(String name, double duration)
145 {
146     if (name != "duration")
147         return false;
148     Timing timing = m_parent->specifiedTiming();
149     TimingInput::setIterationDuration(timing, duration);
150     m_parent->updateSpecifiedTiming(timing);
151     return true;
152 }
153
154 void AnimationNodeTiming::setPlaybackRate(double playbackRate)
155 {
156     Timing timing = m_parent->specifiedTiming();
157     TimingInput::setPlaybackRate(timing, playbackRate);
158     m_parent->updateSpecifiedTiming(timing);
159 }
160
161 void AnimationNodeTiming::setDirection(String direction)
162 {
163     Timing timing = m_parent->specifiedTiming();
164     TimingInput::setPlaybackDirection(timing, direction);
165     m_parent->updateSpecifiedTiming(timing);
166 }
167
168 void AnimationNodeTiming::setEasing(String easing)
169 {
170     Timing timing = m_parent->specifiedTiming();
171     TimingInput::setTimingFunction(timing, easing);
172     m_parent->updateSpecifiedTiming(timing);
173 }
174
175 void AnimationNodeTiming::trace(Visitor* visitor)
176 {
177     visitor->trace(m_parent);
178 }
179
180 } // namespace blink