Remove scrolling tree dependency on wheel event handler counts, and use fast scrollin...
[WebKit-https.git] / Source / WebCore / page / scrolling / ScrollingStateFrameScrollingNode.h
1 /*
2  * Copyright (C) 2014 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 ScrollingStateFrameScrollingNode_h
27 #define ScrollingStateFrameScrollingNode_h
28
29 #if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
30
31 #include "Region.h"
32 #include "ScrollTypes.h"
33 #include "ScrollbarThemeComposite.h"
34 #include "ScrollingCoordinator.h"
35 #include "ScrollingStateScrollingNode.h"
36
37 namespace WebCore {
38
39 class Scrollbar;
40
41 class ScrollingStateFrameScrollingNode final : public ScrollingStateScrollingNode {
42 public:
43     static PassRefPtr<ScrollingStateFrameScrollingNode> create(ScrollingStateTree&, ScrollingNodeID);
44
45     virtual PassRefPtr<ScrollingStateNode> clone(ScrollingStateTree&) override;
46
47     virtual ~ScrollingStateFrameScrollingNode();
48
49     enum ChangedProperty {
50         FrameScaleFactor = NumScrollingStateNodeBits,
51         NonFastScrollableRegion,
52         ReasonsForSynchronousScrolling,
53         ScrolledContentsLayer,
54         CounterScrollingLayer,
55         InsetClipLayer,
56         ContentShadowLayer,
57         HeaderHeight,
58         FooterHeight,
59         HeaderLayer,
60         FooterLayer,
61         PainterForScrollbar,
62         BehaviorForFixedElements,
63         TopContentInset
64     };
65
66     float frameScaleFactor() const { return m_frameScaleFactor; }
67     WEBCORE_EXPORT void setFrameScaleFactor(float);
68
69     const Region& nonFastScrollableRegion() const { return m_nonFastScrollableRegion; }
70     WEBCORE_EXPORT void setNonFastScrollableRegion(const Region&);
71
72     SynchronousScrollingReasons synchronousScrollingReasons() const { return m_synchronousScrollingReasons; }
73     WEBCORE_EXPORT void setSynchronousScrollingReasons(SynchronousScrollingReasons);
74
75     ScrollBehaviorForFixedElements scrollBehaviorForFixedElements() const { return m_behaviorForFixed; }
76     WEBCORE_EXPORT void setScrollBehaviorForFixedElements(ScrollBehaviorForFixedElements);
77
78     int headerHeight() const { return m_headerHeight; }
79     WEBCORE_EXPORT void setHeaderHeight(int);
80
81     int footerHeight() const { return m_footerHeight; }
82     WEBCORE_EXPORT void setFooterHeight(int);
83
84     float topContentInset() const { return m_topContentInset; }
85     WEBCORE_EXPORT void setTopContentInset(float);
86
87     const LayerRepresentation& scrolledContentsLayer() const { return m_scrolledContentsLayer; }
88     WEBCORE_EXPORT void setScrolledContentsLayer(const LayerRepresentation&);
89
90     // This is a layer moved in the opposite direction to scrolling, for example for background-attachment:fixed
91     const LayerRepresentation& counterScrollingLayer() const { return m_counterScrollingLayer; }
92     WEBCORE_EXPORT void setCounterScrollingLayer(const LayerRepresentation&);
93
94     // This is a clipping layer that will scroll with the page for all y-delta scroll values between 0
95     // and topContentInset(). Once the y-deltas get beyond the content inset point, this layer no longer
96     // needs to move. If the topContentInset() is 0, this layer does not need to move at all. This is
97     // only used on the Mac.
98     const LayerRepresentation& insetClipLayer() const { return m_insetClipLayer; }
99     WEBCORE_EXPORT void setInsetClipLayer(const LayerRepresentation&);
100
101     const LayerRepresentation& contentShadowLayer() const { return m_contentShadowLayer; }
102     WEBCORE_EXPORT void setContentShadowLayer(const LayerRepresentation&);
103
104     // The header and footer layers scroll vertically with the page, they should remain fixed when scrolling horizontally.
105     const LayerRepresentation& headerLayer() const { return m_headerLayer; }
106     WEBCORE_EXPORT void setHeaderLayer(const LayerRepresentation&);
107
108     // The header and footer layers scroll vertically with the page, they should remain fixed when scrolling horizontally.
109     const LayerRepresentation& footerLayer() const { return m_footerLayer; }
110     WEBCORE_EXPORT void setFooterLayer(const LayerRepresentation&);
111
112 #if PLATFORM(MAC)
113     ScrollbarPainter verticalScrollbarPainter() const { return m_verticalScrollbarPainter.get(); }
114     ScrollbarPainter horizontalScrollbarPainter() const { return m_horizontalScrollbarPainter.get(); }
115 #endif
116     void setScrollbarPaintersFromScrollbars(Scrollbar* verticalScrollbar, Scrollbar* horizontalScrollbar);
117
118     virtual void dumpProperties(TextStream&, int indent) const override;
119
120 private:
121     ScrollingStateFrameScrollingNode(ScrollingStateTree&, ScrollingNodeID);
122     ScrollingStateFrameScrollingNode(const ScrollingStateFrameScrollingNode&, ScrollingStateTree&);
123
124     LayerRepresentation m_counterScrollingLayer;
125     LayerRepresentation m_insetClipLayer;
126     LayerRepresentation m_scrolledContentsLayer;
127     LayerRepresentation m_contentShadowLayer;
128     LayerRepresentation m_headerLayer;
129     LayerRepresentation m_footerLayer;
130
131 #if PLATFORM(MAC)
132     RetainPtr<ScrollbarPainter> m_verticalScrollbarPainter;
133     RetainPtr<ScrollbarPainter> m_horizontalScrollbarPainter;
134 #endif
135
136     Region m_nonFastScrollableRegion;
137     float m_frameScaleFactor;
138     SynchronousScrollingReasons m_synchronousScrollingReasons;
139     ScrollBehaviorForFixedElements m_behaviorForFixed;
140     int m_headerHeight;
141     int m_footerHeight;
142     FloatPoint m_requestedScrollPosition;
143     bool m_requestedScrollPositionRepresentsProgrammaticScroll;
144     float m_topContentInset;
145 };
146
147 } // namespace WebCore
148
149 SPECIALIZE_TYPE_TRAITS_SCROLLING_STATE_NODE(ScrollingStateFrameScrollingNode, isFrameScrollingNode())
150
151 #endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
152
153 #endif // ScrollingStateFrameScrollingNode_h