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

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

Issue 2398373002: Construct KeyframeEffectReadOnly objects (Closed)
Patch Set: Test tweaks in response to review Created 4 years, 1 month 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 20 matching lines...) Expand all
31 #include "core/animation/css/CSSAnimations.h" 31 #include "core/animation/css/CSSAnimations.h"
32 32
33 #include "core/StylePropertyShorthand.h" 33 #include "core/StylePropertyShorthand.h"
34 #include "core/animation/Animation.h" 34 #include "core/animation/Animation.h"
35 #include "core/animation/CompositorAnimations.h" 35 #include "core/animation/CompositorAnimations.h"
36 #include "core/animation/DocumentTimeline.h" 36 #include "core/animation/DocumentTimeline.h"
37 #include "core/animation/ElementAnimations.h" 37 #include "core/animation/ElementAnimations.h"
38 #include "core/animation/InertEffect.h" 38 #include "core/animation/InertEffect.h"
39 #include "core/animation/Interpolation.h" 39 #include "core/animation/Interpolation.h"
40 #include "core/animation/KeyframeEffectModel.h" 40 #include "core/animation/KeyframeEffectModel.h"
41 #include "core/animation/KeyframeEffectReadOnly.h"
41 #include "core/animation/LegacyStyleInterpolation.h" 42 #include "core/animation/LegacyStyleInterpolation.h"
42 #include "core/animation/css/CSSAnimatableValueFactory.h" 43 #include "core/animation/css/CSSAnimatableValueFactory.h"
43 #include "core/css/CSSKeyframeRule.h" 44 #include "core/css/CSSKeyframeRule.h"
44 #include "core/css/CSSPropertyEquality.h" 45 #include "core/css/CSSPropertyEquality.h"
45 #include "core/css/CSSPropertyMetadata.h" 46 #include "core/css/CSSPropertyMetadata.h"
46 #include "core/css/CSSValueList.h" 47 #include "core/css/CSSValueList.h"
47 #include "core/css/resolver/CSSToStyleMap.h" 48 #include "core/css/resolver/CSSToStyleMap.h"
48 #include "core/css/resolver/StyleResolver.h" 49 #include "core/css/resolver/StyleResolver.h"
49 #include "core/dom/Element.h" 50 #include "core/dom/Element.h"
50 #include "core/dom/PseudoElement.h" 51 #include "core/dom/PseudoElement.h"
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 calculateAnimationActiveInterpolations(animationUpdate, animatingElement); 244 calculateAnimationActiveInterpolations(animationUpdate, animatingElement);
244 calculateTransitionUpdate(animationUpdate, animatingElement, style); 245 calculateTransitionUpdate(animationUpdate, animatingElement, style);
245 calculateTransitionActiveInterpolations(animationUpdate, animatingElement); 246 calculateTransitionActiveInterpolations(animationUpdate, animatingElement);
246 } 247 }
247 248
248 static const KeyframeEffectModelBase* getKeyframeEffectModelBase( 249 static const KeyframeEffectModelBase* getKeyframeEffectModelBase(
249 const AnimationEffectReadOnly* effect) { 250 const AnimationEffectReadOnly* effect) {
250 if (!effect) 251 if (!effect)
251 return nullptr; 252 return nullptr;
252 const EffectModel* model = nullptr; 253 const EffectModel* model = nullptr;
253 if (effect->isKeyframeEffect()) 254 if (effect->isKeyframeEffectReadOnly())
254 model = toKeyframeEffect(effect)->model(); 255 model = toKeyframeEffectReadOnly(effect)->model();
255 else if (effect->isInertEffect()) 256 else if (effect->isInertEffect())
256 model = toInertEffect(effect)->model(); 257 model = toInertEffect(effect)->model();
257 if (!model || !model->isKeyframeEffectModel()) 258 if (!model || !model->isKeyframeEffectModel())
258 return nullptr; 259 return nullptr;
259 return toKeyframeEffectModelBase(model); 260 return toKeyframeEffectModelBase(model);
260 } 261 }
261 262
262 void CSSAnimations::calculateCompositorAnimationUpdate( 263 void CSSAnimations::calculateCompositorAnimationUpdate(
263 CSSAnimationUpdate& update, 264 CSSAnimationUpdate& update,
264 const Element* animatingElement, 265 const Element* animatingElement,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 else 481 else
481 animation.pause(); 482 animation.pause();
482 if (animation.outdated()) 483 if (animation.outdated())
483 animation.update(TimingUpdateOnDemand); 484 animation.update(TimingUpdateOnDemand);
484 } 485 }
485 486
486 for (const auto& animation : m_pendingUpdate.updatedCompositorKeyframes()) 487 for (const auto& animation : m_pendingUpdate.updatedCompositorKeyframes())
487 animation->setCompositorPending(true); 488 animation->setCompositorPending(true);
488 489
489 for (const auto& entry : m_pendingUpdate.animationsWithUpdates()) { 490 for (const auto& entry : m_pendingUpdate.animationsWithUpdates()) {
490 KeyframeEffect* effect = toKeyframeEffect(entry.animation->effect()); 491 KeyframeEffectReadOnly* effect =
492 toKeyframeEffectReadOnly(entry.animation->effect());
491 493
492 effect->setModel(entry.effect->model()); 494 effect->setModel(entry.effect->model());
493 effect->updateSpecifiedTiming(entry.effect->specifiedTiming()); 495 effect->updateSpecifiedTiming(entry.effect->specifiedTiming());
494 496
495 m_runningAnimations[entry.index]->update(entry); 497 m_runningAnimations[entry.index]->update(entry);
496 } 498 }
497 499
498 const Vector<size_t>& cancelledIndices = 500 const Vector<size_t>& cancelledIndices =
499 m_pendingUpdate.cancelledAnimationIndices(); 501 m_pendingUpdate.cancelledAnimationIndices();
500 for (size_t i = cancelledIndices.size(); i-- > 0;) { 502 for (size_t i = cancelledIndices.size(); i-- > 0;) {
(...skipping 19 matching lines...) Expand all
520 animation->update(TimingUpdateOnDemand); 522 animation->update(TimingUpdateOnDemand);
521 523
522 m_runningAnimations.append(new RunningAnimation(animation, entry)); 524 m_runningAnimations.append(new RunningAnimation(animation, entry));
523 } 525 }
524 526
525 // Transitions that are run on the compositor only update main-thread state 527 // Transitions that are run on the compositor only update main-thread state
526 // lazily. However, we need the new state to know what the from state shoud 528 // lazily. However, we need the new state to know what the from state shoud
527 // be when transitions are retargeted. Instead of triggering complete style 529 // be when transitions are retargeted. Instead of triggering complete style
528 // recalculation, we find these cases by searching for new transitions that 530 // recalculation, we find these cases by searching for new transitions that
529 // have matching cancelled animation property IDs on the compositor. 531 // have matching cancelled animation property IDs on the compositor.
530 HeapHashMap<CSSPropertyID, std::pair<Member<KeyframeEffect>, double>> 532 HeapHashMap<CSSPropertyID, std::pair<Member<KeyframeEffectReadOnly>, double>>
531 retargetedCompositorTransitions; 533 retargetedCompositorTransitions;
532 for (CSSPropertyID id : m_pendingUpdate.cancelledTransitions()) { 534 for (CSSPropertyID id : m_pendingUpdate.cancelledTransitions()) {
533 DCHECK(m_transitions.contains(id)); 535 DCHECK(m_transitions.contains(id));
534 536
535 Animation* animation = m_transitions.take(id).animation; 537 Animation* animation = m_transitions.take(id).animation;
536 KeyframeEffect* effect = toKeyframeEffect(animation->effect()); 538 KeyframeEffectReadOnly* effect =
539 toKeyframeEffectReadOnly(animation->effect());
537 if (effect->hasActiveAnimationsOnCompositor(id) && 540 if (effect->hasActiveAnimationsOnCompositor(id) &&
538 m_pendingUpdate.newTransitions().find(id) != 541 m_pendingUpdate.newTransitions().find(id) !=
539 m_pendingUpdate.newTransitions().end() && 542 m_pendingUpdate.newTransitions().end() &&
540 !animation->limited()) 543 !animation->limited())
541 retargetedCompositorTransitions.add( 544 retargetedCompositorTransitions.add(
542 id, std::pair<KeyframeEffect*, double>( 545 id, std::pair<KeyframeEffectReadOnly*, double>(
543 effect, animation->startTimeInternal())); 546 effect, animation->startTimeInternal()));
544 animation->cancel(); 547 animation->cancel();
545 // after cancelation, transitions must be downgraded or they'll fail 548 // after cancelation, transitions must be downgraded or they'll fail
546 // to be considered when retriggering themselves. This can happen if 549 // to be considered when retriggering themselves. This can happen if
547 // the transition is captured through getAnimations then played. 550 // the transition is captured through getAnimations then played.
548 if (animation->effect() && animation->effect()->isKeyframeEffect()) 551 if (animation->effect() && animation->effect()->isKeyframeEffectReadOnly())
549 toKeyframeEffect(animation->effect())->downgradeToNormal(); 552 toKeyframeEffectReadOnly(animation->effect())->downgradeToNormal();
550 animation->update(TimingUpdateOnDemand); 553 animation->update(TimingUpdateOnDemand);
551 } 554 }
552 555
553 for (CSSPropertyID id : m_pendingUpdate.finishedTransitions()) { 556 for (CSSPropertyID id : m_pendingUpdate.finishedTransitions()) {
554 // This transition can also be cancelled and finished at the same time 557 // This transition can also be cancelled and finished at the same time
555 if (m_transitions.contains(id)) { 558 if (m_transitions.contains(id)) {
556 Animation* animation = m_transitions.take(id).animation; 559 Animation* animation = m_transitions.take(id).animation;
557 // Transition must be downgraded 560 // Transition must be downgraded
558 if (animation->effect() && animation->effect()->isKeyframeEffect()) 561 if (animation->effect() &&
559 toKeyframeEffect(animation->effect())->downgradeToNormal(); 562 animation->effect()->isKeyframeEffectReadOnly())
563 toKeyframeEffectReadOnly(animation->effect())->downgradeToNormal();
560 } 564 }
561 } 565 }
562 566
563 for (const auto& entry : m_pendingUpdate.newTransitions()) { 567 for (const auto& entry : m_pendingUpdate.newTransitions()) {
564 const CSSAnimationUpdate::NewTransition& newTransition = entry.value; 568 const CSSAnimationUpdate::NewTransition& newTransition = entry.value;
565 569
566 RunningTransition runningTransition; 570 RunningTransition runningTransition;
567 runningTransition.from = newTransition.from; 571 runningTransition.from = newTransition.from;
568 runningTransition.to = newTransition.to; 572 runningTransition.to = newTransition.to;
569 runningTransition.reversingAdjustedStartValue = 573 runningTransition.reversingAdjustedStartValue =
570 newTransition.reversingAdjustedStartValue; 574 newTransition.reversingAdjustedStartValue;
571 runningTransition.reversingShorteningFactor = 575 runningTransition.reversingShorteningFactor =
572 newTransition.reversingShorteningFactor; 576 newTransition.reversingShorteningFactor;
573 577
574 CSSPropertyID id = newTransition.id; 578 CSSPropertyID id = newTransition.id;
575 const InertEffect* inertAnimation = newTransition.effect.get(); 579 const InertEffect* inertAnimation = newTransition.effect.get();
576 TransitionEventDelegate* eventDelegate = 580 TransitionEventDelegate* eventDelegate =
577 new TransitionEventDelegate(element, id); 581 new TransitionEventDelegate(element, id);
578 582
579 EffectModel* model = inertAnimation->model(); 583 EffectModel* model = inertAnimation->model();
580 584
581 if (retargetedCompositorTransitions.contains(id)) { 585 if (retargetedCompositorTransitions.contains(id)) {
582 const std::pair<Member<KeyframeEffect>, double>& oldTransition = 586 const std::pair<Member<KeyframeEffectReadOnly>, double>& oldTransition =
583 retargetedCompositorTransitions.get(id); 587 retargetedCompositorTransitions.get(id);
584 KeyframeEffect* oldAnimation = oldTransition.first; 588 KeyframeEffectReadOnly* oldAnimation = oldTransition.first;
585 double oldStartTime = oldTransition.second; 589 double oldStartTime = oldTransition.second;
586 double inheritedTime = 590 double inheritedTime =
587 isNull(oldStartTime) 591 isNull(oldStartTime)
588 ? 0 592 ? 0
589 : element->document().timeline().currentTimeInternal() - 593 : element->document().timeline().currentTimeInternal() -
590 oldStartTime; 594 oldStartTime;
591 595
592 AnimatableValueKeyframeEffectModel* oldEffect = 596 AnimatableValueKeyframeEffectModel* oldEffect =
593 toAnimatableValueKeyframeEffectModel(inertAnimation->model()); 597 toAnimatableValueKeyframeEffectModel(inertAnimation->model());
594 const KeyframeVector& frames = oldEffect->getFrames(); 598 const KeyframeVector& frames = oldEffect->getFrames();
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 return toShadowRoot(treeScope.rootNode()).host() == element; 1087 return toShadowRoot(treeScope.rootNode()).host() == element;
1084 } 1088 }
1085 1089
1086 DEFINE_TRACE(CSSAnimations) { 1090 DEFINE_TRACE(CSSAnimations) {
1087 visitor->trace(m_transitions); 1091 visitor->trace(m_transitions);
1088 visitor->trace(m_pendingUpdate); 1092 visitor->trace(m_pendingUpdate);
1089 visitor->trace(m_runningAnimations); 1093 visitor->trace(m_runningAnimations);
1090 } 1094 }
1091 1095
1092 } // namespace blink 1096 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698