Chromium Code Reviews| Index: third_party/WebKit/Source/core/animation/Animation.h |
| diff --git a/third_party/WebKit/Source/core/animation/Animation.h b/third_party/WebKit/Source/core/animation/Animation.h |
| index e654fe382f6df9c06c3d66dca03e0008098a2652..e1fb0546ac7de054178c868461fa7407dc142007 100644 |
| --- a/third_party/WebKit/Source/core/animation/Animation.h |
| +++ b/third_party/WebKit/Source/core/animation/Animation.h |
| @@ -62,7 +62,6 @@ class CORE_EXPORT Animation final : public EventTargetWithInlineData, |
| public CompositorAnimationPlayerClient { |
| DEFINE_WRAPPERTYPEINFO(); |
| USING_GARBAGE_COLLECTED_MIXIN(Animation); |
| - USING_PRE_FINALIZER(Animation, dispose); |
| public: |
| enum AnimationPlayState { Unset, Idle, Pending, Running, Paused, Finished }; |
| @@ -162,7 +161,7 @@ class CORE_EXPORT Animation final : public EventTargetWithInlineData, |
| void notifyStartTime(double timelineTime); |
| // CompositorAnimationPlayerClient implementation. |
| CompositorAnimationPlayer* compositorPlayer() const override { |
| - return m_compositorPlayer.get(); |
| + return m_compositorPlayer ? m_compositorPlayer->player() : nullptr; |
| } |
| bool affects(const Element&, CSSPropertyID) const; |
| @@ -300,6 +299,33 @@ class CORE_EXPORT Animation final : public EventTargetWithInlineData, |
| CompositorPendingChange m_compositorPendingChange; |
| }; |
| + // CompositorAnimationPlayer objects need to eagerly sever |
|
haraken
2016/12/12 15:33:29
serve
sof
2016/12/12 15:41:22
We're severing the connection.
|
| + // their connection to their Animation delegate; use a separate |
| + // 'holder' on-heap object to accomplish that. |
| + class CompositorAnimationPlayerHolder |
| + : public GarbageCollectedFinalized<CompositorAnimationPlayerHolder> { |
| + USING_PRE_FINALIZER(CompositorAnimationPlayerHolder, dispose); |
| + |
| + public: |
| + static CompositorAnimationPlayerHolder* create(Animation*); |
| + |
| + void detach(); |
| + |
| + DEFINE_INLINE_TRACE() { visitor->trace(m_animation); } |
| + |
| + CompositorAnimationPlayer* player() const { |
| + return m_compositorPlayer.get(); |
| + } |
| + |
| + private: |
| + explicit CompositorAnimationPlayerHolder(Animation*); |
| + |
| + void dispose(); |
| + |
| + std::unique_ptr<CompositorAnimationPlayer> m_compositorPlayer; |
| + Member<Animation> m_animation; |
| + }; |
| + |
| // This mirrors the known compositor state. It is created when a compositor |
| // animation is started. Updated once the start time is known and each time |
| // modifications are pushed to the compositor. |
| @@ -307,8 +333,7 @@ class CORE_EXPORT Animation final : public EventTargetWithInlineData, |
| bool m_compositorPending; |
| int m_compositorGroup; |
| - std::unique_ptr<CompositorAnimationPlayer> m_compositorPlayer; |
| - bool m_preFinalizerRegistered; |
| + Member<CompositorAnimationPlayerHolder> m_compositorPlayer; |
| bool m_currentTimePending; |
| bool m_stateIsBeingUpdated; |