summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/scrolling/ScrollingCoordinator.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/page/scrolling/ScrollingCoordinator.h')
-rw-r--r--Source/WebCore/page/scrolling/ScrollingCoordinator.h146
1 files changed, 91 insertions, 55 deletions
diff --git a/Source/WebCore/page/scrolling/ScrollingCoordinator.h b/Source/WebCore/page/scrolling/ScrollingCoordinator.h
index 0e05d69fd..eb6dabf97 100644
--- a/Source/WebCore/page/scrolling/ScrollingCoordinator.h
+++ b/Source/WebCore/page/scrolling/ScrollingCoordinator.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,15 +23,18 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollingCoordinator_h
-#define ScrollingCoordinator_h
+#pragma once
+#include "EventTrackingRegions.h"
#include "IntRect.h"
#include "LayoutRect.h"
#include "PlatformWheelEvent.h"
-#include "RenderObject.h"
+#include "ScrollSnapOffsetsInfo.h"
#include "ScrollTypes.h"
#include <wtf/Forward.h>
+#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/TypeCasts.h>
+#include <wtf/Variant.h>
#if ENABLE(ASYNC_SCROLLING)
#include <wtf/HashMap.h>
@@ -39,8 +42,8 @@
#include <wtf/Threading.h>
#endif
-#if PLATFORM(MAC)
-#include <wtf/RetainPtr.h>
+#if ENABLE(CSS_SCROLL_SNAP)
+#include "AxisScrollSnapOffsets.h"
#endif
namespace WebCore {
@@ -48,7 +51,7 @@ namespace WebCore {
typedef unsigned SynchronousScrollingReasons;
typedef uint64_t ScrollingNodeID;
-enum ScrollingNodeType { ScrollingNode, FixedNode, StickyNode };
+enum ScrollingNodeType { FrameScrollingNode, OverflowScrollingNode, FixedNode, StickyNode };
class Document;
class Frame;
@@ -57,15 +60,17 @@ class GraphicsLayer;
class Page;
class Region;
class ScrollableArea;
+class TextStream;
class ViewportConstraints;
#if ENABLE(ASYNC_SCROLLING)
class ScrollingTree;
#endif
-enum SetOrSyncScrollingLayerPosition {
- SetScrollingLayerPosition,
- SyncScrollingLayerPosition
+enum class ScrollingLayerPositionAction {
+ Set,
+ SetApproximate,
+ Sync
};
struct ScrollableAreaParameters {
@@ -101,114 +106,145 @@ struct ScrollableAreaParameters {
class ScrollingCoordinator : public ThreadSafeRefCounted<ScrollingCoordinator> {
public:
- static PassRefPtr<ScrollingCoordinator> create(Page*);
+ static Ref<ScrollingCoordinator> create(Page*);
virtual ~ScrollingCoordinator();
- virtual void pageDestroyed();
+ WEBCORE_EXPORT virtual void pageDestroyed();
virtual bool isAsyncScrollingCoordinator() const { return false; }
virtual bool isRemoteScrollingCoordinator() const { return false; }
// Return whether this scrolling coordinator handles scrolling for the given frame view.
- bool coordinatesScrollingForFrameView(FrameView*) const;
+ virtual bool coordinatesScrollingForFrameView(const FrameView&) const;
// Should be called whenever the given frame view has been laid out.
- virtual void frameViewLayoutUpdated(FrameView*) { }
+ virtual void frameViewLayoutUpdated(FrameView&) { }
- // Should be called whenever a wheel event handler is added or removed in the
- // frame view's underlying document.
- void frameViewWheelEventHandlerCountChanged(FrameView*);
+ using LayoutViewportOriginOrOverrideRect = WTF::Variant<std::optional<FloatPoint>, std::optional<FloatRect>>;
+ virtual void reconcileScrollingState(FrameView&, const FloatPoint&, const LayoutViewportOriginOrOverrideRect&, bool /* programmaticScroll */, bool /* inStableState*/, ScrollingLayerPositionAction) { }
// Should be called whenever the slow repaint objects counter changes between zero and one.
- void frameViewHasSlowRepaintObjectsDidChange(FrameView*);
+ void frameViewHasSlowRepaintObjectsDidChange(FrameView&);
// Should be called whenever the set of fixed objects changes.
- void frameViewFixedObjectsDidChange(FrameView*);
+ void frameViewFixedObjectsDidChange(FrameView&);
+
+ // Called whenever the non-fast scrollable region changes for reasons other than layout.
+ virtual void frameViewEventTrackingRegionsChanged(FrameView&) { }
// Should be called whenever the root layer for the given frame view changes.
- virtual void frameViewRootLayerDidChange(FrameView*);
+ virtual void frameViewRootLayerDidChange(FrameView&);
// Return whether this scrolling coordinator can keep fixed position layers fixed to their
// containers while scrolling.
virtual bool supportsFixedPositionLayers() const { return false; }
-#if PLATFORM(MAC)
+#if PLATFORM(COCOA)
// Dispatched by the scrolling tree during handleWheelEvent. This is required as long as scrollbars are painted on the main thread.
void handleWheelEventPhase(PlatformWheelEventPhase);
#endif
+#if ENABLE(WEB_REPLAY)
+ // Called when the page transitions between executing normally and deterministically.
+ void replaySessionStateDidChange();
+#endif
+
// Force all scroll layer position updates to happen on the main thread.
- void setForceSynchronousScrollLayerPositionUpdates(bool);
+ WEBCORE_EXPORT void setForceSynchronousScrollLayerPositionUpdates(bool);
// These virtual functions are currently unique to the threaded scrolling architecture.
// Their meaningful implementations are in ScrollingCoordinatorMac.
virtual void commitTreeStateIfNeeded() { }
- virtual bool requestScrollPositionUpdate(FrameView*, const IntPoint&) { return false; }
- virtual bool handleWheelEvent(FrameView*, const PlatformWheelEvent&) { return true; }
+ virtual bool requestScrollPositionUpdate(FrameView&, const IntPoint&) { return false; }
+ virtual bool handleWheelEvent(FrameView&, const PlatformWheelEvent&) { return true; }
virtual ScrollingNodeID attachToStateTree(ScrollingNodeType, ScrollingNodeID newNodeID, ScrollingNodeID /*parentID*/) { return newNodeID; }
virtual void detachFromStateTree(ScrollingNodeID) { }
virtual void clearStateTree() { }
virtual void updateViewportConstrainedNode(ScrollingNodeID, const ViewportConstraints&, GraphicsLayer*) { }
- virtual void updateScrollingNode(ScrollingNodeID, GraphicsLayer* /*scrollLayer*/, GraphicsLayer* /*counterScrollingLayer*/) { }
- virtual void syncChildPositions(const LayoutRect&) { }
+
+ struct ScrollingGeometry {
+ FloatSize scrollableAreaSize;
+ FloatSize contentSize;
+ FloatSize reachableContentSize; // Smaller than contentSize when overflow is hidden on one axis.
+ FloatPoint scrollPosition;
+ IntPoint scrollOrigin;
+#if ENABLE(CSS_SCROLL_SNAP)
+ Vector<LayoutUnit> horizontalSnapOffsets;
+ Vector<LayoutUnit> verticalSnapOffsets;
+ Vector<ScrollOffsetRange<LayoutUnit>> horizontalSnapOffsetRanges;
+ Vector<ScrollOffsetRange<LayoutUnit>> verticalSnapOffsetRanges;
+ unsigned currentHorizontalSnapPointIndex;
+ unsigned currentVerticalSnapPointIndex;
+#endif
+ };
+
+ virtual void updateFrameScrollingNode(ScrollingNodeID, GraphicsLayer* /*scrollLayer*/, GraphicsLayer* /*scrolledContentsLayer*/, GraphicsLayer* /*counterScrollingLayer*/, GraphicsLayer* /*insetClipLayer*/, const ScrollingGeometry* = nullptr) { }
+ virtual void updateOverflowScrollingNode(ScrollingNodeID, GraphicsLayer* /*scrollLayer*/, GraphicsLayer* /*scrolledContentsLayer*/, const ScrollingGeometry* = nullptr) { }
+ virtual void reconcileViewportConstrainedLayerPositions(const LayoutRect&, ScrollingLayerPositionAction) { }
virtual String scrollingStateTreeAsText() const;
virtual bool isRubberBandInProgress() const { return false; }
+ virtual bool isScrollSnapInProgress() const { return false; }
+ virtual void updateScrollSnapPropertiesWithFrameView(const FrameView&) { }
virtual void setScrollPinningBehavior(ScrollPinningBehavior) { }
// Generated a unique id for scroll layers.
ScrollingNodeID uniqueScrollLayerID();
enum MainThreadScrollingReasonFlags {
- ForcedOnMainThread = 1 << 0,
- HasSlowRepaintObjects = 1 << 1,
- HasViewportConstrainedObjectsWithoutSupportingFixedLayers = 1 << 2,
- HasNonLayerViewportConstrainedObjects = 1 << 3,
- IsImageDocument = 1 << 4
+ ForcedOnMainThread = 1 << 0,
+ HasSlowRepaintObjects = 1 << 1,
+ HasViewportConstrainedObjectsWithoutSupportingFixedLayers = 1 << 2,
+ HasNonLayerViewportConstrainedObjects = 1 << 3,
+ IsImageDocument = 1 << 4
};
- SynchronousScrollingReasons synchronousScrollingReasons() const;
- bool shouldUpdateScrollLayerPositionSynchronously() const { return synchronousScrollingReasons(); }
+ SynchronousScrollingReasons synchronousScrollingReasons(const FrameView&) const;
+ bool shouldUpdateScrollLayerPositionSynchronously(const FrameView&) const;
- virtual void willDestroyScrollableArea(ScrollableArea*) { }
- virtual void scrollableAreaScrollLayerDidChange(ScrollableArea*) { }
- virtual void scrollableAreaScrollbarLayerDidChange(ScrollableArea*, ScrollbarOrientation) { }
- virtual void setLayerIsContainerForFixedPositionLayers(GraphicsLayer*, bool) { }
+ 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;
+ EventTrackingRegions absoluteEventTrackingRegions() const;
+ virtual void updateExpectsWheelEventTestTriggerWithFrameView(const FrameView&) { }
protected:
explicit ScrollingCoordinator(Page*);
-#if USE(ACCELERATED_COMPOSITING)
- static GraphicsLayer* scrollLayerForScrollableArea(ScrollableArea*);
- static GraphicsLayer* horizontalScrollbarLayerForScrollableArea(ScrollableArea*);
- static GraphicsLayer* verticalScrollbarLayerForScrollableArea(ScrollableArea*);
-#endif
+ static GraphicsLayer* scrollLayerForScrollableArea(ScrollableArea&);
- unsigned computeCurrentWheelEventHandlerCount();
- GraphicsLayer* scrollLayerForFrameView(FrameView*);
- GraphicsLayer* counterScrollingLayerForFrameView(FrameView*);
- GraphicsLayer* headerLayerForFrameView(FrameView*);
- GraphicsLayer* footerLayerForFrameView(FrameView*);
+ GraphicsLayer* scrollLayerForFrameView(FrameView&);
+ GraphicsLayer* counterScrollingLayerForFrameView(FrameView&);
+ GraphicsLayer* insetClipLayerForFrameView(FrameView&);
+ GraphicsLayer* rootContentLayerForFrameView(FrameView&);
+ GraphicsLayer* contentShadowLayerForFrameView(FrameView&);
+ GraphicsLayer* headerLayerForFrameView(FrameView&);
+ GraphicsLayer* footerLayerForFrameView(FrameView&);
+
+ virtual void willCommitTree() { }
Page* m_page; // FIXME: ideally this would be a reference but it gets nulled on async teardown.
private:
- virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*) { }
virtual void setSynchronousScrollingReasons(SynchronousScrollingReasons) { }
- virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const;
- void updateSynchronousScrollingReasons();
+ virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(const FrameView&) const;
+ void updateSynchronousScrollingReasons(const FrameView&);
+
+ EventTrackingRegions absoluteEventTrackingRegionsForFrame(const Frame&) const;
- bool m_forceSynchronousScrollLayerPositionUpdates;
+ bool m_forceSynchronousScrollLayerPositionUpdates { false };
};
-#define SCROLLING_COORDINATOR_TYPE_CASTS(ToValueTypeName, predicate) \
- TYPE_CASTS_BASE(ToValueTypeName, WebCore::ScrollingCoordinator, value, value->predicate, value.predicate)
+WEBCORE_EXPORT TextStream& operator<<(TextStream&, ScrollingNodeType);
+WEBCORE_EXPORT TextStream& operator<<(TextStream&, ScrollingLayerPositionAction);
} // namespace WebCore
-#endif // ScrollingCoordinator_h
+#define SPECIALIZE_TYPE_TRAITS_SCROLLING_COORDINATOR(ToValueTypeName, predicate) \
+SPECIALIZE_TYPE_TRAITS_BEGIN(ToValueTypeName) \
+ static bool isType(const WebCore::ScrollingCoordinator& value) { return value.predicate; } \
+SPECIALIZE_TYPE_TRAITS_END()