| Index: Source/core/animation/AnimationPlayer.cpp
|
| diff --git a/Source/core/animation/AnimationPlayer.cpp b/Source/core/animation/AnimationPlayer.cpp
|
| index cc3f3065687c5a0124970b678301de9cecce50ba..215feb8230bcf7d991999488fa0cf6398fa11d62 100644
|
| --- a/Source/core/animation/AnimationPlayer.cpp
|
| +++ b/Source/core/animation/AnimationPlayer.cpp
|
| @@ -39,7 +39,11 @@
|
| #include "core/frame/UseCounter.h"
|
| #include "core/inspector/InspectorInstrumentation.h"
|
| #include "core/inspector/InspectorTraceEvents.h"
|
| +#include "platform/RuntimeEnabledFeatures.h"
|
| #include "platform/TraceEvent.h"
|
| +#include "public/platform/Platform.h"
|
| +#include "public/platform/WebCompositorAnimationPlayer.h"
|
| +#include "public/platform/WebCompositorSupport.h"
|
| #include "wtf/MathExtras.h"
|
|
|
| namespace blink {
|
| @@ -88,26 +92,34 @@ AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi
|
| , m_compositorState(nullptr)
|
| , m_compositorPending(false)
|
| , m_compositorGroup(0)
|
| + , m_attachCompositorPlayerToElement(false)
|
| , m_currentTimePending(false)
|
| , m_stateIsBeingUpdated(false)
|
| {
|
| + createCompositorPlayer();
|
| +
|
| if (m_content) {
|
| if (m_content->player()) {
|
| m_content->player()->cancel();
|
| m_content->player()->setSource(0);
|
| }
|
| m_content->attach(this);
|
| + attachElementToPlayer();
|
| }
|
| }
|
|
|
| AnimationPlayer::~AnimationPlayer()
|
| {
|
| #if !ENABLE(OILPAN)
|
| - if (m_content)
|
| + if (m_content) {
|
| + detachElementFromPlayer();
|
| m_content->detach();
|
| + }
|
| if (m_timeline)
|
| m_timeline->playerDestroyed(this);
|
| #endif
|
| +
|
| + destroyCompositorPlayer();
|
| }
|
|
|
| double AnimationPlayer::sourceEnd() const
|
| @@ -433,8 +445,10 @@ void AnimationPlayer::setSource(AnimationNode* newSource)
|
| PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand, SetCompositorPendingWithSourceChanged);
|
|
|
| double storedCurrentTime = currentTimeInternal();
|
| - if (m_content)
|
| + if (m_content) {
|
| + detachElementFromPlayer();
|
| m_content->detach();
|
| + }
|
| m_content = newSource;
|
| if (newSource) {
|
| // FIXME: This logic needs to be updated once groups are implemented
|
| @@ -443,6 +457,7 @@ void AnimationPlayer::setSource(AnimationNode* newSource)
|
| newSource->player()->setSource(0);
|
| }
|
| newSource->attach(this);
|
| + attachElementToPlayer();
|
| setOutdated();
|
| }
|
| setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
|
| @@ -830,6 +845,52 @@ void AnimationPlayer::endUpdatingState()
|
| m_stateIsBeingUpdated = false;
|
| }
|
|
|
| +void AnimationPlayer::createCompositorPlayer()
|
| +{
|
| + if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled() && Platform::current()->compositorSupport()) {
|
| + m_compositorPlayer = adoptPtr(Platform::current()->compositorSupport()->createAnimationPlayer());
|
| + ASSERT(m_compositorPlayer);
|
| + m_compositorPlayer->setAnimationDelegate(this);
|
| + }
|
| +}
|
| +
|
| +void AnimationPlayer::destroyCompositorPlayer()
|
| +{
|
| + if (m_compositorPlayer)
|
| + m_compositorPlayer->setAnimationDelegate(nullptr);
|
| + m_compositorPlayer.clear();
|
| +}
|
| +
|
| +void AnimationPlayer::attachElementToPlayer()
|
| +{
|
| + m_attachCompositorPlayerToElement = true;
|
| + updateCompositorPlayerToElementAttachment();
|
| +}
|
| +
|
| +void AnimationPlayer::detachElementFromPlayer()
|
| +{
|
| + m_attachCompositorPlayerToElement = false;
|
| + if (m_compositorPlayer && m_compositorPlayer->isLayerAttached())
|
| + m_compositorPlayer->detachLayer();
|
| +}
|
| +
|
| +void AnimationPlayer::updateCompositorPlayerToElementAttachment()
|
| +{
|
| + if (!RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled() || !m_attachCompositorPlayerToElement)
|
| + return;
|
| + if (!m_compositorPlayer || !m_content || !m_content->isAnimation() || !toAnimation(m_content.get())->canAttachElementToCompositorPlayer())
|
| + return;
|
| +
|
| + m_attachCompositorPlayerToElement = false;
|
| + toAnimation(m_content.get())->attachElementToCompositorPlayer();
|
| +}
|
| +
|
| +void AnimationPlayer::notifyAnimationStarted(double monotonicTime, int group)
|
| +{
|
| + ASSERT(RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled());
|
| + timeline()->document()->compositorPendingAnimations().notifyCompositorAnimationStarted(monotonicTime, group);
|
| +}
|
| +
|
| AnimationPlayer::PlayStateUpdateScope::PlayStateUpdateScope(AnimationPlayer& player, TimingUpdateReason reason, CompositorPendingChange compositorPendingChange)
|
| : m_player(player)
|
| , m_initialPlayState(m_player->playStateInternal())
|
|
|