UI process side scrollbars for UI side compositing on Mac
[WebKit-https.git] / Source / WebCore / page / scrolling / ScrollingStateFrameScrollingNode.h
1 /*
2  * Copyright (C) 2014, 2016 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 #pragma once
27
28 #if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
29
30 #include "EventTrackingRegions.h"
31 #include "ScrollTypes.h"
32 #include "ScrollbarThemeComposite.h"
33 #include "ScrollingCoordinator.h"
34 #include "ScrollingStateScrollingNode.h"
35
36 namespace WebCore {
37
38 class Scrollbar;
39
40 class ScrollingStateFrameScrollingNode final : public ScrollingStateScrollingNode {
41 public:
42     static Ref<ScrollingStateFrameScrollingNode> create(ScrollingStateTree&, ScrollingNodeType, ScrollingNodeID);
43
44     Ref<ScrollingStateNode> clone(ScrollingStateTree&) override;
45
46     virtual ~ScrollingStateFrameScrollingNode();
47
48     enum ChangedProperty {
49         FrameScaleFactor = NumScrollingStateNodeBits,
50         EventTrackingRegion,
51         ReasonsForSynchronousScrolling,
52         ScrolledContentsLayer,
53         CounterScrollingLayer,
54         InsetClipLayer,
55         ContentShadowLayer,
56         HeaderHeight,
57         FooterHeight,
58         HeaderLayer,
59         FooterLayer,
60         VerticalScrollbarLayer,
61         HorizontalScrollbarLayer,
62         PainterForScrollbar,
63         BehaviorForFixedElements,
64         TopContentInset,
65         FixedElementsLayoutRelativeToFrame,
66         VisualViewportEnabled,
67         LayoutViewport,
68         MinLayoutViewportOrigin,
69         MaxLayoutViewportOrigin,
70     };
71
72     float frameScaleFactor() const { return m_frameScaleFactor; }
73     WEBCORE_EXPORT void setFrameScaleFactor(float);
74
75     const EventTrackingRegions& eventTrackingRegions() const { return m_eventTrackingRegions; }
76     WEBCORE_EXPORT void setEventTrackingRegions(const EventTrackingRegions&);
77
78     SynchronousScrollingReasons synchronousScrollingReasons() const { return m_synchronousScrollingReasons; }
79     WEBCORE_EXPORT void setSynchronousScrollingReasons(SynchronousScrollingReasons);
80
81     ScrollBehaviorForFixedElements scrollBehaviorForFixedElements() const { return m_behaviorForFixed; }
82     WEBCORE_EXPORT void setScrollBehaviorForFixedElements(ScrollBehaviorForFixedElements);
83
84     FloatRect layoutViewport() const { return m_layoutViewport; };
85     WEBCORE_EXPORT void setLayoutViewport(const FloatRect&);
86
87     FloatPoint minLayoutViewportOrigin() const { return m_minLayoutViewportOrigin; }
88     WEBCORE_EXPORT void setMinLayoutViewportOrigin(const FloatPoint&);
89
90     FloatPoint maxLayoutViewportOrigin() const { return m_maxLayoutViewportOrigin; }
91     WEBCORE_EXPORT void setMaxLayoutViewportOrigin(const FloatPoint&);
92
93     int headerHeight() const { return m_headerHeight; }
94     WEBCORE_EXPORT void setHeaderHeight(int);
95
96     int footerHeight() const { return m_footerHeight; }
97     WEBCORE_EXPORT void setFooterHeight(int);
98
99     float topContentInset() const { return m_topContentInset; }
100     WEBCORE_EXPORT void setTopContentInset(float);
101
102     // This is a layer moved in the opposite direction to scrolling, for example for background-attachment:fixed
103     const LayerRepresentation& counterScrollingLayer() const { return m_counterScrollingLayer; }
104     WEBCORE_EXPORT void setCounterScrollingLayer(const LayerRepresentation&);
105
106     // This is a clipping layer that will scroll with the page for all y-delta scroll values between 0
107     // and topContentInset(). Once the y-deltas get beyond the content inset point, this layer no longer
108     // needs to move. If the topContentInset() is 0, this layer does not need to move at all. This is
109     // only used on the Mac.
110     const LayerRepresentation& insetClipLayer() const { return m_insetClipLayer; }
111     WEBCORE_EXPORT void setInsetClipLayer(const LayerRepresentation&);
112
113     const LayerRepresentation& contentShadowLayer() const { return m_contentShadowLayer; }
114     WEBCORE_EXPORT void setContentShadowLayer(const LayerRepresentation&);
115
116     // The header and footer layers scroll vertically with the page, they should remain fixed when scrolling horizontally.
117     const LayerRepresentation& headerLayer() const { return m_headerLayer; }
118     WEBCORE_EXPORT void setHeaderLayer(const LayerRepresentation&);
119
120     // The header and footer layers scroll vertically with the page, they should remain fixed when scrolling horizontally.
121     const LayerRepresentation& footerLayer() const { return m_footerLayer; }
122     WEBCORE_EXPORT void setFooterLayer(const LayerRepresentation&);
123
124     const LayerRepresentation& verticalScrollbarLayer() const { return m_verticalScrollbarLayer; }
125     WEBCORE_EXPORT void setVerticalScrollbarLayer(const LayerRepresentation&);
126
127     const LayerRepresentation& horizontalScrollbarLayer() const { return m_horizontalScrollbarLayer; }
128     WEBCORE_EXPORT void setHorizontalScrollbarLayer(const LayerRepresentation&);
129
130     bool fixedElementsLayoutRelativeToFrame() const { return m_fixedElementsLayoutRelativeToFrame; }
131     WEBCORE_EXPORT void setFixedElementsLayoutRelativeToFrame(bool);
132
133     bool visualViewportEnabled() const { return m_visualViewportEnabled; };
134     WEBCORE_EXPORT void setVisualViewportEnabled(bool);
135
136 #if PLATFORM(MAC)
137     NSScrollerImp *verticalScrollerImp() const { return m_verticalScrollerImp.get(); }
138     NSScrollerImp *horizontalScrollerImp() const { return m_horizontalScrollerImp.get(); }
139 #endif
140     void setScrollerImpsFromScrollbars(Scrollbar* verticalScrollbar, Scrollbar* horizontalScrollbar);
141
142     void dumpProperties(WTF::TextStream&, ScrollingStateTreeAsTextBehavior) const override;
143
144 private:
145     ScrollingStateFrameScrollingNode(ScrollingStateTree&, ScrollingNodeType, ScrollingNodeID);
146     ScrollingStateFrameScrollingNode(const ScrollingStateFrameScrollingNode&, ScrollingStateTree&);
147
148     LayerRepresentation m_counterScrollingLayer;
149     LayerRepresentation m_insetClipLayer;
150     LayerRepresentation m_contentShadowLayer;
151     LayerRepresentation m_headerLayer;
152     LayerRepresentation m_footerLayer;
153     LayerRepresentation m_verticalScrollbarLayer;
154     LayerRepresentation m_horizontalScrollbarLayer;
155
156 #if PLATFORM(MAC)
157     RetainPtr<NSScrollerImp> m_verticalScrollerImp;
158     RetainPtr<NSScrollerImp> m_horizontalScrollerImp;
159 #endif
160
161     EventTrackingRegions m_eventTrackingRegions;
162     FloatPoint m_requestedScrollPosition;
163
164     FloatRect m_layoutViewport;
165     FloatPoint m_minLayoutViewportOrigin;
166     FloatPoint m_maxLayoutViewportOrigin;
167
168     float m_frameScaleFactor { 1 };
169     float m_topContentInset { 0 };
170     int m_headerHeight { 0 };
171     int m_footerHeight { 0 };
172     SynchronousScrollingReasons m_synchronousScrollingReasons { 0 };
173     ScrollBehaviorForFixedElements m_behaviorForFixed { StickToDocumentBounds };
174     bool m_requestedScrollPositionRepresentsProgrammaticScroll { false };
175     bool m_fixedElementsLayoutRelativeToFrame { false };
176     bool m_visualViewportEnabled { false };
177 };
178
179 } // namespace WebCore
180
181 SPECIALIZE_TYPE_TRAITS_SCROLLING_STATE_NODE(ScrollingStateFrameScrollingNode, isFrameScrollingNode())
182
183 #endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)