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; |