ScriptedAnimationController.h [plain text]
#pragma once
#include "Timer.h"
#include <wtf/OptionSet.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
class Document;
class Page;
class RequestAnimationFrameCallback;
class ScriptedAnimationController : public RefCounted<ScriptedAnimationController>
{
public:
static Ref<ScriptedAnimationController> create(Document& document)
{
return adoptRef(*new ScriptedAnimationController(document));
}
~ScriptedAnimationController();
void clearDocumentPointer() { m_document = nullptr; }
bool requestAnimationFrameEnabled() const;
typedef int CallbackId;
CallbackId registerCallback(Ref<RequestAnimationFrameCallback>&&);
void cancelCallback(CallbackId);
void serviceScriptedAnimations(double timestamp);
void suspend();
void resume();
enum class ThrottlingReason {
VisuallyIdle = 1 << 0,
OutsideViewport = 1 << 1,
LowPowerMode = 1 << 2,
NonInteractedCrossOriginFrame = 1 << 3,
};
void addThrottlingReason(ThrottlingReason);
void removeThrottlingReason(ThrottlingReason);
WEBCORE_EXPORT bool isThrottled() const;
WEBCORE_EXPORT Seconds interval() const;
#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
void documentAnimationSchedulerDidFire();
#endif
private:
ScriptedAnimationController(Document&);
void scheduleAnimation();
void animationTimerFired();
Page* page() const;
typedef Vector<RefPtr<RequestAnimationFrameCallback>> CallbackList;
CallbackList m_callbacks;
Document* m_document;
CallbackId m_nextCallbackId { 0 };
int m_suspendCount { 0 };
Timer m_animationTimer;
double m_lastAnimationFrameTimestamp { 0 };
#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
OptionSet<ThrottlingReason> m_throttlingReasons;
bool m_isUsingTimer { false };
#endif
};
}