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

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: Update expectations 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 103 // FIXME: These should be null if not in effect, but current dictionary API
105 // will treat these as undefined. 104 // will treat these as undefined.
106 if (ensureCalculated().isInEffect) { 105 if (ensureCalculated().isInEffect) {
107 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); 106 computedTiming.setLocalTime(ensureCalculated().localTime * 1000);
108 computedTiming.setTimeFraction(ensureCalculated().timeFraction); 107 computedTiming.setProgress(ensureCalculated().progress);
109 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); 108 computedTiming.setCurrentIteration(ensureCalculated().currentIteration);
110 } 109 }
111 110
112 // KeyframeEffectOptions members. 111 // KeyframeEffectOptions members.
113 computedTiming.setDelay(specifiedTiming().startDelay * 1000); 112 computedTiming.setDelay(specifiedTiming().startDelay * 1000);
114 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); 113 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000);
115 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi ng().fillMode, isKeyframeEffect()))); 114 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi ng().fillMode, isKeyframeEffect())));
116 computedTiming.setIterationStart(specifiedTiming().iterationStart); 115 computedTiming.setIterationStart(specifiedTiming().iterationStart);
117 computedTiming.setIterations(specifiedTiming().iterationCount); 116 computedTiming.setIterations(specifiedTiming().iterationCount);
118 117
119 UnrestrictedDoubleOrString duration; 118 UnrestrictedDoubleOrString duration;
120 duration.setUnrestrictedDouble(iterationDuration() * 1000); 119 duration.setUnrestrictedDouble(iterationDuration() * 1000);
121 computedTiming.setDuration(duration); 120 computedTiming.setDuration(duration);
122 121
123 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); 122 computedTiming.setPlaybackRate(specifiedTiming().playbackRate);
124 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming( ).direction)); 123 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming( ).direction));
125 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); 124 computedTiming.setEasing(specifiedTiming().timingFunction->toString());
126 } 125 }
127 126
128 ComputedTimingProperties AnimationEffect::computedTiming() 127 ComputedTimingProperties AnimationEffect::getComputedTiming()
129 { 128 {
130 ComputedTimingProperties result; 129 ComputedTimingProperties result;
131 computedTiming(result); 130 getComputedTiming(result);
132 return result; 131 return result;
133 } 132 }
134 133
135 134
136 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas on reason) const 135 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas on reason) const
137 { 136 {
138 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !( isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation ()->effectSuppressed()); 137 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !( isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation ()->effectSuppressed());
139 m_needsUpdate = false; 138 m_needsUpdate = false;
140 m_lastUpdateTime = inheritedTime; 139 m_lastUpdateTime = inheritedTime;
141 140
142 const double localTime = inheritedTime; 141 const double localTime = inheritedTime;
143 double timeToNextIteration = std::numeric_limits<double>::infinity(); 142 double timeToNextIteration = std::numeric_limits<double>::infinity();
144 if (needsUpdate) { 143 if (needsUpdate) {
145 const double activeDuration = this->activeDurationInternal(); 144 const double activeDuration = this->activeDurationInternal();
146 145
147 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t iming); 146 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t iming);
148 // FIXME: parentPhase depends on groups being implemented. 147 // FIXME: parentPhase depends on groups being implemented.
149 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; 148 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive;
150 const double activeTime = calculateActiveTime(activeDuration, resolvedFi llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh ase, m_timing); 149 const double activeTime = calculateActiveTime(activeDuration, resolvedFi llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh ase, m_timing);
151 150
152 double currentIteration; 151 double currentIteration;
153 double timeFraction; 152 double progress;
154 if (const double iterationDuration = this->iterationDuration()) { 153 if (const double iterationDuration = this->iterationDuration()) {
155 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter ationStart, iterationDuration); 154 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter ationStart, iterationDuration);
156 ASSERT(startOffset >= 0); 155 ASSERT(startOffset >= 0);
157 const double scaledActiveTime = calculateScaledActiveTime(activeDura tion, activeTime, startOffset, m_timing); 156 const double scaledActiveTime = calculateScaledActiveTime(activeDura tion, activeTime, startOffset, m_timing);
158 const double iterationTime = calculateIterationTime(iterationDuratio n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); 157 const double iterationTime = calculateIterationTime(iterationDuratio n, repeatedDuration(), scaledActiveTime, startOffset, m_timing);
159 158
160 currentIteration = calculateCurrentIteration(iterationDuration, iter ationTime, scaledActiveTime, m_timing); 159 currentIteration = calculateCurrentIteration(iterationDuration, iter ationTime, scaledActiveTime, m_timing);
161 const double transformedTime = calculateTransformedTime(currentItera tion, iterationDuration, iterationTime, m_timing); 160 const double transformedTime = calculateTransformedTime(currentItera tion, iterationDuration, iterationTime, m_timing);
162 161
163 // The infinite iterationDuration case here is a workaround because 162 // The infinite iterationDuration case here is a workaround because
164 // the specified behaviour does not handle infinite durations well. 163 // the specified behaviour does not handle infinite durations well.
165 // There is an open issue against the spec to fix this: 164 // There is an open issue against the spec to fix this:
166 // https://github.com/w3c/web-animations/issues/142 165 // https://github.com/w3c/web-animations/issues/142
167 if (!std::isfinite(iterationDuration)) 166 if (!std::isfinite(iterationDuration))
168 timeFraction = fmod(m_timing.iterationStart, 1.0); 167 progress = fmod(m_timing.iterationStart, 1.0);
169 else 168 else
170 timeFraction = transformedTime / iterationDuration; 169 progress = transformedTime / iterationDuration;
171 170
172 if (!isNull(iterationTime)) { 171 if (!isNull(iterationTime)) {
173 timeToNextIteration = (iterationDuration - iterationTime) / std: :abs(m_timing.playbackRate); 172 timeToNextIteration = (iterationDuration - iterationTime) / std: :abs(m_timing.playbackRate);
174 if (activeDuration - activeTime < timeToNextIteration) 173 if (activeDuration - activeTime < timeToNextIteration)
175 timeToNextIteration = std::numeric_limits<double>::infinity( ); 174 timeToNextIteration = std::numeric_limits<double>::infinity( );
176 } 175 }
177 } else { 176 } else {
178 const double localIterationDuration = 1; 177 const double localIterationDuration = 1;
179 const double localRepeatedDuration = localIterationDuration * m_timi ng.iterationCount; 178 const double localRepeatedDuration = localIterationDuration * m_timi ng.iterationCount;
180 ASSERT(localRepeatedDuration >= 0); 179 ASSERT(localRepeatedDuration >= 0);
181 const double localActiveDuration = m_timing.playbackRate ? localRepe atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in finity(); 180 const double localActiveDuration = m_timing.playbackRate ? localRepe atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in finity();
182 ASSERT(localActiveDuration >= 0); 181 ASSERT(localActiveDuration >= 0);
183 const double localLocalTime = localTime < m_timing.startDelay ? loca lTime : localActiveDuration + m_timing.startDelay; 182 const double localLocalTime = localTime < m_timing.startDelay ? loca lTime : localActiveDuration + m_timing.startDelay;
184 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca lActiveDuration, localLocalTime, m_timing); 183 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); 184 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; 185 const double startOffset = m_timing.iterationStart * localIterationD uration;
187 ASSERT(startOffset >= 0); 186 ASSERT(startOffset >= 0);
188 const double scaledActiveTime = calculateScaledActiveTime(localActiv eDuration, localActiveTime, startOffset, m_timing); 187 const double scaledActiveTime = calculateScaledActiveTime(localActiv eDuration, localActiveTime, startOffset, m_timing);
189 const double iterationTime = calculateIterationTime(localIterationDu ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); 188 const double iterationTime = calculateIterationTime(localIterationDu ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing);
190 189
191 currentIteration = calculateCurrentIteration(localIterationDuration, iterationTime, scaledActiveTime, m_timing); 190 currentIteration = calculateCurrentIteration(localIterationDuration, iterationTime, scaledActiveTime, m_timing);
192 timeFraction = calculateTransformedTime(currentIteration, localItera tionDuration, iterationTime, m_timing); 191 progress = calculateTransformedTime(currentIteration, localIteration Duration, iterationTime, m_timing);
193 } 192 }
194 193
195 m_calculated.currentIteration = currentIteration; 194 m_calculated.currentIteration = currentIteration;
196 m_calculated.timeFraction = timeFraction; 195 m_calculated.progress = progress;
197 196
198 m_calculated.phase = currentPhase; 197 m_calculated.phase = currentPhase;
199 m_calculated.isInEffect = !isNull(activeTime); 198 m_calculated.isInEffect = !isNull(activeTime);
200 m_calculated.isInPlay = getPhase() == PhaseActive; 199 m_calculated.isInPlay = getPhase() == PhaseActive;
201 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); 200 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay();
202 m_calculated.localTime = m_lastUpdateTime; 201 m_calculated.localTime = m_lastUpdateTime;
203 } 202 }
204 203
205 // Test for events even if timing didn't need an update as the animation may have gained a start time. 204 // 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. 205 // 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); 231 return AnimationEffectTiming::create(this);
233 } 232 }
234 233
235 DEFINE_TRACE(AnimationEffect) 234 DEFINE_TRACE(AnimationEffect)
236 { 235 {
237 visitor->trace(m_animation); 236 visitor->trace(m_animation);
238 visitor->trace(m_eventDelegate); 237 visitor->trace(m_eventDelegate);
239 } 238 }
240 239
241 } // namespace blink 240 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698