diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/animation/CSSAnimationControllerPrivate.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/page/animation/CSSAnimationControllerPrivate.h')
-rw-r--r-- | Source/WebCore/page/animation/CSSAnimationControllerPrivate.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/Source/WebCore/page/animation/CSSAnimationControllerPrivate.h b/Source/WebCore/page/animation/CSSAnimationControllerPrivate.h new file mode 100644 index 000000000..c4996c331 --- /dev/null +++ b/Source/WebCore/page/animation/CSSAnimationControllerPrivate.h @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "AnimationBase.h" +#include "Timer.h" +#include <wtf/HashMap.h> +#include <wtf/HashSet.h> +#include <wtf/Vector.h> + +namespace WebCore { + +class CompositeAnimation; +class Document; +class Frame; + +enum SetChanged { DoNotCallSetChanged, CallSetChanged }; + +class CSSAnimationControllerPrivate { + WTF_MAKE_FAST_ALLOCATED; +public: + explicit CSSAnimationControllerPrivate(Frame&); + ~CSSAnimationControllerPrivate(); + + // Returns the time until the next animation needs to be serviced, or -1 if there are none. + double updateAnimations(SetChanged callSetChanged = DoNotCallSetChanged); + void updateAnimationTimer(SetChanged callSetChanged = DoNotCallSetChanged); + + CompositeAnimation& ensureCompositeAnimation(RenderElement&); + bool clear(RenderElement&); + + void updateStyleIfNeededDispatcherFired(); + void startUpdateStyleIfNeededDispatcher(); + void addEventToDispatch(Element&, const AtomicString& eventType, const String& name, double elapsedTime); + void addElementChangeToDispatch(Element&); + + bool hasAnimations() const { return !m_compositeAnimations.isEmpty(); } + + bool isSuspended() const { return m_isSuspended; } + void suspendAnimations(); + void resumeAnimations(); + void animationFrameCallbackFired(); + + void suspendAnimationsForDocument(Document*); + void resumeAnimationsForDocument(Document*); + bool animationsAreSuspendedForDocument(Document*); + void startAnimationsIfNotSuspended(Document*); + void detachFromDocument(Document*); + + bool isRunningAnimationOnRenderer(RenderElement&, CSSPropertyID, AnimationBase::RunningState) const; + bool isRunningAcceleratedAnimationOnRenderer(RenderElement&, CSSPropertyID, AnimationBase::RunningState) const; + + bool pauseAnimationAtTime(RenderElement*, const AtomicString& name, double t); + bool pauseTransitionAtTime(RenderElement*, const String& property, double t); + unsigned numberOfActiveAnimations(Document*) const; + + std::unique_ptr<RenderStyle> getAnimatedStyleForRenderer(RenderElement&); + + bool computeExtentOfAnimation(RenderElement&, LayoutRect&) const; + + double beginAnimationUpdateTime(); + void setBeginAnimationUpdateTime(double t) { m_beginAnimationUpdateTime = t; } + + void beginAnimationUpdate(); + void endAnimationUpdate(); + void receivedStartTimeResponse(double); + + void addToAnimationsWaitingForStyle(AnimationBase*); + void removeFromAnimationsWaitingForStyle(AnimationBase*); + + void addToAnimationsWaitingForStartTimeResponse(AnimationBase*, bool willGetResponse); + void removeFromAnimationsWaitingForStartTimeResponse(AnimationBase*); + + void animationWillBeRemoved(AnimationBase*); + + void updateAnimationTimerForRenderer(RenderElement&); + + bool allowsNewAnimationsWhileSuspended() const { return m_allowsNewAnimationsWhileSuspended; } + void setAllowsNewAnimationsWhileSuspended(bool); + + void setRequiresLayout() { m_requiresLayout = true; } + +#if ENABLE(CSS_ANIMATIONS_LEVEL_2) + bool wantsScrollUpdates() const { return !m_animationsDependentOnScroll.isEmpty(); } + void addToAnimationsDependentOnScroll(AnimationBase*); + void removeFromAnimationsDependentOnScroll(AnimationBase*); + + void scrollWasUpdated(); + float scrollPosition() const { return m_scrollPosition; } +#endif + +private: + void animationTimerFired(); + + void styleAvailable(); + void fireEventsAndUpdateStyle(); + void startTimeResponse(double t); + + HashMap<RenderElement*, RefPtr<CompositeAnimation>> m_compositeAnimations; + Timer m_animationTimer; + Timer m_updateStyleIfNeededDispatcher; + Frame& m_frame; + + struct EventToDispatch { + Ref<Element> element; + AtomicString eventType; + String name; + double elapsedTime; + }; + Vector<EventToDispatch> m_eventsToDispatch; + Vector<Ref<Element>> m_elementChangesToDispatch; + HashSet<Document*> m_suspendedDocuments; + + double m_beginAnimationUpdateTime; + + using AnimationsSet = HashSet<RefPtr<AnimationBase>>; + AnimationsSet m_animationsWaitingForStyle; + AnimationsSet m_animationsWaitingForStartTimeResponse; + + int m_beginAnimationUpdateCount; + + bool m_waitingForAsyncStartNotification; + bool m_isSuspended; + bool m_requiresLayout { false }; + + // Used to flag whether we should revert to previous buggy + // behavior of allowing new transitions and animations to + // run even when this object is suspended. + bool m_allowsNewAnimationsWhileSuspended; + +#if ENABLE(CSS_ANIMATIONS_LEVEL_2) + AnimationsSet m_animationsDependentOnScroll; + float m_scrollPosition { 0 }; +#endif +}; + +} // namespace WebCore |