| OLD | NEW |
| 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 11 matching lines...) Expand all Loading... |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "core/animation/Animation.h" | 32 #include "core/animation/KeyframeEffect.h" |
| 33 | 33 |
| 34 #include "bindings/core/v8/Dictionary.h" | 34 #include "bindings/core/v8/Dictionary.h" |
| 35 #include "bindings/core/v8/ExceptionState.h" | 35 #include "bindings/core/v8/ExceptionState.h" |
| 36 #include "core/animation/AnimationPlayer.h" | 36 #include "core/animation/Animation.h" |
| 37 #include "core/animation/AnimationTimeline.h" | 37 #include "core/animation/AnimationTimeline.h" |
| 38 #include "core/animation/AnimationTimingProperties.h" | |
| 39 #include "core/animation/CompositorAnimations.h" | 38 #include "core/animation/CompositorAnimations.h" |
| 40 #include "core/animation/ElementAnimations.h" | 39 #include "core/animation/ElementAnimations.h" |
| 41 #include "core/animation/Interpolation.h" | 40 #include "core/animation/Interpolation.h" |
| 42 #include "core/animation/KeyframeEffectModel.h" | 41 #include "core/animation/KeyframeEffectModel.h" |
| 42 #include "core/animation/KeyframeEffectOptions.h" |
| 43 #include "core/animation/PropertyHandle.h" | 43 #include "core/animation/PropertyHandle.h" |
| 44 #include "core/dom/Element.h" | 44 #include "core/dom/Element.h" |
| 45 #include "core/dom/NodeComputedStyle.h" | 45 #include "core/dom/NodeComputedStyle.h" |
| 46 #include "core/frame/UseCounter.h" | 46 #include "core/frame/UseCounter.h" |
| 47 #include "core/paint/DeprecatedPaintLayer.h" | 47 #include "core/paint/DeprecatedPaintLayer.h" |
| 48 #include "core/svg/SVGElement.h" | 48 #include "core/svg/SVGElement.h" |
| 49 | 49 |
| 50 namespace blink { | 50 namespace blink { |
| 51 | 51 |
| 52 PassRefPtrWillBeRawPtr<Animation> Animation::create(Element* target, PassRefPtrW
illBeRawPtr<AnimationEffect> effect, const Timing& timing, Priority priority, Pa
ssOwnPtrWillBeRawPtr<EventDelegate> eventDelegate) | 52 PassRefPtrWillBeRawPtr<KeyframeEffect> KeyframeEffect::create(Element* target, P
assRefPtrWillBeRawPtr<EffectModel> effect, const Timing& timing, Priority priori
ty, PassOwnPtrWillBeRawPtr<EventDelegate> eventDelegate) |
| 53 { | 53 { |
| 54 return adoptRefWillBeNoop(new Animation(target, effect, timing, priority, ev
entDelegate)); | 54 return adoptRefWillBeNoop(new KeyframeEffect(target, effect, timing, priorit
y, eventDelegate)); |
| 55 } | 55 } |
| 56 | 56 |
| 57 PassRefPtrWillBeRawPtr<Animation> Animation::create(Element* element, const Vect
or<Dictionary>& keyframeDictionaryVector, double duration, ExceptionState& excep
tionState) | 57 PassRefPtrWillBeRawPtr<KeyframeEffect> KeyframeEffect::create(Element* element,
const Vector<Dictionary>& keyframeDictionaryVector, double duration, ExceptionSt
ate& exceptionState) |
| 58 { | 58 { |
| 59 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); | 59 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); |
| 60 if (element) | 60 if (element) |
| 61 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectObjectTiming); | 61 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectObjectTiming); |
| 62 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), TimingInput::convert(duration)); | 62 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), TimingInput::convert(duration)); |
| 63 } | 63 } |
| 64 PassRefPtrWillBeRawPtr<Animation> Animation::create(Element* element, const Vect
or<Dictionary>& keyframeDictionaryVector, const AnimationTimingProperties& timin
gInput, ExceptionState& exceptionState) | 64 PassRefPtrWillBeRawPtr<KeyframeEffect> KeyframeEffect::create(Element* element,
const Vector<Dictionary>& keyframeDictionaryVector, const KeyframeEffectOptions&
timingInput, ExceptionState& exceptionState) |
| 65 { | 65 { |
| 66 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); | 66 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); |
| 67 if (element) | 67 if (element) |
| 68 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectObjectTiming); | 68 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectObjectTiming); |
| 69 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), TimingInput::convert(timingInput)); | 69 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), TimingInput::convert(timingInput)); |
| 70 } | 70 } |
| 71 PassRefPtrWillBeRawPtr<Animation> Animation::create(Element* element, const Vect
or<Dictionary>& keyframeDictionaryVector, ExceptionState& exceptionState) | 71 PassRefPtrWillBeRawPtr<KeyframeEffect> KeyframeEffect::create(Element* element,
const Vector<Dictionary>& keyframeDictionaryVector, ExceptionState& exceptionSta
te) |
| 72 { | 72 { |
| 73 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); | 73 ASSERT(RuntimeEnabledFeatures::webAnimationsAPIEnabled()); |
| 74 if (element) | 74 if (element) |
| 75 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectNoTiming); | 75 UseCounter::count(element->document(), UseCounter::AnimationConstructorK
eyframeListEffectNoTiming); |
| 76 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), Timing()); | 76 return create(element, EffectInput::convert(element, keyframeDictionaryVecto
r, exceptionState), Timing()); |
| 77 } | 77 } |
| 78 | 78 |
| 79 Animation::Animation(Element* target, PassRefPtrWillBeRawPtr<AnimationEffect> ef
fect, const Timing& timing, Priority priority, PassOwnPtrWillBeRawPtr<EventDeleg
ate> eventDelegate) | 79 KeyframeEffect::KeyframeEffect(Element* target, PassRefPtrWillBeRawPtr<EffectMod
el> effect, const Timing& timing, Priority priority, PassOwnPtrWillBeRawPtr<Even
tDelegate> eventDelegate) |
| 80 : AnimationNode(timing, eventDelegate) | 80 : AnimationEffect(timing, eventDelegate) |
| 81 , m_target(target) | 81 , m_target(target) |
| 82 , m_effect(effect) | 82 , m_effect(effect) |
| 83 , m_sampledEffect(nullptr) | 83 , m_sampledEffect(nullptr) |
| 84 , m_priority(priority) | 84 , m_priority(priority) |
| 85 { | 85 { |
| 86 #if !ENABLE(OILPAN) | 86 #if !ENABLE(OILPAN) |
| 87 if (m_target) | 87 if (m_target) |
| 88 m_target->ensureElementAnimations().addAnimation(this); | 88 m_target->ensureElementAnimations().addEffect(this); |
| 89 #endif | 89 #endif |
| 90 } | 90 } |
| 91 | 91 |
| 92 Animation::~Animation() | 92 KeyframeEffect::~KeyframeEffect() |
| 93 { | 93 { |
| 94 #if !ENABLE(OILPAN) | 94 #if !ENABLE(OILPAN) |
| 95 if (m_target) | 95 if (m_target) |
| 96 m_target->elementAnimations()->notifyAnimationDestroyed(this); | 96 m_target->elementAnimations()->notifyEffectDestroyed(this); |
| 97 #endif | 97 #endif |
| 98 } | 98 } |
| 99 | 99 |
| 100 void Animation::attach(AnimationPlayer* player) | 100 void KeyframeEffect::attach(Animation* animation) |
| 101 { | 101 { |
| 102 if (m_target) { | 102 if (m_target) { |
| 103 m_target->ensureElementAnimations().players().add(player); | 103 m_target->ensureElementAnimations().animations().add(animation); |
| 104 m_target->setNeedsAnimationStyleRecalc(); | 104 m_target->setNeedsAnimationStyleRecalc(); |
| 105 } | 105 } |
| 106 AnimationNode::attach(player); | 106 AnimationEffect::attach(animation); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void Animation::detach() | 109 void KeyframeEffect::detach() |
| 110 { | 110 { |
| 111 if (m_target) | 111 if (m_target) |
| 112 m_target->elementAnimations()->players().remove(player()); | 112 m_target->elementAnimations()->animations().remove(animation()); |
| 113 if (m_sampledEffect) | 113 if (m_sampledEffect) |
| 114 clearEffects(); | 114 clearEffects(); |
| 115 AnimationNode::detach(); | 115 AnimationEffect::detach(); |
| 116 } | 116 } |
| 117 | 117 |
| 118 void Animation::specifiedTimingChanged() | 118 void KeyframeEffect::specifiedTimingChanged() |
| 119 { | 119 { |
| 120 if (player()) { | 120 if (animation()) { |
| 121 // FIXME: Needs to consider groups when added. | 121 // FIXME: Needs to consider groups when added. |
| 122 ASSERT(player()->source() == this); | 122 ASSERT(animation()->source() == this); |
| 123 player()->setCompositorPending(true); | 123 animation()->setCompositorPending(true); |
| 124 } | 124 } |
| 125 } | 125 } |
| 126 | 126 |
| 127 static AnimationStack& ensureAnimationStack(Element* element) | 127 static AnimationStack& ensureAnimationStack(Element* element) |
| 128 { | 128 { |
| 129 return element->ensureElementAnimations().defaultStack(); | 129 return element->ensureElementAnimations().defaultStack(); |
| 130 } | 130 } |
| 131 | 131 |
| 132 void Animation::applyEffects() | 132 void KeyframeEffect::applyEffects() |
| 133 { | 133 { |
| 134 ASSERT(isInEffect()); | 134 ASSERT(isInEffect()); |
| 135 ASSERT(player()); | 135 ASSERT(animation()); |
| 136 if (!m_target || !m_effect) | 136 if (!m_target || !m_effect) |
| 137 return; | 137 return; |
| 138 | 138 |
| 139 // Cancel composited animation of transform if a motion path has been introd
uced on the element. | 139 // Cancel composited animation of transform if a motion path has been introd
uced on the element. |
| 140 if (m_target->computedStyle() | 140 if (m_target->computedStyle() |
| 141 && m_target->computedStyle()->hasMotionPath() | 141 && m_target->computedStyle()->hasMotionPath() |
| 142 && player()->hasActiveAnimationsOnCompositor() | 142 && animation()->hasActiveAnimationsOnCompositor() |
| 143 && player()->affects(*m_target, CSSPropertyTransform)) { | 143 && animation()->affects(*m_target, CSSPropertyTransform)) { |
| 144 player()->cancelAnimationOnCompositor(); | 144 animation()->cancelAnimationOnCompositor(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 double iteration = currentIteration(); | 147 double iteration = currentIteration(); |
| 148 ASSERT(iteration >= 0); | 148 ASSERT(iteration >= 0); |
| 149 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>> inte
rpolations = m_sampledEffect ? m_sampledEffect->mutableInterpolations() : nullpt
r; | 149 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>> inte
rpolations = m_sampledEffect ? m_sampledEffect->mutableInterpolations() : nullpt
r; |
| 150 // FIXME: Handle iteration values which overflow int. | 150 // FIXME: Handle iteration values which overflow int. |
| 151 m_effect->sample(static_cast<int>(iteration), timeFraction(), iterationDurat
ion(), interpolations); | 151 m_effect->sample(static_cast<int>(iteration), timeFraction(), iterationDurat
ion(), interpolations); |
| 152 if (m_sampledEffect) { | 152 if (m_sampledEffect) { |
| 153 m_sampledEffect->setInterpolations(interpolations.release()); | 153 m_sampledEffect->setInterpolations(interpolations.release()); |
| 154 } else if (interpolations && !interpolations->isEmpty()) { | 154 } else if (interpolations && !interpolations->isEmpty()) { |
| 155 OwnPtrWillBeRawPtr<SampledEffect> sampledEffect = SampledEffect::create(
this, interpolations.release()); | 155 OwnPtrWillBeRawPtr<SampledEffect> sampledEffect = SampledEffect::create(
this, interpolations.release()); |
| 156 m_sampledEffect = sampledEffect.get(); | 156 m_sampledEffect = sampledEffect.get(); |
| 157 ensureAnimationStack(m_target).add(sampledEffect.release()); | 157 ensureAnimationStack(m_target).add(sampledEffect.release()); |
| 158 } else { | 158 } else { |
| 159 return; | 159 return; |
| 160 } | 160 } |
| 161 | 161 |
| 162 m_target->setNeedsAnimationStyleRecalc(); | 162 m_target->setNeedsAnimationStyleRecalc(); |
| 163 if (m_target->isSVGElement()) | 163 if (m_target->isSVGElement()) |
| 164 m_sampledEffect->applySVGUpdate(toSVGElement(*m_target)); | 164 m_sampledEffect->applySVGUpdate(toSVGElement(*m_target)); |
| 165 } | 165 } |
| 166 | 166 |
| 167 void Animation::clearEffects() | 167 void KeyframeEffect::clearEffects() |
| 168 { | 168 { |
| 169 ASSERT(player()); | 169 ASSERT(animation()); |
| 170 ASSERT(m_sampledEffect); | 170 ASSERT(m_sampledEffect); |
| 171 | 171 |
| 172 m_sampledEffect->clear(); | 172 m_sampledEffect->clear(); |
| 173 m_sampledEffect = nullptr; | 173 m_sampledEffect = nullptr; |
| 174 restartAnimationOnCompositor(); | 174 restartAnimationOnCompositor(); |
| 175 m_target->setNeedsAnimationStyleRecalc(); | 175 m_target->setNeedsAnimationStyleRecalc(); |
| 176 invalidate(); | 176 invalidate(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 void Animation::updateChildrenAndEffects() const | 179 void KeyframeEffect::updateChildrenAndEffects() const |
| 180 { | 180 { |
| 181 if (!m_effect) | 181 if (!m_effect) |
| 182 return; | 182 return; |
| 183 if (isInEffect()) | 183 if (isInEffect()) |
| 184 const_cast<Animation*>(this)->applyEffects(); | 184 const_cast<KeyframeEffect*>(this)->applyEffects(); |
| 185 else if (m_sampledEffect) | 185 else if (m_sampledEffect) |
| 186 const_cast<Animation*>(this)->clearEffects(); | 186 const_cast<KeyframeEffect*>(this)->clearEffects(); |
| 187 } | 187 } |
| 188 | 188 |
| 189 double Animation::calculateTimeToEffectChange(bool forwards, double localTime, d
ouble timeToNextIteration) const | 189 double KeyframeEffect::calculateTimeToEffectChange(bool forwards, double localTi
me, double timeToNextIteration) const |
| 190 { | 190 { |
| 191 const double start = startTimeInternal() + specifiedTiming().startDelay; | 191 const double start = startTimeInternal() + specifiedTiming().startDelay; |
| 192 const double end = start + activeDurationInternal(); | 192 const double end = start + activeDurationInternal(); |
| 193 | 193 |
| 194 switch (phase()) { | 194 switch (phase()) { |
| 195 case PhaseNone: | 195 case PhaseNone: |
| 196 return std::numeric_limits<double>::infinity(); | 196 return std::numeric_limits<double>::infinity(); |
| 197 case PhaseBefore: | 197 case PhaseBefore: |
| 198 ASSERT(start >= localTime); | 198 ASSERT(start >= localTime); |
| 199 return forwards | 199 return forwards |
| 200 ? start - localTime | 200 ? start - localTime |
| 201 : std::numeric_limits<double>::infinity(); | 201 : std::numeric_limits<double>::infinity(); |
| 202 case PhaseActive: | 202 case PhaseActive: |
| 203 if (forwards) { | 203 if (forwards) { |
| 204 // Need service to apply fill / fire events. | 204 // Need service to apply fill / fire events. |
| 205 const double timeToEnd = end - localTime; | 205 const double timeToEnd = end - localTime; |
| 206 if (requiresIterationEvents()) { | 206 if (requiresIterationEvents()) { |
| 207 return std::min(timeToEnd, timeToNextIteration); | 207 return std::min(timeToEnd, timeToNextIteration); |
| 208 } | 208 } |
| 209 return timeToEnd; | 209 return timeToEnd; |
| 210 } | 210 } |
| 211 return 0; | 211 return 0; |
| 212 case PhaseAfter: | 212 case PhaseAfter: |
| 213 ASSERT(localTime >= end); | 213 ASSERT(localTime >= end); |
| 214 // If this Animation is still in effect then it will need to update | 214 // If this KeyframeEffect is still in effect then it will need to update |
| 215 // when its parent goes out of effect. We have no way of knowing when | 215 // when its parent goes out of effect. We have no way of knowing when |
| 216 // that will be, however, so the parent will need to supply it. | 216 // that will be, however, so the parent will need to supply it. |
| 217 return forwards | 217 return forwards |
| 218 ? std::numeric_limits<double>::infinity() | 218 ? std::numeric_limits<double>::infinity() |
| 219 : localTime - end; | 219 : localTime - end; |
| 220 default: | 220 default: |
| 221 ASSERT_NOT_REACHED(); | 221 ASSERT_NOT_REACHED(); |
| 222 return std::numeric_limits<double>::infinity(); | 222 return std::numeric_limits<double>::infinity(); |
| 223 } | 223 } |
| 224 } | 224 } |
| 225 | 225 |
| 226 #if !ENABLE(OILPAN) | 226 #if !ENABLE(OILPAN) |
| 227 void Animation::notifyElementDestroyed() | 227 void KeyframeEffect::notifyElementDestroyed() |
| 228 { | 228 { |
| 229 // If our player is kept alive just by the sampledEffect, we might get our | 229 // If our animation is kept alive just by the sampledEffect, we might get ou
r |
| 230 // destructor called when we call SampledEffect::clear(), so we need to | 230 // destructor called when we call SampledEffect::clear(), so we need to |
| 231 // clear m_sampledEffect first. | 231 // clear m_sampledEffect first. |
| 232 m_target = nullptr; | 232 m_target = nullptr; |
| 233 clearEventDelegate(); | 233 clearEventDelegate(); |
| 234 SampledEffect* sampledEffect = m_sampledEffect; | 234 SampledEffect* sampledEffect = m_sampledEffect; |
| 235 m_sampledEffect = nullptr; | 235 m_sampledEffect = nullptr; |
| 236 if (sampledEffect) | 236 if (sampledEffect) |
| 237 sampledEffect->clear(); | 237 sampledEffect->clear(); |
| 238 } | 238 } |
| 239 #endif | 239 #endif |
| 240 | 240 |
| 241 bool Animation::isCandidateForAnimationOnCompositor(double playerPlaybackRate) c
onst | 241 bool KeyframeEffect::isCandidateForAnimationOnCompositor(double animationPlaybac
kRate) const |
| 242 { | 242 { |
| 243 if (!effect() | 243 if (!effect() |
| 244 || !m_target | 244 || !m_target |
| 245 || (m_target->computedStyle() && m_target->computedStyle()->hasMotionPat
h())) | 245 || (m_target->computedStyle() && m_target->computedStyle()->hasMotionPat
h())) |
| 246 return false; | 246 return false; |
| 247 | 247 |
| 248 return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor
(specifiedTiming(), *m_target, player(), *effect(), playerPlaybackRate); | 248 return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor
(specifiedTiming(), *m_target, animation(), *effect(), animationPlaybackRate); |
| 249 } | 249 } |
| 250 | 250 |
| 251 bool Animation::maybeStartAnimationOnCompositor(int group, double startTime, dou
ble currentTime, double playerPlaybackRate) | 251 bool KeyframeEffect::maybeStartAnimationOnCompositor(int group, double startTime
, double currentTime, double animationPlaybackRate) |
| 252 { | 252 { |
| 253 ASSERT(!hasActiveAnimationsOnCompositor()); | 253 ASSERT(!hasActiveAnimationsOnCompositor()); |
| 254 if (!isCandidateForAnimationOnCompositor(playerPlaybackRate)) | 254 if (!isCandidateForAnimationOnCompositor(animationPlaybackRate)) |
| 255 return false; | 255 return false; |
| 256 if (!CompositorAnimations::instance()->canStartAnimationOnCompositor(*m_targ
et)) | 256 if (!CompositorAnimations::instance()->canStartAnimationOnCompositor(*m_targ
et)) |
| 257 return false; | 257 return false; |
| 258 if (!CompositorAnimations::instance()->startAnimationOnCompositor(*m_target,
group, startTime, currentTime, specifiedTiming(), *player(), *effect(), m_compo
sitorAnimationIds, playerPlaybackRate)) | 258 if (!CompositorAnimations::instance()->startAnimationOnCompositor(*m_target,
group, startTime, currentTime, specifiedTiming(), *animation(), *effect(), m_co
mpositorAnimationIds, animationPlaybackRate)) |
| 259 return false; | 259 return false; |
| 260 ASSERT(!m_compositorAnimationIds.isEmpty()); | 260 ASSERT(!m_compositorAnimationIds.isEmpty()); |
| 261 return true; | 261 return true; |
| 262 } | 262 } |
| 263 | 263 |
| 264 bool Animation::hasActiveAnimationsOnCompositor() const | 264 bool KeyframeEffect::hasActiveAnimationsOnCompositor() const |
| 265 { | 265 { |
| 266 return !m_compositorAnimationIds.isEmpty(); | 266 return !m_compositorAnimationIds.isEmpty(); |
| 267 } | 267 } |
| 268 | 268 |
| 269 bool Animation::hasActiveAnimationsOnCompositor(CSSPropertyID property) const | 269 bool KeyframeEffect::hasActiveAnimationsOnCompositor(CSSPropertyID property) con
st |
| 270 { | 270 { |
| 271 return hasActiveAnimationsOnCompositor() && affects(PropertyHandle(property)
); | 271 return hasActiveAnimationsOnCompositor() && affects(PropertyHandle(property)
); |
| 272 } | 272 } |
| 273 | 273 |
| 274 bool Animation::affects(PropertyHandle property) const | 274 bool KeyframeEffect::affects(PropertyHandle property) const |
| 275 { | 275 { |
| 276 return m_effect && m_effect->affects(property); | 276 return m_effect && m_effect->affects(property); |
| 277 } | 277 } |
| 278 | 278 |
| 279 bool Animation::cancelAnimationOnCompositor() | 279 bool KeyframeEffect::cancelAnimationOnCompositor() |
| 280 { | 280 { |
| 281 // FIXME: cancelAnimationOnCompositor is called from withins style recalc. | 281 // FIXME: cancelAnimationOnCompositor is called from withins style recalc. |
| 282 // This queries compositingState, which is not necessarily up to date. | 282 // This queries compositingState, which is not necessarily up to date. |
| 283 // https://code.google.com/p/chromium/issues/detail?id=339847 | 283 // https://code.google.com/p/chromium/issues/detail?id=339847 |
| 284 DisableCompositingQueryAsserts disabler; | 284 DisableCompositingQueryAsserts disabler; |
| 285 if (!hasActiveAnimationsOnCompositor()) | 285 if (!hasActiveAnimationsOnCompositor()) |
| 286 return false; | 286 return false; |
| 287 if (!m_target || !m_target->layoutObject()) | 287 if (!m_target || !m_target->layoutObject()) |
| 288 return false; | 288 return false; |
| 289 ASSERT(player()); | 289 ASSERT(animation()); |
| 290 for (const auto& compositorAnimationId : m_compositorAnimationIds) | 290 for (const auto& compositorAnimationId : m_compositorAnimationIds) |
| 291 CompositorAnimations::instance()->cancelAnimationOnCompositor(*m_target,
*player(), compositorAnimationId); | 291 CompositorAnimations::instance()->cancelAnimationOnCompositor(*m_target,
*animation(), compositorAnimationId); |
| 292 m_compositorAnimationIds.clear(); | 292 m_compositorAnimationIds.clear(); |
| 293 return true; | 293 return true; |
| 294 } | 294 } |
| 295 | 295 |
| 296 void Animation::restartAnimationOnCompositor() | 296 void KeyframeEffect::restartAnimationOnCompositor() |
| 297 { | 297 { |
| 298 if (cancelAnimationOnCompositor()) | 298 if (cancelAnimationOnCompositor()) |
| 299 player()->setCompositorPending(true); | 299 animation()->setCompositorPending(true); |
| 300 } | 300 } |
| 301 | 301 |
| 302 void Animation::cancelIncompatibleAnimationsOnCompositor() | 302 void KeyframeEffect::cancelIncompatibleAnimationsOnCompositor() |
| 303 { | 303 { |
| 304 if (m_target && player() && effect()) | 304 if (m_target && animation() && effect()) |
| 305 CompositorAnimations::instance()->cancelIncompatibleAnimationsOnComposit
or(*m_target, *player(), *effect()); | 305 CompositorAnimations::instance()->cancelIncompatibleAnimationsOnComposit
or(*m_target, *animation(), *effect()); |
| 306 } | 306 } |
| 307 | 307 |
| 308 void Animation::pauseAnimationForTestingOnCompositor(double pauseTime) | 308 void KeyframeEffect::pauseAnimationForTestingOnCompositor(double pauseTime) |
| 309 { | 309 { |
| 310 ASSERT(hasActiveAnimationsOnCompositor()); | 310 ASSERT(hasActiveAnimationsOnCompositor()); |
| 311 if (!m_target || !m_target->layoutObject()) | 311 if (!m_target || !m_target->layoutObject()) |
| 312 return; | 312 return; |
| 313 ASSERT(player()); | 313 ASSERT(animation()); |
| 314 for (const auto& compositorAnimationId : m_compositorAnimationIds) | 314 for (const auto& compositorAnimationId : m_compositorAnimationIds) |
| 315 CompositorAnimations::instance()->pauseAnimationForTestingOnCompositor(*
m_target, *player(), compositorAnimationId, pauseTime); | 315 CompositorAnimations::instance()->pauseAnimationForTestingOnCompositor(*
m_target, *animation(), compositorAnimationId, pauseTime); |
| 316 } | 316 } |
| 317 | 317 |
| 318 bool Animation::canAttachCompositedLayers() const | 318 bool KeyframeEffect::canAttachCompositedLayers() const |
| 319 { | 319 { |
| 320 if (!m_target || !player()) | 320 if (!m_target || !animation()) |
| 321 return false; | 321 return false; |
| 322 | 322 |
| 323 return CompositorAnimations::instance()->canAttachCompositedLayers(*m_target
, *player()); | 323 return CompositorAnimations::instance()->canAttachCompositedLayers(*m_target
, *animation()); |
| 324 } | 324 } |
| 325 | 325 |
| 326 void Animation::attachCompositedLayers() | 326 void KeyframeEffect::attachCompositedLayers() |
| 327 { | 327 { |
| 328 ASSERT(m_target); | 328 ASSERT(m_target); |
| 329 ASSERT(player()); | 329 ASSERT(animation()); |
| 330 CompositorAnimations::instance()->attachCompositedLayers(*m_target, *player(
)); | 330 CompositorAnimations::instance()->attachCompositedLayers(*m_target, *animati
on()); |
| 331 } | 331 } |
| 332 | 332 |
| 333 DEFINE_TRACE(Animation) | 333 DEFINE_TRACE(KeyframeEffect) |
| 334 { | 334 { |
| 335 visitor->trace(m_target); | 335 visitor->trace(m_target); |
| 336 visitor->trace(m_effect); | 336 visitor->trace(m_effect); |
| 337 visitor->trace(m_sampledEffect); | 337 visitor->trace(m_sampledEffect); |
| 338 AnimationNode::trace(visitor); | 338 AnimationEffect::trace(visitor); |
| 339 } | 339 } |
| 340 | 340 |
| 341 } // namespace blink | 341 } // namespace blink |
| OLD | NEW |