ScrollingCoordinator.h [plain text]
#ifndef ScrollingCoordinator_h
#define ScrollingCoordinator_h
#include "IntRect.h"
#include "LayoutRect.h"
#include "PlatformWheelEvent.h"
#include "RenderObject.h"
#include "ScrollTypes.h"
#include "Timer.h"
#include <wtf/Forward.h>
#if ENABLE(THREADED_SCROLLING)
#include <wtf/HashMap.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Threading.h>
#endif
#if PLATFORM(MAC)
#include <wtf/RetainPtr.h>
#endif
namespace WebCore {
typedef unsigned MainThreadScrollingReasons;
typedef uint64_t ScrollingNodeID;
enum ScrollingNodeType { ScrollingNode, FixedNode, StickyNode };
class Document;
class Frame;
class FrameView;
class GraphicsLayer;
class Page;
class Region;
class ScrollableArea;
class ViewportConstraints;
#if ENABLE(THREADED_SCROLLING)
class ScrollingTree;
#endif
enum SetOrSyncScrollingLayerPosition {
SetScrollingLayerPosition,
SyncScrollingLayerPosition
};
class ScrollingCoordinator : public ThreadSafeRefCounted<ScrollingCoordinator> {
public:
static PassRefPtr<ScrollingCoordinator> create(Page*);
virtual ~ScrollingCoordinator();
virtual void pageDestroyed();
#if ENABLE(THREADED_SCROLLING)
virtual ScrollingTree* scrollingTree() const { return 0; }
#endif
bool coordinatesScrollingForFrameView(FrameView*) const;
virtual void frameViewLayoutUpdated(FrameView*) { }
void frameViewWheelEventHandlerCountChanged(FrameView*);
void frameViewHasSlowRepaintObjectsDidChange(FrameView*);
void frameViewFixedObjectsDidChange(FrameView*);
virtual void frameViewRootLayerDidChange(FrameView*);
virtual bool supportsFixedPositionLayers() const { return false; }
#if PLATFORM(MAC)
void handleWheelEventPhase(PlatformWheelEventPhase);
#endif
void setForceMainThreadScrollLayerPositionUpdates(bool);
virtual void commitTreeStateIfNeeded() { }
virtual bool requestScrollPositionUpdate(FrameView*, const IntPoint&) { return false; }
virtual bool handleWheelEvent(FrameView*, const PlatformWheelEvent&) { return true; }
virtual ScrollingNodeID attachToStateTree(ScrollingNodeType, ScrollingNodeID newNodeID, ScrollingNodeID ) { return newNodeID; }
virtual void detachFromStateTree(ScrollingNodeID) { }
virtual void clearStateTree() { }
virtual void updateViewportConstrainedNode(ScrollingNodeID, const ViewportConstraints&, GraphicsLayer*) { }
virtual void updateScrollingNode(ScrollingNodeID, GraphicsLayer* , GraphicsLayer* ) { }
virtual void syncChildPositions(const LayoutRect&) { }
virtual String scrollingStateTreeAsText() const;
virtual bool isRubberBandInProgress() const { return false; }
virtual bool rubberBandsAtBottom() const { return false; }
virtual void setRubberBandsAtBottom(bool) { }
virtual bool rubberBandsAtTop() const { return false; }
virtual void setRubberBandsAtTop(bool) { }
virtual void setScrollPinningBehavior(ScrollPinningBehavior) { }
ScrollingNodeID uniqueScrollLayerID();
void scheduleUpdateMainFrameScrollPosition(const IntPoint&, bool programmaticScroll, SetOrSyncScrollingLayerPosition);
void updateMainFrameScrollPosition(const IntPoint&, bool programmaticScroll, SetOrSyncScrollingLayerPosition);
enum MainThreadScrollingReasonFlags {
ForcedOnMainThread = 1 << 0,
HasSlowRepaintObjects = 1 << 1,
HasViewportConstrainedObjectsWithoutSupportingFixedLayers = 1 << 2,
HasNonLayerViewportConstrainedObjects = 1 << 3,
IsImageDocument = 1 << 4
};
MainThreadScrollingReasons mainThreadScrollingReasons() const;
bool shouldUpdateScrollLayerPositionOnMainThread() const { return mainThreadScrollingReasons() != 0; }
virtual void willDestroyScrollableArea(ScrollableArea*) { }
virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*) { }
virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation) { }
virtual void setLayerIsContainerForFixedPositionLayers(GraphicsLayer*, bool) { }
virtual void updateLayerPositionConstraint(RenderLayer*) { }
virtual void touchEventTargetRectsDidChange(const Document*) { }
#if ENABLE(TOUCH_EVENT_TRACKING)
void computeAbsoluteTouchEventTargetRects(const Document*, Vector<IntRect>&);
#endif
static String mainThreadScrollingReasonsAsText(MainThreadScrollingReasons);
String mainThreadScrollingReasonsAsText() const;
Region computeNonFastScrollableRegion(const Frame*, const IntPoint& frameLocation) const;
protected:
explicit ScrollingCoordinator(Page*);
#if USE(ACCELERATED_COMPOSITING)
static GraphicsLayer* scrollLayerForScrollableArea(ScrollableArea*);
static GraphicsLayer* horizontalScrollbarLayerForScrollableArea(ScrollableArea*);
static GraphicsLayer* verticalScrollbarLayerForScrollableArea(ScrollableArea*);
#endif
unsigned computeCurrentWheelEventHandlerCount();
GraphicsLayer* scrollLayerForFrameView(FrameView*);
GraphicsLayer* counterScrollingLayerForFrameView(FrameView*);
GraphicsLayer* headerLayerForFrameView(FrameView*);
GraphicsLayer* footerLayerForFrameView(FrameView*);
Page* m_page;
private:
virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*) { }
virtual void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons) { }
virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const;
void updateShouldUpdateScrollLayerPositionOnMainThread();
void updateMainFrameScrollPositionTimerFired(Timer<ScrollingCoordinator>*);
Timer<ScrollingCoordinator> m_updateMainFrameScrollPositionTimer;
IntPoint m_scheduledUpdateScrollPosition;
bool m_scheduledUpdateIsProgrammaticScroll;
SetOrSyncScrollingLayerPosition m_scheduledScrollingLayerPositionAction;
bool m_forceMainThreadScrollLayerPositionUpdates;
};
}
#endif // ScrollingCoordinator_h