Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: third_party/WebKit/Source/core/animation/AnimationEffect.cpp

Issue 1944603003: Make AnimationEffectReadOnly.getComputedTiming() consistent with Web Animations spec (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 void AnimationEffect::updateSpecifiedTiming(const Timing& timing) 87 void AnimationEffect::updateSpecifiedTiming(const Timing& timing)
88 { 88 {
89 // FIXME: Test whether the timing is actually different? 89 // FIXME: Test whether the timing is actually different?
90 m_timing = timing; 90 m_timing = timing;
91 invalidate(); 91 invalidate();
92 if (m_animation) 92 if (m_animation)
93 m_animation->setOutdated(); 93 m_animation->setOutdated();
94 specifiedTimingChanged(); 94 specifiedTimingChanged();
95 } 95 }
96 96
97 void AnimationEffect::computedTiming(ComputedTimingProperties& computedTiming) 97 void AnimationEffect::getComputedTiming(ComputedTimingProperties& computedTiming )
98 { 98 {
99 // ComputedTimingProperties members. 99 // ComputedTimingProperties members.
100 computedTiming.setStartTime(0);
101 computedTiming.setEndTime(endTimeInternal() * 1000); 100 computedTiming.setEndTime(endTimeInternal() * 1000);
102 computedTiming.setActiveDuration(activeDurationInternal() * 1000); 101 computedTiming.setActiveDuration(activeDurationInternal() * 1000);
103 102
104 // FIXME: These should be null if not in effect, but current dictionary API
105 // will treat these as undefined.
106 if (ensureCalculated().isInEffect) { 103 if (ensureCalculated().isInEffect) {
107 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); 104 computedTiming.setLocalTime(ensureCalculated().localTime * 1000);
108 computedTiming.setTimeFraction(ensureCalculated().timeFraction); 105 computedTiming.setProgress(ensureCalculated().progress);
109 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); 106 computedTiming.setCurrentIteration(ensureCalculated().currentIteration);
107 } else {
108 computedTiming.setLocalTimeToNull();
109 computedTiming.setProgressToNull();
110 computedTiming.setCurrentIterationToNull();
110 } 111 }
111 112
112 // KeyframeEffectOptions members. 113 // KeyframeEffectOptions members.
113 computedTiming.setDelay(specifiedTiming().startDelay * 1000); 114 computedTiming.setDelay(specifiedTiming().startDelay * 1000);
114 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); 115 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000);
115 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi ng().fillMode, isKeyframeEffect()))); 116 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi ng().fillMode, isKeyframeEffect())));
116 computedTiming.setIterationStart(specifiedTiming().iterationStart); 117 computedTiming.setIterationStart(specifiedTiming().iterationStart);
117 computedTiming.setIterations(specifiedTiming().iterationCount); 118 computedTiming.setIterations(specifiedTiming().iterationCount);
118 119
119 UnrestrictedDoubleOrString duration; 120 UnrestrictedDoubleOrString duration;
120 duration.setUnrestrictedDouble(iterationDuration() * 1000); 121 duration.setUnrestrictedDouble(iterationDuration() * 1000);
121 computedTiming.setDuration(duration); 122 computedTiming.setDuration(duration);
122 123
123 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); 124 computedTiming.setPlaybackRate(specifiedTiming().playbackRate);
124 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming( ).direction)); 125 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming( ).direction));
125 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); 126 computedTiming.setEasing(specifiedTiming().timingFunction->toString());
126 } 127 }
127 128
128 ComputedTimingProperties AnimationEffect::computedTiming() 129 ComputedTimingProperties AnimationEffect::getComputedTiming()
129 { 130 {
130 ComputedTimingProperties result; 131 ComputedTimingProperties result;
131 computedTiming(result); 132 getComputedTiming(result);
132 return result; 133 return result;
133 } 134 }
134 135
135 136
136 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas on reason) const 137 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas on reason) const
137 { 138 {
138 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !( isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation ()->effectSuppressed()); 139 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !( isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation ()->effectSuppressed());
139 m_needsUpdate = false; 140 m_needsUpdate = false;
140 m_lastUpdateTime = inheritedTime; 141 m_lastUpdateTime = inheritedTime;
141 142
142 const double localTime = inheritedTime; 143 const double localTime = inheritedTime;
143 double timeToNextIteration = std::numeric_limits<double>::infinity(); 144 double timeToNextIteration = std::numeric_limits<double>::infinity();
144 if (needsUpdate) { 145 if (needsUpdate) {
145 const double activeDuration = this->activeDurationInternal(); 146 const double activeDuration = this->activeDurationInternal();
146 147
147 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t iming); 148 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t iming);
148 // FIXME: parentPhase depends on groups being implemented. 149 // FIXME: parentPhase depends on groups being implemented.
149 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; 150 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive;
150 const double activeTime = calculateActiveTime(activeDuration, resolvedFi llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh ase, m_timing); 151 const double activeTime = calculateActiveTime(activeDuration, resolvedFi llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh ase, m_timing);
151 152
152 double currentIteration; 153 double currentIteration;
153 double timeFraction; 154 double progress;
154 if (const double iterationDuration = this->iterationDuration()) { 155 if (const double iterationDuration = this->iterationDuration()) {
155 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter ationStart, iterationDuration); 156 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter ationStart, iterationDuration);
156 ASSERT(startOffset >= 0); 157 ASSERT(startOffset >= 0);
157 const double scaledActiveTime = calculateScaledActiveTime(activeDura tion, activeTime, startOffset, m_timing); 158 const double scaledActiveTime = calculateScaledActiveTime(activeDura tion, activeTime, startOffset, m_timing);
158 const double iterationTime = calculateIterationTime(iterationDuratio n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); 159 const double iterationTime = calculateIterationTime(iterationDuratio n, repeatedDuration(), scaledActiveTime, startOffset, m_timing);
159 160
160 currentIteration = calculateCurrentIteration(iterationDuration, iter ationTime, scaledActiveTime, m_timing); 161 currentIteration = calculateCurrentIteration(iterationDuration, iter ationTime, scaledActiveTime, m_timing);
161 const double transformedTime = calculateTransformedTime(currentItera tion, iterationDuration, iterationTime, m_timing); 162 const double transformedTime = calculateTransformedTime(currentItera tion, iterationDuration, iterationTime, m_timing);
162 163
163 // The infinite iterationDuration case here is a workaround because 164 // The infinite iterationDuration case here is a workaround because
164 // the specified behaviour does not handle infinite durations well. 165 // the specified behaviour does not handle infinite durations well.
165 // There is an open issue against the spec to fix this: 166 // There is an open issue against the spec to fix this:
166 // https://github.com/w3c/web-animations/issues/142 167 // https://github.com/w3c/web-animations/issues/142
167 if (!std::isfinite(iterationDuration)) 168 if (!std::isfinite(iterationDuration))
168 timeFraction = fmod(m_timing.iterationStart, 1.0); 169 progress = fmod(m_timing.iterationStart, 1.0);
169 else 170 else
170 timeFraction = transformedTime / iterationDuration; 171 progress = transformedTime / iterationDuration;
171 172
172 if (!isNull(iterationTime)) { 173 if (!isNull(iterationTime)) {
173 timeToNextIteration = (iterationDuration - iterationTime) / std: :abs(m_timing.playbackRate); 174 timeToNextIteration = (iterationDuration - iterationTime) / std: :abs(m_timing.playbackRate);
174 if (activeDuration - activeTime < timeToNextIteration) 175 if (activeDuration - activeTime < timeToNextIteration)
175 timeToNextIteration = std::numeric_limits<double>::infinity( ); 176 timeToNextIteration = std::numeric_limits<double>::infinity( );
176 } 177 }
177 } else { 178 } else {
178 const double localIterationDuration = 1; 179 const double localIterationDuration = 1;
179 const double localRepeatedDuration = localIterationDuration * m_timi ng.iterationCount; 180 const double localRepeatedDuration = localIterationDuration * m_timi ng.iterationCount;
180 ASSERT(localRepeatedDuration >= 0); 181 ASSERT(localRepeatedDuration >= 0);
181 const double localActiveDuration = m_timing.playbackRate ? localRepe atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in finity(); 182 const double localActiveDuration = m_timing.playbackRate ? localRepe atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in finity();
182 ASSERT(localActiveDuration >= 0); 183 ASSERT(localActiveDuration >= 0);
183 const double localLocalTime = localTime < m_timing.startDelay ? loca lTime : localActiveDuration + m_timing.startDelay; 184 const double localLocalTime = localTime < m_timing.startDelay ? loca lTime : localActiveDuration + m_timing.startDelay;
184 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca lActiveDuration, localLocalTime, m_timing); 185 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca lActiveDuration, localLocalTime, m_timing);
185 const double localActiveTime = calculateActiveTime(localActiveDurati on, resolvedFillMode(m_timing.fillMode, isKeyframeEffect()), localLocalTime, par entPhase, localCurrentPhase, m_timing); 186 const double localActiveTime = calculateActiveTime(localActiveDurati on, resolvedFillMode(m_timing.fillMode, isKeyframeEffect()), localLocalTime, par entPhase, localCurrentPhase, m_timing);
186 const double startOffset = m_timing.iterationStart * localIterationD uration; 187 const double startOffset = m_timing.iterationStart * localIterationD uration;
187 ASSERT(startOffset >= 0); 188 ASSERT(startOffset >= 0);
188 const double scaledActiveTime = calculateScaledActiveTime(localActiv eDuration, localActiveTime, startOffset, m_timing); 189 const double scaledActiveTime = calculateScaledActiveTime(localActiv eDuration, localActiveTime, startOffset, m_timing);
189 const double iterationTime = calculateIterationTime(localIterationDu ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); 190 const double iterationTime = calculateIterationTime(localIterationDu ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing);
190 191
191 currentIteration = calculateCurrentIteration(localIterationDuration, iterationTime, scaledActiveTime, m_timing); 192 currentIteration = calculateCurrentIteration(localIterationDuration, iterationTime, scaledActiveTime, m_timing);
192 timeFraction = calculateTransformedTime(currentIteration, localItera tionDuration, iterationTime, m_timing); 193 progress = calculateTransformedTime(currentIteration, localIteration Duration, iterationTime, m_timing);
193 } 194 }
194 195
195 m_calculated.currentIteration = currentIteration; 196 m_calculated.currentIteration = currentIteration;
196 m_calculated.timeFraction = timeFraction; 197 m_calculated.progress = progress;
197 198
198 m_calculated.phase = currentPhase; 199 m_calculated.phase = currentPhase;
199 m_calculated.isInEffect = !isNull(activeTime); 200 m_calculated.isInEffect = !isNull(activeTime);
200 m_calculated.isInPlay = getPhase() == PhaseActive; 201 m_calculated.isInPlay = getPhase() == PhaseActive;
201 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); 202 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay();
202 m_calculated.localTime = m_lastUpdateTime; 203 m_calculated.localTime = m_lastUpdateTime;
203 } 204 }
204 205
205 // Test for events even if timing didn't need an update as the animation may have gained a start time. 206 // Test for events even if timing didn't need an update as the animation may have gained a start time.
206 // FIXME: Refactor so that we can ASSERT(m_animation) here, this is currentl y required to be nullable for testing. 207 // FIXME: Refactor so that we can ASSERT(m_animation) here, this is currentl y required to be nullable for testing.
(...skipping 25 matching lines...) Expand all
232 return AnimationEffectTiming::create(this); 233 return AnimationEffectTiming::create(this);
233 } 234 }
234 235
235 DEFINE_TRACE(AnimationEffect) 236 DEFINE_TRACE(AnimationEffect)
236 { 237 {
237 visitor->trace(m_animation); 238 visitor->trace(m_animation);
238 visitor->trace(m_eventDelegate); 239 visitor->trace(m_eventDelegate);
239 } 240 }
240 241
241 } // namespace blink 242 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698