| 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..a7e71b8625e5031f46ba7f3df9de6214c8618ad4 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"
|
| @@ -42,6 +43,7 @@
|
| #include "core/frame/UseCounter.h"
|
| #include "core/inspector/InspectorInstrumentation.h"
|
| #include "core/inspector/InspectorTraceEvents.h"
|
| +#include "core/paint/PaintPropertyTreeBuilder.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| #include "platform/WebTaskRunner.h"
|
| #include "platform/animation/CompositorAnimationPlayer.h"
|
| @@ -253,7 +255,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 +296,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 +727,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;
|
|
|
| @@ -730,21 +736,34 @@ bool Animation::canStartAnimationOnCompositor() const {
|
| if (m_playbackRate == 0 || (std::isinf(effectEnd()) && m_playbackRate < 0) ||
|
| (timeline() && timeline()->playbackRate() != 1))
|
| 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()) {
|
| + const KeyframeEffectReadOnly* effect =
|
| + toKeyframeEffectReadOnly(m_content.get());
|
| + CompositorElementId targetElementId =
|
| + createCompositorElementId(DOMNodeIds::idForNode(effect->target()),
|
| + CompositorSubElementId::Primary);
|
| + if (!compositedElementIds->contains(targetElementId))
|
| + return false;
|
| + }
|
|
|
| return m_timeline && m_content && m_content->isKeyframeEffectReadOnly() &&
|
| 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;
|
|
|