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 <wtf/Forward.h>
#if ENABLE(ASYNC_SCROLLING)
#include <wtf/HashMap.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Threading.h>
#endif
#if PLATFORM(COCOA)
#include <wtf/RetainPtr.h>
#endif
namespace WebCore {
typedef unsigned SynchronousScrollingReasons;
typedef uint64_t ScrollingNodeID;
enum ScrollingNodeType { FrameScrollingNode, OverflowScrollingNode, FixedNode, StickyNode };
class Document;
class Frame;
class FrameView;
class GraphicsLayer;
class Page;
class Region;
class ScrollableArea;
class ViewportConstraints;
#if ENABLE(ASYNC_SCROLLING)
class ScrollingTree;
#endif
enum SetOrSyncScrollingLayerPosition {
SetScrollingLayerPosition,
SyncScrollingLayerPosition
};
struct ScrollableAreaParameters {
ScrollElasticity horizontalScrollElasticity;
ScrollElasticity verticalScrollElasticity;
ScrollbarMode horizontalScrollbarMode;
ScrollbarMode verticalScrollbarMode;
bool hasEnabledHorizontalScrollbar;
bool hasEnabledVerticalScrollbar;
ScrollableAreaParameters()
: horizontalScrollElasticity(ScrollElasticityNone)
, verticalScrollElasticity(ScrollElasticityNone)
, horizontalScrollbarMode(ScrollbarAuto)
, verticalScrollbarMode(ScrollbarAuto)
, hasEnabledHorizontalScrollbar(false)
, hasEnabledVerticalScrollbar(false)
{
}
bool operator==(const ScrollableAreaParameters& other) const
{
return horizontalScrollElasticity == other.horizontalScrollElasticity
&& verticalScrollElasticity == other.verticalScrollElasticity
&& horizontalScrollbarMode == other.horizontalScrollbarMode
&& verticalScrollbarMode == other.verticalScrollbarMode
&& hasEnabledHorizontalScrollbar == other.hasEnabledHorizontalScrollbar
&& hasEnabledVerticalScrollbar == other.hasEnabledVerticalScrollbar;
}
};
class ScrollingCoordinator : public ThreadSafeRefCounted<ScrollingCoordinator> {
public:
static PassRefPtr<ScrollingCoordinator> create(Page*);
virtual ~ScrollingCoordinator();
virtual void pageDestroyed();
virtual bool isAsyncScrollingCoordinator() const { return false; }
virtual bool isRemoteScrollingCoordinator() const { return false; }
virtual bool coordinatesScrollingForFrameView(FrameView*) const;
virtual void frameViewLayoutUpdated(FrameView*) { }
void frameViewWheelEventHandlerCountChanged(FrameView*);
void frameViewHasSlowRepaintObjectsDidChange(FrameView*);
void frameViewFixedObjectsDidChange(FrameView*);
virtual void frameViewNonFastScrollableRegionChanged(FrameView*) { }
virtual void frameViewRootLayerDidChange(FrameView*);
virtual bool supportsFixedPositionLayers() const { return false; }
#if PLATFORM(COCOA)
void handleWheelEventPhase(PlatformWheelEventPhase);
#endif
#if ENABLE(WEB_REPLAY)
void replaySessionStateDidChange();
#endif
void setForceSynchronousScrollLayerPositionUpdates(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*) { }
struct ScrollingGeometry {
FloatSize scrollableAreaSize;
FloatSize contentSize;
FloatSize reachableContentSize; FloatPoint scrollPosition;
IntPoint scrollOrigin;
};
virtual void updateFrameScrollingNode(ScrollingNodeID, GraphicsLayer* , GraphicsLayer* , GraphicsLayer* , GraphicsLayer* , const ScrollingGeometry* = nullptr) { }
virtual void updateOverflowScrollingNode(ScrollingNodeID, GraphicsLayer* , GraphicsLayer* , const ScrollingGeometry* = nullptr) { }
virtual void syncChildPositions(const LayoutRect&) { }
virtual String scrollingStateTreeAsText() const;
virtual bool isRubberBandInProgress() const { return false; }
virtual void setScrollPinningBehavior(ScrollPinningBehavior) { }
ScrollingNodeID uniqueScrollLayerID();
enum MainThreadScrollingReasonFlags {
ForcedOnMainThread = 1 << 0,
HasSlowRepaintObjects = 1 << 1,
HasViewportConstrainedObjectsWithoutSupportingFixedLayers = 1 << 2,
HasNonLayerViewportConstrainedObjects = 1 << 3,
IsImageDocument = 1 << 4
};
SynchronousScrollingReasons synchronousScrollingReasons(FrameView*) const;
bool shouldUpdateScrollLayerPositionSynchronously() const;
virtual void willDestroyScrollableArea(ScrollableArea*) { }
virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*) { }
virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation) { }
static String synchronousScrollingReasonsAsText(SynchronousScrollingReasons);
String synchronousScrollingReasonsAsText() const;
Region computeNonFastScrollableRegion(const Frame*, const IntPoint& frameLocation) const;
protected:
explicit ScrollingCoordinator(Page*);
static GraphicsLayer* scrollLayerForScrollableArea(ScrollableArea*);
static GraphicsLayer* horizontalScrollbarLayerForScrollableArea(ScrollableArea*);
static GraphicsLayer* verticalScrollbarLayerForScrollableArea(ScrollableArea*);
unsigned computeCurrentWheelEventHandlerCount();
GraphicsLayer* scrollLayerForFrameView(FrameView*);
GraphicsLayer* counterScrollingLayerForFrameView(FrameView*);
GraphicsLayer* insetClipLayerForFrameView(FrameView*);
GraphicsLayer* rootContentLayerForFrameView(FrameView*);
GraphicsLayer* contentShadowLayerForFrameView(FrameView*);
GraphicsLayer* headerLayerForFrameView(FrameView*);
GraphicsLayer* footerLayerForFrameView(FrameView*);
Page* m_page;
private:
virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*) { }
virtual void setSynchronousScrollingReasons(SynchronousScrollingReasons) { }
virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const;
void updateSynchronousScrollingReasons(FrameView*);
bool m_forceSynchronousScrollLayerPositionUpdates;
};
#define SCROLLING_COORDINATOR_TYPE_CASTS(ToValueTypeName, predicate) \
TYPE_CASTS_BASE(ToValueTypeName, WebCore::ScrollingCoordinator, value, value->predicate, value.predicate)
}
#endif // ScrollingCoordinator_h