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 1f2f2f84a69d549ca9a3e1d0d1c8c0d130669590..52a99a49aaae5084ab268b85bbbc05e6409a2b27 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>& compositedElementIds, |
+ 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(compositedElementIds)) |
createCompositorPlayer(); |
- if (maybeStartAnimationOnCompositor()) |
+ if (maybeStartAnimationOnCompositor(compositedElementIds)) |
m_compositorState = WTF::wrapUnique(new CompositorState(*this)); |
else |
cancelIncompatibleAnimationsOnCompositor(); |
@@ -722,7 +726,8 @@ void Animation::forceServiceOnNextFrame() { |
m_timeline->wake(); |
} |
-bool Animation::canStartAnimationOnCompositor() const { |
+bool Animation::canStartAnimationOnCompositor( |
+ const Optional<CompositorElementIdSet>& compositedElementIds) const { |
if (m_isCompositedAnimationDisabledForTesting || effectSuppressed()) |
return false; |
@@ -731,20 +736,39 @@ bool Animation::canStartAnimationOnCompositor() const { |
(timeline() && timeline()->playbackRate() != 1)) |
return false; |
- return m_timeline && m_content && m_content->isKeyframeEffectReadOnly() && |
- playing(); |
+ if (!m_timeline || !m_content || !m_content->isKeyframeEffectReadOnly()) |
+ return false; |
+ |
+ // 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. |
+ if (compositedElementIds.has_value()) { |
+ DCHECK(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ Element* targetElement = |
+ toKeyframeEffectReadOnly(m_content.get())->target(); |
+ if (!targetElement) |
+ return false; |
+ |
+ CompositorElementId targetElementId = createCompositorElementId( |
+ DOMNodeIds::idForNode(targetElement), CompositorSubElementId::Primary); |
+ if (!compositedElementIds->contains(targetElementId)) |
+ return false; |
+ } |
+ |
+ return playing(); |
} |
-bool Animation::isCandidateForAnimationOnCompositor() const { |
- if (!canStartAnimationOnCompositor()) |
+bool Animation::isCandidateForAnimationOnCompositor( |
+ const Optional<CompositorElementIdSet>& compositedElementIds) const { |
+ if (!canStartAnimationOnCompositor(compositedElementIds)) |
return false; |
return toKeyframeEffectReadOnly(m_content.get()) |
->isCandidateForAnimationOnCompositor(m_playbackRate); |
} |
-bool Animation::maybeStartAnimationOnCompositor() { |
- if (!canStartAnimationOnCompositor()) |
+bool Animation::maybeStartAnimationOnCompositor( |
+ const Optional<CompositorElementIdSet>& compositedElementIds) { |
+ if (!canStartAnimationOnCompositor(compositedElementIds)) |
return false; |
bool reversed = m_playbackRate < 0; |