[Web Animations] Audit Web Animations classes for memory reduction
[WebKit-https.git] / Source / WebCore / animation / DocumentTimeline.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "AnimationTimeline.h"
29 #include "DocumentTimelineOptions.h"
30 #include "GenericTaskQueue.h"
31 #include "Timer.h"
32 #include <wtf/Markable.h>
33 #include <wtf/Ref.h>
34
35 namespace WebCore {
36
37 class AnimationPlaybackEvent;
38 class RenderElement;
39
40 class DocumentTimeline final : public AnimationTimeline
41 {
42 public:
43     static Ref<DocumentTimeline> create(Document&);
44     static Ref<DocumentTimeline> create(Document&, DocumentTimelineOptions&&);
45     ~DocumentTimeline();
46
47     bool isDocumentTimeline() const final { return true; }
48
49     Vector<RefPtr<WebAnimation>> getAnimations() const;
50
51     Document* document() const { return m_document.get(); }
52
53     Optional<Seconds> currentTime() override;
54
55     void animationTimingDidChange(WebAnimation&) override;
56     void removeAnimation(WebAnimation&) override;
57     void animationWasAddedToElement(WebAnimation&, Element&) final;
58     void animationWasRemovedFromElement(WebAnimation&, Element&) final;
59
60     // If possible, compute the visual extent of any transform animation on the given renderer
61     // using the given rect, returning the result in the rect. Return false if there is some
62     // transform animation but we were unable to cheaply compute its effect on the extent.
63     bool computeExtentOfAnimation(RenderElement&, LayoutRect&) const;
64     std::unique_ptr<RenderStyle> animatedStyleForRenderer(RenderElement& renderer);
65     bool isRunningAnimationOnRenderer(RenderElement&, CSSPropertyID) const;
66     bool isRunningAcceleratedAnimationOnRenderer(RenderElement&, CSSPropertyID) const;
67     void animationAcceleratedRunningStateDidChange(WebAnimation&);
68     void applyPendingAcceleratedAnimations();
69     bool runningAnimationsForElementAreAllAccelerated(Element&) const;
70     bool resolveAnimationsForElement(Element&, RenderStyle&);
71     void detachFromDocument();
72
73     void enqueueAnimationPlaybackEvent(AnimationPlaybackEvent&);
74
75 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
76     void documentAnimationSchedulerDidFire();
77 #endif
78
79     void updateThrottlingState();
80     WEBCORE_EXPORT Seconds animationInterval() const;
81     WEBCORE_EXPORT void suspendAnimations();
82     WEBCORE_EXPORT void resumeAnimations();
83     WEBCORE_EXPORT bool animationsAreSuspended();
84     WEBCORE_EXPORT unsigned numberOfActiveAnimationsForTesting() const;
85     WEBCORE_EXPORT Vector<std::pair<String, double>> acceleratedAnimationsForElement(Element&) const;    
86     WEBCORE_EXPORT unsigned numberOfAnimationTimelineInvalidationsForTesting() const;
87
88 private:
89     DocumentTimeline(Document&, Seconds);
90
91     Seconds liveCurrentTime() const;
92     void cacheCurrentTime(Seconds);
93     void scheduleAnimationResolutionIfNeeded();
94     void scheduleInvalidationTaskIfNeeded();
95     void performInvalidationTask();
96     void animationScheduleTimerFired();
97     void scheduleAnimationResolution();
98     void unscheduleAnimationResolution();
99     void updateAnimationsAndSendEvents();
100     void performEventDispatchTask();
101     void maybeClearCachedCurrentTime();
102     void updateListOfElementsWithRunningAcceleratedAnimationsForElement(Element&);
103     void transitionDidComplete(RefPtr<CSSTransition>);
104     void scheduleNextTick();
105
106 #if !USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
107     void animationResolutionTimerFired();
108     Timer m_animationResolutionTimer;
109 #endif
110
111     Timer m_tickScheduleTimer;
112     GenericTaskQueue<Timer> m_currentTimeClearingTaskQueue;
113     HashSet<RefPtr<WebAnimation>> m_acceleratedAnimationsPendingRunningStateChange;
114     HashSet<Element*> m_elementsWithRunningAcceleratedAnimations;
115     Vector<Ref<AnimationPlaybackEvent>> m_pendingAnimationEvents;
116     RefPtr<Document> m_document;
117     Markable<Seconds, Seconds::MarkableTraits> m_cachedCurrentTime;
118     Seconds m_originTime;
119     unsigned m_numberOfAnimationTimelineInvalidationsForTesting { 0 };
120     bool m_isSuspended { false };
121     bool m_waitingOnVMIdle { false };
122     bool m_isUpdatingAnimations { false };
123 };
124
125 } // namespace WebCore
126
127 SPECIALIZE_TYPE_TRAITS_ANIMATION_TIMELINE(DocumentTimeline, isDocumentTimeline())