4cd913818ba15ee705606e4a079f4471b41d1ae9
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / animation / TimedItemTiming.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/TimedItemTiming.h"
7
8 #include "core/animation/Animation.h"
9 #include "core/animation/TimedItem.h"
10 #include "platform/animation/TimingFunction.h"
11
12 namespace WebCore {
13
14 PassRefPtr<TimedItemTiming> TimedItemTiming::create(TimedItem* parent)
15 {
16     return adoptRef(new TimedItemTiming(parent));
17 }
18
19 TimedItemTiming::TimedItemTiming(TimedItem* parent)
20 : m_parent(parent)
21 {
22 }
23
24 double TimedItemTiming::delay()
25 {
26     return m_parent->specifiedTiming().startDelay * 1000;
27 }
28
29 double TimedItemTiming::endDelay()
30 {
31     return m_parent->specifiedTiming().endDelay * 1000;
32 }
33
34 String TimedItemTiming::fill()
35 {
36     Timing::FillMode fillMode = m_parent->specifiedTiming().fillMode;
37     switch (fillMode) {
38     case Timing::FillModeNone:
39         return "none";
40     case Timing::FillModeForwards:
41         return "forwards";
42     case Timing::FillModeBackwards:
43         return "backwards";
44     case Timing::FillModeBoth:
45         return "both";
46     case Timing::FillModeAuto:
47         return "auto";
48     }
49     ASSERT_NOT_REACHED();
50     return "auto";
51 }
52
53 double TimedItemTiming::iterationStart()
54 {
55     return m_parent->specifiedTiming().iterationStart;
56 }
57
58 double TimedItemTiming::iterations()
59 {
60     return m_parent->specifiedTiming().iterationCount;
61 }
62
63 // This logic was copied from the example in bindings/tests/idls/TestInterface.idl
64 // and bindings/tests/results/V8TestInterface.cpp.
65 // FIXME: It might be possible to have 'duration' defined as an attribute in the idl.
66 // If possible, fix will be in a follow-up patch.
67 void TimedItemTiming::getDuration(String propertyName, bool& element0Enabled, double& element0, bool& element1Enabled, String& element1)
68 {
69     if (propertyName != "duration")
70         return;
71
72     if (std::isnan(m_parent->specifiedTiming().iterationDuration)) {
73         element1Enabled = true;
74         element1 = "auto";
75         return;
76     }
77     element0Enabled = true;
78     element0 = m_parent->specifiedTiming().iterationDuration * 1000;
79     return;
80 }
81
82 double TimedItemTiming::playbackRate()
83 {
84     return m_parent->specifiedTiming().playbackRate;
85 }
86
87 String TimedItemTiming::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 TimedItemTiming::easing()
105 {
106     return m_parent->specifiedTiming().timingFunction->toString();
107 }
108
109 void TimedItemTiming::setDelay(double delay)
110 {
111     Timing timing = m_parent->specifiedTiming();
112     TimingInput::setStartDelay(timing, delay);
113     m_parent->updateSpecifiedTiming(timing);
114 }
115
116 void TimedItemTiming::setEndDelay(double endDelay)
117 {
118     Timing timing = m_parent->specifiedTiming();
119     TimingInput::setEndDelay(timing, endDelay);
120     m_parent->updateSpecifiedTiming(timing);
121 }
122
123 void TimedItemTiming::setFill(String fill)
124 {
125     Timing timing = m_parent->specifiedTiming();
126     TimingInput::setFillMode(timing, fill);
127     m_parent->updateSpecifiedTiming(timing);
128 }
129
130 void TimedItemTiming::setIterationStart(double iterationStart)
131 {
132     Timing timing = m_parent->specifiedTiming();
133     TimingInput::setIterationStart(timing, iterationStart);
134     m_parent->updateSpecifiedTiming(timing);
135 }
136
137 void TimedItemTiming::setIterations(double iterations)
138 {
139     Timing timing = m_parent->specifiedTiming();
140     TimingInput::setIterationCount(timing, iterations);
141     m_parent->updateSpecifiedTiming(timing);
142 }
143
144 bool TimedItemTiming::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 TimedItemTiming::setPlaybackRate(double playbackRate)
155 {
156     Timing timing = m_parent->specifiedTiming();
157     TimingInput::setPlaybackRate(timing, playbackRate);
158     m_parent->updateSpecifiedTiming(timing);
159 }
160
161 void TimedItemTiming::setDirection(String direction)
162 {
163     Timing timing = m_parent->specifiedTiming();
164     TimingInput::setPlaybackDirection(timing, direction);
165     m_parent->updateSpecifiedTiming(timing);
166 }
167
168 void TimedItemTiming::setEasing(String easing)
169 {
170     Timing timing = m_parent->specifiedTiming();
171     TimingInput::setTimingFunction(timing, easing);
172     m_parent->updateSpecifiedTiming(timing);
173 }
174
175 } // namespace WebCore