| Index: third_party/WebKit/Source/core/animation/Animation.cpp
|
| diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp
|
| index 6fa80f83fe2cbd13ad14a62a28f32f07f826147f..6b93196a831ae69eadc4a663a51031b7f5614e97 100644
|
| --- a/third_party/WebKit/Source/core/animation/Animation.cpp
|
| +++ b/third_party/WebKit/Source/core/animation/Animation.cpp
|
| @@ -34,6 +34,7 @@
|
| #include "core/animation/CompositorPendingAnimations.h"
|
| #include "core/animation/KeyframeEffectReadOnly.h"
|
| #include "core/animation/css/CSSAnimations.h"
|
| +#include "core/dom/DOMNodeIds.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/ExceptionCode.h"
|
| #include "core/dom/StyleChangeReason.h"
|
| @@ -253,7 +254,10 @@ double Animation::unlimitedCurrentTimeInternal() const {
|
| : calculateCurrentTime();
|
| }
|
|
|
| -bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
|
| +bool Animation::preCommit(
|
| + int compositorGroup,
|
| + const Optional<CompositorElementIdSet>& compositedAnimationElementIds,
|
| + bool startOnCompositor) {
|
| PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand,
|
| DoNotSetCompositorPending);
|
|
|
| @@ -291,10 +295,10 @@ bool Animation::preCommit(int compositorGroup, bool startOnCompositor) {
|
| if (shouldStart) {
|
| m_compositorGroup = compositorGroup;
|
| if (startOnCompositor) {
|
| - if (isCandidateForAnimationOnCompositor())
|
| + if (isCandidateForAnimationOnCompositor(compositedAnimationElementIds))
|
| createCompositorPlayer();
|
|
|
| - if (maybeStartAnimationOnCompositor())
|
| + if (maybeStartAnimationOnCompositor(compositedAnimationElementIds))
|
| m_compositorState = WTF::wrapUnique(new CompositorState(*this));
|
| else
|
| cancelIncompatibleAnimationsOnCompositor();
|
| @@ -722,7 +726,9 @@ void Animation::forceServiceOnNextFrame() {
|
| m_timeline->wake();
|
| }
|
|
|
| -bool Animation::canStartAnimationOnCompositor() const {
|
| +bool Animation::canStartAnimationOnCompositor(
|
| + const Optional<CompositorElementIdSet>& compositedAnimationElementIds)
|
| + const {
|
| if (m_isCompositedAnimationDisabledForTesting || effectSuppressed())
|
| return false;
|
|
|
| @@ -731,20 +737,38 @@ bool Animation::canStartAnimationOnCompositor() const {
|
| (timeline() && timeline()->playbackRate() != 1))
|
| return false;
|
|
|
| + // TODO(wkorman): Share logic in
|
| + // PaintPropertyTreeBuilder::createDomNodeBasedCompositorElementId and
|
| + // consider caching in animation or otherwise somehow if expensive.
|
| + const KeyframeEffectReadOnly* effect =
|
| + toKeyframeEffectReadOnly(m_content.get());
|
| + CompositorElementId targetCompositorElementId = createCompositorElementId(
|
| + DOMNodeIds::idForNode(effect->target()), CompositorSubElementId::Primary);
|
| + // If the optional element id set has no value we must be in SPv1 mode in
|
| + // which case we trust the compositing logic will create a layer if needed.
|
| + bool hasLayer =
|
| + !compositedAnimationElementIds.has_value() ||
|
| + compositedAnimationElementIds->contains(targetCompositorElementId);
|
| + if (!hasLayer)
|
| + return false;
|
| +
|
| return m_timeline && m_content && m_content->isKeyframeEffectReadOnly() &&
|
| playing();
|
| }
|
|
|
| -bool Animation::isCandidateForAnimationOnCompositor() const {
|
| - if (!canStartAnimationOnCompositor())
|
| +bool Animation::isCandidateForAnimationOnCompositor(
|
| + const Optional<CompositorElementIdSet>& compositedAnimationElementIds)
|
| + const {
|
| + if (!canStartAnimationOnCompositor(compositedAnimationElementIds))
|
| return false;
|
|
|
| return toKeyframeEffectReadOnly(m_content.get())
|
| ->isCandidateForAnimationOnCompositor(m_playbackRate);
|
| }
|
|
|
| -bool Animation::maybeStartAnimationOnCompositor() {
|
| - if (!canStartAnimationOnCompositor())
|
| +bool Animation::maybeStartAnimationOnCompositor(
|
| + const Optional<CompositorElementIdSet>& compositedAnimationElementIds) {
|
| + if (!canStartAnimationOnCompositor(compositedAnimationElementIds))
|
| return false;
|
|
|
| bool reversed = m_playbackRate < 0;
|
|
|