Allow UI clients to handle vertical wheel events.
[WebKit-https.git] / Source / WebCore / page / scrolling / mac / ScrollingCoordinatorMac.h
1 /*
2  * Copyright (C) 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef ScrollingCoordinatorMac_h
27 #define ScrollingCoordinatorMac_h
28
29 #if ENABLE(THREADED_SCROLLING)
30
31 #include "ScrollingCoordinator.h"
32
33 namespace WebCore {
34
35 class ScrollingStateNode;
36 class ScrollingStateScrollingNode;
37 class ScrollingStateTree;
38
39 class ScrollingCoordinatorMac : public ScrollingCoordinator {
40 public:
41     explicit ScrollingCoordinatorMac(Page*);
42     virtual ~ScrollingCoordinatorMac();
43
44     virtual void pageDestroyed();
45
46     virtual ScrollingTree* scrollingTree() const;
47     virtual void commitTreeStateIfNeeded();
48
49     // Should be called whenever the given frame view has been laid out.
50     virtual void frameViewLayoutUpdated(FrameView*);
51
52     // Should be called whenever the root layer for the given frame view changes.
53     virtual void frameViewRootLayerDidChange(FrameView*);
54
55     // Should be called whenever the horizontal scrollbar layer for the given frame view changes.
56     virtual void frameViewHorizontalScrollbarLayerDidChange(FrameView*, GraphicsLayer* horizontalScrollbarLayer);
57
58     // Should be called whenever the vertical scrollbar layer for the given frame view changes.
59     virtual void frameViewVerticalScrollbarLayerDidChange(FrameView*, GraphicsLayer* verticalScrollbarLayer);
60
61     // Requests that the scrolling coordinator updates the scroll position of the given frame view. If this function returns true, it means that the
62     // position will be updated asynchronously. If it returns false, the caller should update the scrolling position itself.
63     virtual bool requestScrollPositionUpdate(FrameView*, const IntPoint&);
64
65     // Handle the wheel event on the scrolling thread. Returns whether the event was handled or not.
66     virtual bool handleWheelEvent(FrameView*, const PlatformWheelEvent&);
67
68     // These functions are used to indicate that a layer should be (or should not longer be) represented by a node
69     // in the scrolling tree.
70     virtual ScrollingNodeID attachToStateTree(ScrollingNodeType, ScrollingNodeID newNodeID, ScrollingNodeID parentID);
71     virtual void detachFromStateTree(ScrollingNodeID);
72
73     // This function wipes out the current tree.
74     virtual void clearStateTree();
75
76     virtual String scrollingStateTreeAsText() const OVERRIDE;
77
78     virtual bool isRubberBandInProgress() const OVERRIDE;
79     virtual bool rubberBandsAtBottom() const OVERRIDE;
80     virtual void setRubberBandsAtBottom(bool) OVERRIDE;
81     virtual bool rubberBandsAtTop() const OVERRIDE;
82     virtual void setRubberBandsAtTop(bool) OVERRIDE;
83
84 private:
85     // Return whether this scrolling coordinator can keep fixed position layers fixed to their
86     // containers while scrolling.
87     virtual bool supportsFixedPositionLayers() const OVERRIDE { return true; }
88
89     // This function will update the ScrollingStateNode for the given viewport constrained object.
90     virtual void updateViewportConstrainedNode(ScrollingNodeID, const ViewportConstraints&, GraphicsLayer*) OVERRIDE;
91
92     virtual void updateScrollingNode(ScrollingNodeID, GraphicsLayer* scrollLayer, GraphicsLayer* counterScrollingLayer) OVERRIDE;
93
94     // Called to synch the GraphicsLayer positions for child layers when their CALayers have been moved by the scrolling thread.
95     virtual void syncChildPositions(const LayoutRect& viewportRect) OVERRIDE;
96
97     virtual void recomputeWheelEventHandlerCountForFrameView(FrameView*);
98     virtual void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons);
99
100     virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(FrameView*) const { return false; }
101
102     void ensureRootStateNodeForFrameView(FrameView*);
103
104     struct ScrollParameters {
105         ScrollElasticity horizontalScrollElasticity;
106         ScrollElasticity verticalScrollElasticity;
107
108         bool hasEnabledHorizontalScrollbar;
109         bool hasEnabledVerticalScrollbar;
110
111         ScrollbarMode horizontalScrollbarMode;
112         ScrollbarMode verticalScrollbarMode;
113
114         IntPoint scrollOrigin;
115
116         IntRect viewportRect;
117         IntSize contentsSize;
118         
119         float frameScaleFactor;
120     };
121
122     void setScrollParametersForNode(const ScrollParameters&, ScrollingStateScrollingNode*);
123     void setScrollLayerForNode(GraphicsLayer*, ScrollingStateNode*);
124     void setCounterScrollingLayerForNode(GraphicsLayer*, ScrollingStateScrollingNode*);
125     void setNonFastScrollableRegionForNode(const Region&, ScrollingStateScrollingNode*);
126     void setWheelEventHandlerCountForNode(unsigned, ScrollingStateScrollingNode*);
127
128     void updateMainFrameScrollLayerPosition();
129
130     void scheduleTreeStateCommit();
131
132     void scrollingStateTreeCommitterTimerFired(Timer<ScrollingCoordinatorMac>*);
133     void commitTreeState();
134
135     OwnPtr<ScrollingStateTree> m_scrollingStateTree;
136     RefPtr<ScrollingTree> m_scrollingTree;
137     Timer<ScrollingCoordinatorMac> m_scrollingStateTreeCommitterTimer;
138 };
139
140 } // namespace WebCore
141
142 #endif // ENABLE(THREADED_SCROLLING)
143
144 #endif // ScrollingCoordinatorMac_h