| 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 14 matching lines...) Expand all Loading... |
| 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/css/CSSAnimations.h" | 32 #include "core/animation/css/CSSAnimations.h" |
| 33 | 33 |
| 34 #include "core/StylePropertyShorthand.h" | 34 #include "core/StylePropertyShorthand.h" |
| 35 #include "core/animation/AnimationPlayer.h" | 35 #include "core/animation/Animation.h" |
| 36 #include "core/animation/AnimationTimeline.h" | 36 #include "core/animation/AnimationTimeline.h" |
| 37 #include "core/animation/CompositorAnimations.h" | 37 #include "core/animation/CompositorAnimations.h" |
| 38 #include "core/animation/DeferredLegacyStyleInterpolation.h" | 38 #include "core/animation/DeferredLegacyStyleInterpolation.h" |
| 39 #include "core/animation/ElementAnimations.h" | 39 #include "core/animation/ElementAnimations.h" |
| 40 #include "core/animation/Interpolation.h" | 40 #include "core/animation/Interpolation.h" |
| 41 #include "core/animation/KeyframeEffectModel.h" | 41 #include "core/animation/KeyframeEffectModel.h" |
| 42 #include "core/animation/css/CSSAnimatableValueFactory.h" | 42 #include "core/animation/css/CSSAnimatableValueFactory.h" |
| 43 #include "core/animation/css/CSSPropertyEquality.h" | 43 #include "core/animation/css/CSSPropertyEquality.h" |
| 44 #include "core/css/CSSKeyframeRule.h" | 44 #include "core/css/CSSKeyframeRule.h" |
| 45 #include "core/css/CSSPropertyMetadata.h" | 45 #include "core/css/CSSPropertyMetadata.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 effect->forceConversionsToAnimatableValues(element, style); | 176 effect->forceConversionsToAnimatableValues(element, style); |
| 177 return effect; | 177 return effect; |
| 178 } | 178 } |
| 179 | 179 |
| 180 } // namespace | 180 } // namespace |
| 181 | 181 |
| 182 CSSAnimations::CSSAnimations() | 182 CSSAnimations::CSSAnimations() |
| 183 { | 183 { |
| 184 } | 184 } |
| 185 | 185 |
| 186 const AtomicString CSSAnimations::getAnimationNameForInspector(const AnimationPl
ayer& player) | 186 const AtomicString CSSAnimations::getAnimationNameForInspector(const Animation&
animation) |
| 187 { | 187 { |
| 188 for (const auto& it : m_animations) { | 188 for (const auto& it : m_animations) { |
| 189 if (it.value->player->sequenceNumber() == player.sequenceNumber()) | 189 if (it.value->animation->sequenceNumber() == animation.sequenceNumber()) |
| 190 return it.key; | 190 return it.key; |
| 191 } | 191 } |
| 192 return nullAtom; | 192 return nullAtom; |
| 193 } | 193 } |
| 194 | 194 |
| 195 bool CSSAnimations::isTransitionAnimationForInspector(const AnimationPlayer& pla
yer) const | 195 bool CSSAnimations::isTransitionAnimationForInspector(const Animation& animation
) const |
| 196 { | 196 { |
| 197 for (const auto& it : m_transitions) { | 197 for (const auto& it : m_transitions) { |
| 198 if (it.value.player->sequenceNumber() == player.sequenceNumber()) | 198 if (it.value.animation->sequenceNumber() == animation.sequenceNumber()) |
| 199 return true; | 199 return true; |
| 200 } | 200 } |
| 201 return false; | 201 return false; |
| 202 } | 202 } |
| 203 | 203 |
| 204 PassOwnPtrWillBeRawPtr<CSSAnimationUpdate> CSSAnimations::calculateUpdate(const
Element* animatingElement, Element& element, const ComputedStyle& style, Compute
dStyle* parentStyle, StyleResolver* resolver) | 204 PassOwnPtrWillBeRawPtr<CSSAnimationUpdate> CSSAnimations::calculateUpdate(const
Element* animatingElement, Element& element, const ComputedStyle& style, Compute
dStyle* parentStyle, StyleResolver* resolver) |
| 205 { | 205 { |
| 206 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = adoptPtrWillBeNoop(new CSSAn
imationUpdate()); | 206 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = adoptPtrWillBeNoop(new CSSAn
imationUpdate()); |
| 207 calculateAnimationUpdate(update.get(), animatingElement, element, style, par
entStyle, resolver); | 207 calculateAnimationUpdate(update.get(), animatingElement, element, style, par
entStyle, resolver); |
| 208 calculateAnimationActiveInterpolations(update.get(), animatingElement, eleme
nt.document().timeline().currentTimeInternal()); | 208 calculateAnimationActiveInterpolations(update.get(), animatingElement, eleme
nt.document().timeline().currentTimeInternal()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 RefPtrWillBeRawPtr<StyleRuleKeyframes> keyframesRule = resolver->fin
dKeyframesRule(elementForScoping, animationName); | 250 RefPtrWillBeRawPtr<StyleRuleKeyframes> keyframesRule = resolver->fin
dKeyframesRule(elementForScoping, animationName); |
| 251 if (!keyframesRule) | 251 if (!keyframesRule) |
| 252 continue; // Cancel the animation if there's no style rule for i
t. | 252 continue; // Cancel the animation if there's no style rule for i
t. |
| 253 | 253 |
| 254 if (cssAnimations) { | 254 if (cssAnimations) { |
| 255 AnimationMap::const_iterator existing(cssAnimations->m_animation
s.find(animationName)); | 255 AnimationMap::const_iterator existing(cssAnimations->m_animation
s.find(animationName)); |
| 256 if (existing != cssAnimations->m_animations.end()) { | 256 if (existing != cssAnimations->m_animations.end()) { |
| 257 inactive.remove(animationName); | 257 inactive.remove(animationName); |
| 258 | 258 |
| 259 const RunningAnimation* runningAnimation = existing->value.g
et(); | 259 const RunningAnimation* runningAnimation = existing->value.g
et(); |
| 260 AnimationPlayer* player = runningAnimation->player.get(); | 260 Animation* animation = runningAnimation->animation.get(); |
| 261 | 261 |
| 262 if (keyframesRule != runningAnimation->styleRule || keyframe
sRule->version() != runningAnimation->styleRuleVersion || runningAnimation->spec
ifiedTiming != specifiedTiming) { | 262 if (keyframesRule != runningAnimation->styleRule || keyframe
sRule->version() != runningAnimation->styleRuleVersion || runningAnimation->spec
ifiedTiming != specifiedTiming) { |
| 263 ASSERT(!isAnimationStyleChange); | 263 ASSERT(!isAnimationStyleChange); |
| 264 update->updateAnimation(animationName, player, InertAnim
ation::create( | 264 update->updateAnimation(animationName, animation, InertA
nimation::create( |
| 265 createKeyframeEffect(resolver, animatingElement, ele
ment, &style, parentStyle, animationName, keyframeTimingFunction.get()), | 265 createKeyframeEffect(resolver, animatingElement, ele
ment, &style, parentStyle, animationName, keyframeTimingFunction.get()), |
| 266 timing, isPaused, player->unlimitedCurrentTimeIntern
al()), specifiedTiming, keyframesRule); | 266 timing, isPaused, animation->unlimitedCurrentTimeInt
ernal()), specifiedTiming, keyframesRule); |
| 267 } else if (!isAnimationStyleChange && player->source() && pl
ayer->source()->isAnimation()) { | 267 } else if (!isAnimationStyleChange && animation->source() &&
animation->source()->isAnimation()) { |
| 268 AnimationEffect* effect = toAnimation(player->source())-
>effect(); | 268 EffectModel* effect = toKeyframeEffect(animation->source
())->effect(); |
| 269 if (effect && effect->isKeyframeEffectModel()) { | 269 if (effect && effect->isKeyframeEffectModel()) { |
| 270 KeyframeEffectModelBase* keyframeEffect = toKeyframe
EffectModelBase(effect); | 270 KeyframeEffectModelBase* keyframeEffect = toKeyframe
EffectModelBase(effect); |
| 271 if (keyframeEffect->hasSyntheticKeyframes()) | 271 if (keyframeEffect->hasSyntheticKeyframes()) |
| 272 update->updateAnimationStyle(player, keyframeEff
ect, animatingElement->layoutObject(), style); | 272 update->updateAnimationStyle(animation, keyframe
Effect, animatingElement->layoutObject(), style); |
| 273 } | 273 } |
| 274 } | 274 } |
| 275 | 275 |
| 276 if (isPaused != player->paused()) { | 276 if (isPaused != animation->paused()) { |
| 277 ASSERT(!isAnimationStyleChange); | 277 ASSERT(!isAnimationStyleChange); |
| 278 update->toggleAnimationPaused(animationName); | 278 update->toggleAnimationPaused(animationName); |
| 279 } | 279 } |
| 280 | 280 |
| 281 continue; | 281 continue; |
| 282 } | 282 } |
| 283 } | 283 } |
| 284 | 284 |
| 285 ASSERT(!isAnimationStyleChange); | 285 ASSERT(!isAnimationStyleChange); |
| 286 update->startAnimation(animationName, InertAnimation::create( | 286 update->startAnimation(animationName, InertAnimation::create( |
| 287 createKeyframeEffect(resolver, animatingElement, element, &style
, parentStyle, animationName, keyframeTimingFunction.get()), | 287 createKeyframeEffect(resolver, animatingElement, element, &style
, parentStyle, animationName, keyframeTimingFunction.get()), |
| 288 timing, isPaused, 0), specifiedTiming, keyframesRule); | 288 timing, isPaused, 0), specifiedTiming, keyframesRule); |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 | 291 |
| 292 ASSERT(inactive.isEmpty() || cssAnimations); | 292 ASSERT(inactive.isEmpty() || cssAnimations); |
| 293 for (const AtomicString& animationName : inactive) { | 293 for (const AtomicString& animationName : inactive) { |
| 294 ASSERT(!isAnimationStyleChange); | 294 ASSERT(!isAnimationStyleChange); |
| 295 update->cancelAnimation(animationName, *cssAnimations->m_animations.get(
animationName)->player); | 295 update->cancelAnimation(animationName, *cssAnimations->m_animations.get(
animationName)->animation); |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 | 298 |
| 299 void CSSAnimations::maybeApplyPendingUpdate(Element* element) | 299 void CSSAnimations::maybeApplyPendingUpdate(Element* element) |
| 300 { | 300 { |
| 301 if (!m_pendingUpdate) { | 301 if (!m_pendingUpdate) { |
| 302 m_previousActiveInterpolationsForAnimations.clear(); | 302 m_previousActiveInterpolationsForAnimations.clear(); |
| 303 return; | 303 return; |
| 304 } | 304 } |
| 305 | 305 |
| 306 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = m_pendingUpdate.release(); | 306 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = m_pendingUpdate.release(); |
| 307 | 307 |
| 308 m_previousActiveInterpolationsForAnimations.swap(update->activeInterpolation
sForAnimations()); | 308 m_previousActiveInterpolationsForAnimations.swap(update->activeInterpolation
sForAnimations()); |
| 309 | 309 |
| 310 // FIXME: cancelling, pausing, unpausing animations all query compositingSta
te, which is not necessarily up to date here | 310 // FIXME: cancelling, pausing, unpausing animations all query compositingSta
te, which is not necessarily up to date here |
| 311 // since we call this from recalc style. | 311 // since we call this from recalc style. |
| 312 // https://code.google.com/p/chromium/issues/detail?id=339847 | 312 // https://code.google.com/p/chromium/issues/detail?id=339847 |
| 313 DisableCompositingQueryAsserts disabler; | 313 DisableCompositingQueryAsserts disabler; |
| 314 | 314 |
| 315 for (const AtomicString& animationName : update->cancelledAnimationNames())
{ | 315 for (const AtomicString& animationName : update->cancelledAnimationNames())
{ |
| 316 RefPtrWillBeRawPtr<AnimationPlayer> player = m_animations.take(animation
Name)->player; | 316 RefPtrWillBeRawPtr<Animation> animation = m_animations.take(animationNam
e)->animation; |
| 317 player->cancel(); | 317 animation->cancel(); |
| 318 player->update(TimingUpdateOnDemand); | 318 animation->update(TimingUpdateOnDemand); |
| 319 } | 319 } |
| 320 | 320 |
| 321 for (const AtomicString& animationName : update->animationsWithPauseToggled(
)) { | 321 for (const AtomicString& animationName : update->animationsWithPauseToggled(
)) { |
| 322 AnimationPlayer* player = m_animations.get(animationName)->player.get(); | 322 Animation* animation = m_animations.get(animationName)->animation.get(); |
| 323 if (player->paused()) | 323 if (animation->paused()) |
| 324 player->unpause(); | 324 animation->unpause(); |
| 325 else | 325 else |
| 326 player->pause(); | 326 animation->pause(); |
| 327 if (player->outdated()) | 327 if (animation->outdated()) |
| 328 player->update(TimingUpdateOnDemand); | 328 animation->update(TimingUpdateOnDemand); |
| 329 } | 329 } |
| 330 | 330 |
| 331 for (const auto& entry : update->animationsWithUpdates()) { | 331 for (const auto& entry : update->animationsWithUpdates()) { |
| 332 Animation* animation = toAnimation(entry.player->source()); | 332 KeyframeEffect* effect = toKeyframeEffect(entry.animation->source()); |
| 333 | 333 |
| 334 animation->setEffect(entry.animation->effect()); | 334 effect->setEffect(entry.effect->effect()); |
| 335 animation->updateSpecifiedTiming(entry.animation->specifiedTiming()); | 335 effect->updateSpecifiedTiming(entry.effect->specifiedTiming()); |
| 336 | 336 |
| 337 m_animations.find(entry.name)->value->update(entry); | 337 m_animations.find(entry.name)->value->update(entry); |
| 338 } | 338 } |
| 339 | 339 |
| 340 for (const auto& styleUpdate : update->animationsWithStyleUpdates()) { | 340 for (const auto& styleUpdate : update->animationsWithStyleUpdates()) { |
| 341 styleUpdate.effect->forEachInterpolation([](Interpolation& interpolation
) { | 341 styleUpdate.effect->forEachInterpolation([](Interpolation& interpolation
) { |
| 342 if (interpolation.isStyleInterpolation() && toStyleInterpolation(int
erpolation).isDeferredLegacyStyleInterpolation()) | 342 if (interpolation.isStyleInterpolation() && toStyleInterpolation(int
erpolation).isDeferredLegacyStyleInterpolation()) |
| 343 toDeferredLegacyStyleInterpolation(toStyleInterpolation(interpol
ation)).underlyingStyleChanged(); | 343 toDeferredLegacyStyleInterpolation(toStyleInterpolation(interpol
ation)).underlyingStyleChanged(); |
| 344 }); | 344 }); |
| 345 | 345 |
| 346 bool updated = false; | 346 bool updated = false; |
| 347 if (styleUpdate.snapshot.opacity) | 347 if (styleUpdate.snapshot.opacity) |
| 348 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyOpacity, styleUpdate.snapshot.opacity); | 348 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyOpacity, styleUpdate.snapshot.opacity); |
| 349 if (styleUpdate.snapshot.transform) | 349 if (styleUpdate.snapshot.transform) |
| 350 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyTransform, styleUpdate.snapshot.transform); | 350 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyTransform, styleUpdate.snapshot.transform); |
| 351 if (styleUpdate.snapshot.webkitFilter) | 351 if (styleUpdate.snapshot.webkitFilter) |
| 352 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyWebkitFilter, styleUpdate.snapshot.webkitFilter); | 352 updated |= styleUpdate.effect->updateNeutralKeyframeAnimatableValues
(CSSPropertyWebkitFilter, styleUpdate.snapshot.webkitFilter); |
| 353 if (updated) { | 353 if (updated) { |
| 354 styleUpdate.player->setOutdated(); | 354 styleUpdate.animation->setOutdated(); |
| 355 styleUpdate.player->setCompositorPending(true); | 355 styleUpdate.animation->setCompositorPending(true); |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 | 358 |
| 359 for (const auto& entry : update->newAnimations()) { | 359 for (const auto& entry : update->newAnimations()) { |
| 360 const InertAnimation* inertAnimation = entry.animation.get(); | 360 const InertAnimation* inertAnimation = entry.effect.get(); |
| 361 OwnPtrWillBeRawPtr<AnimationEventDelegate> eventDelegate = adoptPtrWillB
eNoop(new AnimationEventDelegate(element, entry.name)); | 361 OwnPtrWillBeRawPtr<AnimationEventDelegate> eventDelegate = adoptPtrWillB
eNoop(new AnimationEventDelegate(element, entry.name)); |
| 362 RefPtrWillBeRawPtr<Animation> animation = Animation::create(element, ine
rtAnimation->effect(), inertAnimation->specifiedTiming(), Animation::DefaultPrio
rity, eventDelegate.release()); | 362 RefPtrWillBeRawPtr<KeyframeEffect> effect = KeyframeEffect::create(eleme
nt, inertAnimation->effect(), inertAnimation->specifiedTiming(), KeyframeEffect:
:DefaultPriority, eventDelegate.release()); |
| 363 animation->setName(inertAnimation->name()); | 363 effect->setName(inertAnimation->name()); |
| 364 RefPtrWillBeRawPtr<AnimationPlayer> player = element->document().timelin
e().play(animation.get()); | 364 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline()
.play(effect.get()); |
| 365 if (inertAnimation->paused()) | 365 if (inertAnimation->paused()) |
| 366 player->pause(); | 366 animation->pause(); |
| 367 player->update(TimingUpdateOnDemand); | 367 animation->update(TimingUpdateOnDemand); |
| 368 | 368 |
| 369 m_animations.set(entry.name, adoptRefWillBeNoop(new RunningAnimation(pla
yer, entry))); | 369 m_animations.set(entry.name, adoptRefWillBeNoop(new RunningAnimation(ani
mation, entry))); |
| 370 } | 370 } |
| 371 | 371 |
| 372 // Transitions that are run on the compositor only update main-thread state | 372 // Transitions that are run on the compositor only update main-thread state |
| 373 // lazily. However, we need the new state to know what the from state shoud | 373 // lazily. However, we need the new state to know what the from state shoud |
| 374 // be when transitions are retargeted. Instead of triggering complete style | 374 // be when transitions are retargeted. Instead of triggering complete style |
| 375 // recalculation, we find these cases by searching for new transitions that | 375 // recalculation, we find these cases by searching for new transitions that |
| 376 // have matching cancelled animation property IDs on the compositor. | 376 // have matching cancelled animation property IDs on the compositor. |
| 377 WillBeHeapHashMap<CSSPropertyID, std::pair<RefPtrWillBeMember<Animation>, do
uble>> retargetedCompositorTransitions; | 377 WillBeHeapHashMap<CSSPropertyID, std::pair<RefPtrWillBeMember<KeyframeEffect
>, double>> retargetedCompositorTransitions; |
| 378 for (CSSPropertyID id : update->cancelledTransitions()) { | 378 for (CSSPropertyID id : update->cancelledTransitions()) { |
| 379 ASSERT(m_transitions.contains(id)); | 379 ASSERT(m_transitions.contains(id)); |
| 380 | 380 |
| 381 RefPtrWillBeRawPtr<AnimationPlayer> player = m_transitions.take(id).play
er; | 381 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).animati
on; |
| 382 Animation* animation = toAnimation(player->source()); | 382 KeyframeEffect* effect = toKeyframeEffect(animation->source()); |
| 383 if (animation->hasActiveAnimationsOnCompositor(id) && update->newTransit
ions().find(id) != update->newTransitions().end() && !player->limited()) | 383 if (effect->hasActiveAnimationsOnCompositor(id) && update->newTransition
s().find(id) != update->newTransitions().end() && !animation->limited()) |
| 384 retargetedCompositorTransitions.add(id, std::pair<RefPtrWillBeMember
<Animation>, double>(animation, player->startTimeInternal())); | 384 retargetedCompositorTransitions.add(id, std::pair<RefPtrWillBeMember
<KeyframeEffect>, double>(effect, animation->startTimeInternal())); |
| 385 player->cancel(); | 385 animation->cancel(); |
| 386 // after cancelation, transitions must be downgraded or they'll fail | 386 // after cancelation, transitions must be downgraded or they'll fail |
| 387 // to be considered when retriggering themselves. This can happen if | 387 // to be considered when retriggering themselves. This can happen if |
| 388 // the transition is captured through getAnimationPlayers then played. | 388 // the transition is captured through getAnimations then played. |
| 389 if (player->source() && player->source()->isAnimation()) | 389 if (animation->source() && animation->source()->isAnimation()) |
| 390 toAnimation(player->source())->downgradeToNormalAnimation(); | 390 toKeyframeEffect(animation->source())->downgradeToNormalAnimation(); |
| 391 player->update(TimingUpdateOnDemand); | 391 animation->update(TimingUpdateOnDemand); |
| 392 } | 392 } |
| 393 | 393 |
| 394 for (CSSPropertyID id : update->finishedTransitions()) { | 394 for (CSSPropertyID id : update->finishedTransitions()) { |
| 395 // This transition can also be cancelled and finished at the same time | 395 // This transition can also be cancelled and finished at the same time |
| 396 if (m_transitions.contains(id)) { | 396 if (m_transitions.contains(id)) { |
| 397 RefPtrWillBeRawPtr<AnimationPlayer> player = m_transitions.take(id).
player; | 397 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).ani
mation; |
| 398 // Transition must be downgraded | 398 // Transition must be downgraded |
| 399 if (player->source() && player->source()->isAnimation()) | 399 if (animation->source() && animation->source()->isAnimation()) |
| 400 toAnimation(player->source())->downgradeToNormalAnimation(); | 400 toKeyframeEffect(animation->source())->downgradeToNormalAnimatio
n(); |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 for (const auto& entry : update->newTransitions()) { | 404 for (const auto& entry : update->newTransitions()) { |
| 405 const CSSAnimationUpdate::NewTransition& newTransition = entry.value; | 405 const CSSAnimationUpdate::NewTransition& newTransition = entry.value; |
| 406 | 406 |
| 407 RunningTransition runningTransition; | 407 RunningTransition runningTransition; |
| 408 runningTransition.from = newTransition.from; | 408 runningTransition.from = newTransition.from; |
| 409 runningTransition.to = newTransition.to; | 409 runningTransition.to = newTransition.to; |
| 410 | 410 |
| 411 CSSPropertyID id = newTransition.id; | 411 CSSPropertyID id = newTransition.id; |
| 412 InertAnimation* inertAnimation = newTransition.animation.get(); | 412 InertAnimation* inertAnimation = newTransition.effect.get(); |
| 413 OwnPtrWillBeRawPtr<TransitionEventDelegate> eventDelegate = adoptPtrWill
BeNoop(new TransitionEventDelegate(element, newTransition.eventId)); | 413 OwnPtrWillBeRawPtr<TransitionEventDelegate> eventDelegate = adoptPtrWill
BeNoop(new TransitionEventDelegate(element, newTransition.eventId)); |
| 414 | 414 |
| 415 RefPtrWillBeRawPtr<AnimationEffect> effect = inertAnimation->effect(); | 415 RefPtrWillBeRawPtr<EffectModel> effect = inertAnimation->effect(); |
| 416 | 416 |
| 417 if (retargetedCompositorTransitions.contains(id)) { | 417 if (retargetedCompositorTransitions.contains(id)) { |
| 418 const std::pair<RefPtrWillBeMember<Animation>, double>& oldTransitio
n = retargetedCompositorTransitions.get(id); | 418 const std::pair<RefPtrWillBeMember<KeyframeEffect>, double>& oldTran
sition = retargetedCompositorTransitions.get(id); |
| 419 RefPtrWillBeRawPtr<Animation> oldAnimation = oldTransition.first; | 419 RefPtrWillBeRawPtr<KeyframeEffect> oldAnimation = oldTransition.firs
t; |
| 420 double oldStartTime = oldTransition.second; | 420 double oldStartTime = oldTransition.second; |
| 421 double inheritedTime = isNull(oldStartTime) ? 0 : element->document(
).timeline().currentTimeInternal() - oldStartTime; | 421 double inheritedTime = isNull(oldStartTime) ? 0 : element->document(
).timeline().currentTimeInternal() - oldStartTime; |
| 422 | 422 |
| 423 AnimatableValueKeyframeEffectModel* oldEffect = toAnimatableValueKey
frameEffectModel(inertAnimation->effect()); | 423 AnimatableValueKeyframeEffectModel* oldEffect = toAnimatableValueKey
frameEffectModel(inertAnimation->effect()); |
| 424 const KeyframeVector& frames = oldEffect->getFrames(); | 424 const KeyframeVector& frames = oldEffect->getFrames(); |
| 425 | 425 |
| 426 AnimatableValueKeyframeVector newFrames; | 426 AnimatableValueKeyframeVector newFrames; |
| 427 newFrames.append(toAnimatableValueKeyframe(frames[0]->clone().get())
); | 427 newFrames.append(toAnimatableValueKeyframe(frames[0]->clone().get())
); |
| 428 newFrames.append(toAnimatableValueKeyframe(frames[1]->clone().get())
); | 428 newFrames.append(toAnimatableValueKeyframe(frames[1]->clone().get())
); |
| 429 newFrames.append(toAnimatableValueKeyframe(frames[2]->clone().get())
); | 429 newFrames.append(toAnimatableValueKeyframe(frames[2]->clone().get())
); |
| 430 newFrames[0]->clearPropertyValue(id); | 430 newFrames[0]->clearPropertyValue(id); |
| 431 newFrames[1]->clearPropertyValue(id); | 431 newFrames[1]->clearPropertyValue(id); |
| 432 | 432 |
| 433 RefPtrWillBeRawPtr<InertAnimation> inertAnimationForSampling = Inert
Animation::create(oldAnimation->effect(), oldAnimation->specifiedTiming(), false
, inheritedTime); | 433 RefPtrWillBeRawPtr<InertAnimation> inertAnimationForSampling = Inert
Animation::create(oldAnimation->effect(), oldAnimation->specifiedTiming(), false
, inheritedTime); |
| 434 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation
>>> sample = nullptr; | 434 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation
>>> sample = nullptr; |
| 435 inertAnimationForSampling->sample(sample); | 435 inertAnimationForSampling->sample(sample); |
| 436 if (sample && sample->size() == 1) { | 436 if (sample && sample->size() == 1) { |
| 437 newFrames[0]->setPropertyValue(id, toLegacyStyleInterpolation(sa
mple->at(0).get())->currentValue()); | 437 newFrames[0]->setPropertyValue(id, toLegacyStyleInterpolation(sa
mple->at(0).get())->currentValue()); |
| 438 newFrames[1]->setPropertyValue(id, toLegacyStyleInterpolation(sa
mple->at(0).get())->currentValue()); | 438 newFrames[1]->setPropertyValue(id, toLegacyStyleInterpolation(sa
mple->at(0).get())->currentValue()); |
| 439 effect = AnimatableValueKeyframeEffectModel::create(newFrames); | 439 effect = AnimatableValueKeyframeEffectModel::create(newFrames); |
| 440 } | 440 } |
| 441 } | 441 } |
| 442 | 442 |
| 443 RefPtrWillBeRawPtr<Animation> transition = Animation::create(element, ef
fect, inertAnimation->specifiedTiming(), Animation::TransitionPriority, eventDel
egate.release()); | 443 RefPtrWillBeRawPtr<KeyframeEffect> transition = KeyframeEffect::create(e
lement, effect, inertAnimation->specifiedTiming(), KeyframeEffect::TransitionPri
ority, eventDelegate.release()); |
| 444 transition->setName(inertAnimation->name()); | 444 transition->setName(inertAnimation->name()); |
| 445 RefPtrWillBeRawPtr<AnimationPlayer> player = element->document().timelin
e().play(transition.get()); | 445 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline()
.play(transition.get()); |
| 446 player->update(TimingUpdateOnDemand); | 446 animation->update(TimingUpdateOnDemand); |
| 447 runningTransition.player = player; | 447 runningTransition.animation = animation; |
| 448 m_transitions.set(id, runningTransition); | 448 m_transitions.set(id, runningTransition); |
| 449 ASSERT(id != CSSPropertyInvalid); | 449 ASSERT(id != CSSPropertyInvalid); |
| 450 Platform::current()->histogramSparse("WebCore.Animation.CSSProperties",
UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(id)); | 450 Platform::current()->histogramSparse("WebCore.Animation.CSSProperties",
UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(id)); |
| 451 } | 451 } |
| 452 } | 452 } |
| 453 | 453 |
| 454 void CSSAnimations::calculateTransitionUpdateForProperty(CSSPropertyID id, CSSPr
opertyID eventId, const CSSTransitionData& transitionData, size_t transitionInde
x, const ComputedStyle& oldStyle, const ComputedStyle& style, const TransitionMa
p* activeTransitions, CSSAnimationUpdate* update, const Element* element) | 454 void CSSAnimations::calculateTransitionUpdateForProperty(CSSPropertyID id, CSSPr
opertyID eventId, const CSSTransitionData& transitionData, size_t transitionInde
x, const ComputedStyle& oldStyle, const ComputedStyle& style, const TransitionMa
p* activeTransitions, CSSAnimationUpdate* update, const Element* element) |
| 455 { | 455 { |
| 456 RefPtrWillBeRawPtr<AnimatableValue> to = nullptr; | 456 RefPtrWillBeRawPtr<AnimatableValue> to = nullptr; |
| 457 if (activeTransitions) { | 457 if (activeTransitions) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 } | 568 } |
| 569 } | 569 } |
| 570 } | 570 } |
| 571 } | 571 } |
| 572 | 572 |
| 573 if (activeTransitions) { | 573 if (activeTransitions) { |
| 574 for (const auto& entry : *activeTransitions) { | 574 for (const auto& entry : *activeTransitions) { |
| 575 CSSPropertyID id = entry.key; | 575 CSSPropertyID id = entry.key; |
| 576 if (!anyTransitionHadTransitionAll && !animationStyleRecalc && !list
edProperties.get(id)) { | 576 if (!anyTransitionHadTransitionAll && !animationStyleRecalc && !list
edProperties.get(id)) { |
| 577 // TODO: Figure out why this fails on Chrome OS login page. crbu
g.com/365507 | 577 // TODO: Figure out why this fails on Chrome OS login page. crbu
g.com/365507 |
| 578 // ASSERT(player.playStateInternal() == AnimationPlayer::Finishe
d || !(elementAnimations && elementAnimations->isAnimationStyleChange())); | 578 // ASSERT(animation.playStateInternal() == Animation::Finished |
| !(elementAnimations && elementAnimations->isAnimationStyleChange())); |
| 579 update->cancelTransition(id); | 579 update->cancelTransition(id); |
| 580 } else if (entry.value.player->finishedInternal()) { | 580 } else if (entry.value.animation->finishedInternal()) { |
| 581 update->finishTransition(id); | 581 update->finishTransition(id); |
| 582 } | 582 } |
| 583 } | 583 } |
| 584 } | 584 } |
| 585 } | 585 } |
| 586 | 586 |
| 587 void CSSAnimations::cancel() | 587 void CSSAnimations::cancel() |
| 588 { | 588 { |
| 589 for (const auto& entry : m_animations) { | 589 for (const auto& entry : m_animations) { |
| 590 entry.value->player->cancel(); | 590 entry.value->animation->cancel(); |
| 591 entry.value->player->update(TimingUpdateOnDemand); | 591 entry.value->animation->update(TimingUpdateOnDemand); |
| 592 } | 592 } |
| 593 | 593 |
| 594 for (const auto& entry : m_transitions) { | 594 for (const auto& entry : m_transitions) { |
| 595 entry.value.player->cancel(); | 595 entry.value.animation->cancel(); |
| 596 entry.value.player->update(TimingUpdateOnDemand); | 596 entry.value.animation->update(TimingUpdateOnDemand); |
| 597 } | 597 } |
| 598 | 598 |
| 599 m_animations.clear(); | 599 m_animations.clear(); |
| 600 m_transitions.clear(); | 600 m_transitions.clear(); |
| 601 m_pendingUpdate = nullptr; | 601 m_pendingUpdate = nullptr; |
| 602 } | 602 } |
| 603 | 603 |
| 604 void CSSAnimations::calculateAnimationActiveInterpolations(CSSAnimationUpdate* u
pdate, const Element* animatingElement, double timelineCurrentTime) | 604 void CSSAnimations::calculateAnimationActiveInterpolations(CSSAnimationUpdate* u
pdate, const Element* animatingElement, double timelineCurrentTime) |
| 605 { | 605 { |
| 606 ElementAnimations* elementAnimations = animatingElement ? animatingElement->
elementAnimations() : nullptr; | 606 ElementAnimations* elementAnimations = animatingElement ? animatingElement->
elementAnimations() : nullptr; |
| 607 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def
aultStack() : nullptr; | 607 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def
aultStack() : nullptr; |
| 608 | 608 |
| 609 if (update->newAnimations().isEmpty() && update->suppressedAnimationAnimatio
nPlayers().isEmpty()) { | 609 if (update->newAnimations().isEmpty() && update->suppressedAnimationAnimatio
ns().isEmpty()) { |
| 610 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack:
:activeInterpolations(animationStack, 0, 0, Animation::DefaultPriority, timeline
CurrentTime)); | 610 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack:
:activeInterpolations(animationStack, 0, 0, KeyframeEffect::DefaultPriority, tim
elineCurrentTime)); |
| 611 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAn
imations); | 611 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAn
imations); |
| 612 return; | 612 return; |
| 613 } | 613 } |
| 614 | 614 |
| 615 WillBeHeapVector<RawPtrWillBeMember<InertAnimation>> newAnimations; | 615 WillBeHeapVector<RawPtrWillBeMember<InertAnimation>> newEffects; |
| 616 for (const auto& newAnimation : update->newAnimations()) | 616 for (const auto& newAnimation : update->newAnimations()) |
| 617 newAnimations.append(newAnimation.animation.get()); | 617 newEffects.append(newAnimation.effect.get()); |
| 618 for (const auto& updatedAnimation : update->animationsWithUpdates()) | 618 for (const auto& updatedAnimation : update->animationsWithUpdates()) |
| 619 newAnimations.append(updatedAnimation.animation.get()); // Animations wi
th updates use a temporary InertAnimation for the current frame. | 619 newEffects.append(updatedAnimation.effect.get()); // Animations with upd
ates use a temporary InertAnimation for the current frame. |
| 620 | 620 |
| 621 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack::act
iveInterpolations(animationStack, &newAnimations, &update->suppressedAnimationAn
imationPlayers(), Animation::DefaultPriority, timelineCurrentTime)); | 621 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack::act
iveInterpolations(animationStack, &newEffects, &update->suppressedAnimationAnima
tions(), KeyframeEffect::DefaultPriority, timelineCurrentTime)); |
| 622 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAnimat
ions); | 622 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAnimat
ions); |
| 623 } | 623 } |
| 624 | 624 |
| 625 void CSSAnimations::calculateTransitionActiveInterpolations(CSSAnimationUpdate*
update, const Element* animatingElement, double timelineCurrentTime) | 625 void CSSAnimations::calculateTransitionActiveInterpolations(CSSAnimationUpdate*
update, const Element* animatingElement, double timelineCurrentTime) |
| 626 { | 626 { |
| 627 ElementAnimations* elementAnimations = animatingElement ? animatingElement->
elementAnimations() : nullptr; | 627 ElementAnimations* elementAnimations = animatingElement ? animatingElement->
elementAnimations() : nullptr; |
| 628 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def
aultStack() : nullptr; | 628 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def
aultStack() : nullptr; |
| 629 | 629 |
| 630 ActiveInterpolationMap activeInterpolationsForTransitions; | 630 ActiveInterpolationMap activeInterpolationsForTransitions; |
| 631 if (update->newTransitions().isEmpty() && update->cancelledTransitions().isE
mpty()) { | 631 if (update->newTransitions().isEmpty() && update->cancelledTransitions().isE
mpty()) { |
| 632 activeInterpolationsForTransitions = AnimationStack::activeInterpolation
s(animationStack, 0, 0, Animation::TransitionPriority, timelineCurrentTime); | 632 activeInterpolationsForTransitions = AnimationStack::activeInterpolation
s(animationStack, 0, 0, KeyframeEffect::TransitionPriority, timelineCurrentTime)
; |
| 633 } else { | 633 } else { |
| 634 WillBeHeapVector<RawPtrWillBeMember<InertAnimation>> newTransitions; | 634 WillBeHeapVector<RawPtrWillBeMember<InertAnimation>> newTransitions; |
| 635 for (const auto& entry : update->newTransitions()) | 635 for (const auto& entry : update->newTransitions()) |
| 636 newTransitions.append(entry.value.animation.get()); | 636 newTransitions.append(entry.value.effect.get()); |
| 637 | 637 |
| 638 WillBeHeapHashSet<RawPtrWillBeMember<const AnimationPlayer>> cancelledAn
imationPlayers; | 638 WillBeHeapHashSet<RawPtrWillBeMember<const Animation>> cancelledAnimatio
ns; |
| 639 if (!update->cancelledTransitions().isEmpty()) { | 639 if (!update->cancelledTransitions().isEmpty()) { |
| 640 ASSERT(elementAnimations); | 640 ASSERT(elementAnimations); |
| 641 const TransitionMap& transitionMap = elementAnimations->cssAnimation
s().m_transitions; | 641 const TransitionMap& transitionMap = elementAnimations->cssAnimation
s().m_transitions; |
| 642 for (CSSPropertyID id : update->cancelledTransitions()) { | 642 for (CSSPropertyID id : update->cancelledTransitions()) { |
| 643 ASSERT(transitionMap.contains(id)); | 643 ASSERT(transitionMap.contains(id)); |
| 644 cancelledAnimationPlayers.add(transitionMap.get(id).player.get()
); | 644 cancelledAnimations.add(transitionMap.get(id).animation.get()); |
| 645 } | 645 } |
| 646 } | 646 } |
| 647 | 647 |
| 648 activeInterpolationsForTransitions = AnimationStack::activeInterpolation
s(animationStack, &newTransitions, &cancelledAnimationPlayers, Animation::Transi
tionPriority, timelineCurrentTime); | 648 activeInterpolationsForTransitions = AnimationStack::activeInterpolation
s(animationStack, &newTransitions, &cancelledAnimations, KeyframeEffect::Transit
ionPriority, timelineCurrentTime); |
| 649 } | 649 } |
| 650 | 650 |
| 651 // Properties being animated by animations don't get values from transitions
applied. | 651 // Properties being animated by animations don't get values from transitions
applied. |
| 652 if (!update->activeInterpolationsForAnimations().isEmpty() && !activeInterpo
lationsForTransitions.isEmpty()) { | 652 if (!update->activeInterpolationsForAnimations().isEmpty() && !activeInterpo
lationsForTransitions.isEmpty()) { |
| 653 for (const auto& entry : update->activeInterpolationsForAnimations()) | 653 for (const auto& entry : update->activeInterpolationsForAnimations()) |
| 654 activeInterpolationsForTransitions.remove(entry.key); | 654 activeInterpolationsForTransitions.remove(entry.key); |
| 655 } | 655 } |
| 656 update->adoptActiveInterpolationsForTransitions(activeInterpolationsForTrans
itions); | 656 update->adoptActiveInterpolationsForTransitions(activeInterpolationsForTrans
itions); |
| 657 } | 657 } |
| 658 | 658 |
| 659 EventTarget* CSSAnimations::AnimationEventDelegate::eventTarget() const | 659 EventTarget* CSSAnimations::AnimationEventDelegate::eventTarget() const |
| 660 { | 660 { |
| 661 return EventPath::eventTargetRespectingTargetRules(*m_animationTarget); | 661 return EventPath::eventTargetRespectingTargetRules(*m_animationTarget); |
| 662 } | 662 } |
| 663 | 663 |
| 664 void CSSAnimations::AnimationEventDelegate::maybeDispatch(Document::ListenerType
listenerType, const AtomicString& eventName, double elapsedTime) | 664 void CSSAnimations::AnimationEventDelegate::maybeDispatch(Document::ListenerType
listenerType, const AtomicString& eventName, double elapsedTime) |
| 665 { | 665 { |
| 666 if (m_animationTarget->document().hasListenerType(listenerType)) { | 666 if (m_animationTarget->document().hasListenerType(listenerType)) { |
| 667 RefPtrWillBeRawPtr<AnimationEvent> event = AnimationEvent::create(eventN
ame, m_name, elapsedTime); | 667 RefPtrWillBeRawPtr<AnimationEvent> event = AnimationEvent::create(eventN
ame, m_name, elapsedTime); |
| 668 event->setTarget(eventTarget()); | 668 event->setTarget(eventTarget()); |
| 669 document().enqueueAnimationFrameEvent(event); | 669 document().enqueueAnimationFrameEvent(event); |
| 670 } | 670 } |
| 671 } | 671 } |
| 672 | 672 |
| 673 bool CSSAnimations::AnimationEventDelegate::requiresIterationEvents(const Animat
ionNode& animationNode) | 673 bool CSSAnimations::AnimationEventDelegate::requiresIterationEvents(const Animat
ionEffect& animationNode) |
| 674 { | 674 { |
| 675 return document().hasListenerType(Document::ANIMATIONITERATION_LISTENER); | 675 return document().hasListenerType(Document::ANIMATIONITERATION_LISTENER); |
| 676 } | 676 } |
| 677 | 677 |
| 678 void CSSAnimations::AnimationEventDelegate::onEventCondition(const AnimationNode
& animationNode) | 678 void CSSAnimations::AnimationEventDelegate::onEventCondition(const AnimationEffe
ct& animationNode) |
| 679 { | 679 { |
| 680 const AnimationNode::Phase currentPhase = animationNode.phase(); | 680 const AnimationEffect::Phase currentPhase = animationNode.phase(); |
| 681 const double currentIteration = animationNode.currentIteration(); | 681 const double currentIteration = animationNode.currentIteration(); |
| 682 | 682 |
| 683 if (m_previousPhase != currentPhase | 683 if (m_previousPhase != currentPhase |
| 684 && (currentPhase == AnimationNode::PhaseActive || currentPhase == Animat
ionNode::PhaseAfter) | 684 && (currentPhase == AnimationEffect::PhaseActive || currentPhase == Anim
ationEffect::PhaseAfter) |
| 685 && (m_previousPhase == AnimationNode::PhaseNone || m_previousPhase == An
imationNode::PhaseBefore)) { | 685 && (m_previousPhase == AnimationEffect::PhaseNone || m_previousPhase ==
AnimationEffect::PhaseBefore)) { |
| 686 const double startDelay = animationNode.specifiedTiming().startDelay; | 686 const double startDelay = animationNode.specifiedTiming().startDelay; |
| 687 const double elapsedTime = startDelay < 0 ? -startDelay : 0; | 687 const double elapsedTime = startDelay < 0 ? -startDelay : 0; |
| 688 maybeDispatch(Document::ANIMATIONSTART_LISTENER, EventTypeNames::animati
onstart, elapsedTime); | 688 maybeDispatch(Document::ANIMATIONSTART_LISTENER, EventTypeNames::animati
onstart, elapsedTime); |
| 689 } | 689 } |
| 690 | 690 |
| 691 if (currentPhase == AnimationNode::PhaseActive && m_previousPhase == current
Phase && m_previousIteration != currentIteration) { | 691 if (currentPhase == AnimationEffect::PhaseActive && m_previousPhase == curre
ntPhase && m_previousIteration != currentIteration) { |
| 692 // We fire only a single event for all iterations thast terminate | 692 // We fire only a single event for all iterations thast terminate |
| 693 // between a single pair of samples. See http://crbug.com/275263. For | 693 // between a single pair of samples. See http://crbug.com/275263. For |
| 694 // compatibility with the existing implementation, this event uses | 694 // compatibility with the existing implementation, this event uses |
| 695 // the elapsedTime for the first iteration in question. | 695 // the elapsedTime for the first iteration in question. |
| 696 ASSERT(!std::isnan(animationNode.specifiedTiming().iterationDuration)); | 696 ASSERT(!std::isnan(animationNode.specifiedTiming().iterationDuration)); |
| 697 const double elapsedTime = animationNode.specifiedTiming().iterationDura
tion * (m_previousIteration + 1); | 697 const double elapsedTime = animationNode.specifiedTiming().iterationDura
tion * (m_previousIteration + 1); |
| 698 maybeDispatch(Document::ANIMATIONITERATION_LISTENER, EventTypeNames::ani
mationiteration, elapsedTime); | 698 maybeDispatch(Document::ANIMATIONITERATION_LISTENER, EventTypeNames::ani
mationiteration, elapsedTime); |
| 699 } | 699 } |
| 700 | 700 |
| 701 if (currentPhase == AnimationNode::PhaseAfter && m_previousPhase != Animatio
nNode::PhaseAfter) | 701 if (currentPhase == AnimationEffect::PhaseAfter && m_previousPhase != Animat
ionEffect::PhaseAfter) |
| 702 maybeDispatch(Document::ANIMATIONEND_LISTENER, EventTypeNames::animation
end, animationNode.activeDurationInternal()); | 702 maybeDispatch(Document::ANIMATIONEND_LISTENER, EventTypeNames::animation
end, animationNode.activeDurationInternal()); |
| 703 | 703 |
| 704 m_previousPhase = currentPhase; | 704 m_previousPhase = currentPhase; |
| 705 m_previousIteration = currentIteration; | 705 m_previousIteration = currentIteration; |
| 706 } | 706 } |
| 707 | 707 |
| 708 DEFINE_TRACE(CSSAnimations::AnimationEventDelegate) | 708 DEFINE_TRACE(CSSAnimations::AnimationEventDelegate) |
| 709 { | 709 { |
| 710 visitor->trace(m_animationTarget); | 710 visitor->trace(m_animationTarget); |
| 711 AnimationNode::EventDelegate::trace(visitor); | 711 AnimationEffect::EventDelegate::trace(visitor); |
| 712 } | 712 } |
| 713 | 713 |
| 714 EventTarget* CSSAnimations::TransitionEventDelegate::eventTarget() const | 714 EventTarget* CSSAnimations::TransitionEventDelegate::eventTarget() const |
| 715 { | 715 { |
| 716 return EventPath::eventTargetRespectingTargetRules(*m_transitionTarget); | 716 return EventPath::eventTargetRespectingTargetRules(*m_transitionTarget); |
| 717 } | 717 } |
| 718 | 718 |
| 719 void CSSAnimations::TransitionEventDelegate::onEventCondition(const AnimationNod
e& animationNode) | 719 void CSSAnimations::TransitionEventDelegate::onEventCondition(const AnimationEff
ect& animationNode) |
| 720 { | 720 { |
| 721 const AnimationNode::Phase currentPhase = animationNode.phase(); | 721 const AnimationEffect::Phase currentPhase = animationNode.phase(); |
| 722 if (currentPhase == AnimationNode::PhaseAfter && currentPhase != m_previousP
hase && document().hasListenerType(Document::TRANSITIONEND_LISTENER)) { | 722 if (currentPhase == AnimationEffect::PhaseAfter && currentPhase != m_previou
sPhase && document().hasListenerType(Document::TRANSITIONEND_LISTENER)) { |
| 723 String propertyName = getPropertyNameString(m_property); | 723 String propertyName = getPropertyNameString(m_property); |
| 724 const Timing& timing = animationNode.specifiedTiming(); | 724 const Timing& timing = animationNode.specifiedTiming(); |
| 725 double elapsedTime = timing.iterationDuration; | 725 double elapsedTime = timing.iterationDuration; |
| 726 const AtomicString& eventType = EventTypeNames::transitionend; | 726 const AtomicString& eventType = EventTypeNames::transitionend; |
| 727 String pseudoElement = PseudoElement::pseudoElementNameForEvents(pseudoI
d()); | 727 String pseudoElement = PseudoElement::pseudoElementNameForEvents(pseudoI
d()); |
| 728 RefPtrWillBeRawPtr<TransitionEvent> event = TransitionEvent::create(even
tType, propertyName, elapsedTime, pseudoElement); | 728 RefPtrWillBeRawPtr<TransitionEvent> event = TransitionEvent::create(even
tType, propertyName, elapsedTime, pseudoElement); |
| 729 event->setTarget(eventTarget()); | 729 event->setTarget(eventTarget()); |
| 730 document().enqueueAnimationFrameEvent(event); | 730 document().enqueueAnimationFrameEvent(event); |
| 731 } | 731 } |
| 732 | 732 |
| 733 m_previousPhase = currentPhase; | 733 m_previousPhase = currentPhase; |
| 734 } | 734 } |
| 735 | 735 |
| 736 DEFINE_TRACE(CSSAnimations::TransitionEventDelegate) | 736 DEFINE_TRACE(CSSAnimations::TransitionEventDelegate) |
| 737 { | 737 { |
| 738 visitor->trace(m_transitionTarget); | 738 visitor->trace(m_transitionTarget); |
| 739 AnimationNode::EventDelegate::trace(visitor); | 739 AnimationEffect::EventDelegate::trace(visitor); |
| 740 } | 740 } |
| 741 | 741 |
| 742 const StylePropertyShorthand& CSSAnimations::propertiesForTransitionAll() | 742 const StylePropertyShorthand& CSSAnimations::propertiesForTransitionAll() |
| 743 { | 743 { |
| 744 DEFINE_STATIC_LOCAL(Vector<CSSPropertyID>, properties, ()); | 744 DEFINE_STATIC_LOCAL(Vector<CSSPropertyID>, properties, ()); |
| 745 DEFINE_STATIC_LOCAL(StylePropertyShorthand, propertyShorthand, ()); | 745 DEFINE_STATIC_LOCAL(StylePropertyShorthand, propertyShorthand, ()); |
| 746 if (properties.isEmpty()) { | 746 if (properties.isEmpty()) { |
| 747 for (int i = firstCSSProperty; i < lastCSSProperty; ++i) { | 747 for (int i = firstCSSProperty; i < lastCSSProperty; ++i) { |
| 748 CSSPropertyID id = convertToCSSPropertyID(i); | 748 CSSPropertyID id = convertToCSSPropertyID(i); |
| 749 // Avoid creating overlapping transitions with perspective-origin an
d transition-origin. | 749 // Avoid creating overlapping transitions with perspective-origin an
d transition-origin. |
| 750 if (id == CSSPropertyWebkitPerspectiveOriginX | 750 if (id == CSSPropertyWebkitPerspectiveOriginX |
| 751 || id == CSSPropertyWebkitPerspectiveOriginY | 751 || id == CSSPropertyWebkitPerspectiveOriginY |
| 752 || id == CSSPropertyWebkitTransformOriginX | 752 || id == CSSPropertyWebkitTransformOriginX |
| 753 || id == CSSPropertyWebkitTransformOriginY | 753 || id == CSSPropertyWebkitTransformOriginY |
| 754 || id == CSSPropertyWebkitTransformOriginZ) | 754 || id == CSSPropertyWebkitTransformOriginZ) |
| 755 continue; | 755 continue; |
| 756 if (CSSPropertyMetadata::isAnimatableProperty(id)) | 756 if (CSSPropertyMetadata::isAnimatableProperty(id)) |
| 757 properties.append(id); | 757 properties.append(id); |
| 758 } | 758 } |
| 759 propertyShorthand = StylePropertyShorthand(CSSPropertyInvalid, propertie
s.begin(), properties.size()); | 759 propertyShorthand = StylePropertyShorthand(CSSPropertyInvalid, propertie
s.begin(), properties.size()); |
| 760 } | 760 } |
| 761 return propertyShorthand; | 761 return propertyShorthand; |
| 762 } | 762 } |
| 763 | 763 |
| 764 // Animation properties are not allowed to be affected by Web Animations. | 764 // KeyframeEffect properties are not allowed to be affected by Web Animations. |
| 765 // http://dev.w3.org/fxtf/web-animations/#not-animatable | 765 // http://dev.w3.org/fxtf/web-animations/#not-animatable |
| 766 bool CSSAnimations::isAllowedAnimation(CSSPropertyID property) | 766 bool CSSAnimations::isAllowedAnimation(CSSPropertyID property) |
| 767 { | 767 { |
| 768 switch (property) { | 768 switch (property) { |
| 769 case CSSPropertyAnimation: | 769 case CSSPropertyAnimation: |
| 770 case CSSPropertyAnimationDelay: | 770 case CSSPropertyAnimationDelay: |
| 771 case CSSPropertyAnimationDirection: | 771 case CSSPropertyAnimationDirection: |
| 772 case CSSPropertyAnimationDuration: | 772 case CSSPropertyAnimationDuration: |
| 773 case CSSPropertyAnimationFillMode: | 773 case CSSPropertyAnimationFillMode: |
| 774 case CSSPropertyAnimationIterationCount: | 774 case CSSPropertyAnimationIterationCount: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 797 #endif | 797 #endif |
| 798 } | 798 } |
| 799 | 799 |
| 800 DEFINE_TRACE(CSSAnimationUpdate) | 800 DEFINE_TRACE(CSSAnimationUpdate) |
| 801 { | 801 { |
| 802 #if ENABLE(OILPAN) | 802 #if ENABLE(OILPAN) |
| 803 visitor->trace(m_newTransitions); | 803 visitor->trace(m_newTransitions); |
| 804 visitor->trace(m_activeInterpolationsForAnimations); | 804 visitor->trace(m_activeInterpolationsForAnimations); |
| 805 visitor->trace(m_activeInterpolationsForTransitions); | 805 visitor->trace(m_activeInterpolationsForTransitions); |
| 806 visitor->trace(m_newAnimations); | 806 visitor->trace(m_newAnimations); |
| 807 visitor->trace(m_suppressedAnimationPlayers); | 807 visitor->trace(m_suppressedAnimations); |
| 808 visitor->trace(m_animationsWithUpdates); | 808 visitor->trace(m_animationsWithUpdates); |
| 809 visitor->trace(m_animationsWithStyleUpdates); | 809 visitor->trace(m_animationsWithStyleUpdates); |
| 810 #endif | 810 #endif |
| 811 } | 811 } |
| 812 | 812 |
| 813 } // namespace blink | 813 } // namespace blink |
| OLD | NEW |