6cda1bc5060bd0f868822ea5187d6c85ad7c0028
[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&, 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         PainterForScrollbar,
61         BehaviorForFixedElements,
62         TopContentInset,
63         FixedElementsLayoutRelativeToFrame,
64     };
65
66     float frameScaleFactor() const { return m_frameScaleFactor; }
67     WEBCORE_EXPORT void setFrameScaleFactor(float);
68
69     const EventTrackingRegions& eventTrackingRegions() const { return m_eventTrackingRegions; }
70     WEBCORE_EXPORT void setEventTrackingRegions(const EventTrackingRegions&);
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     bool fixedElementsLayoutRelativeToFrame() const { return m_fixedElementsLayoutRelativeToFrame; }
113     WEBCORE_EXPORT void setFixedElementsLayoutRelativeToFrame(bool);
114
115 #if PLATFORM(MAC)
116     NSScrollerImp *verticalScrollerImp() const { return m_verticalScrollerImp.get(); }
117     NSScrollerImp *horizontalScrollerImp() const { return m_horizontalScrollerImp.get(); }
118 #endif
119     void setScrollerImpsFromScrollbars(Scrollbar* verticalScrollbar, Scrollbar* horizontalScrollbar);
120
121     void dumpProperties(TextStream&, int indent, ScrollingStateTreeAsTextBehavior) const override;
122
123 private:
124     ScrollingStateFrameScrollingNode(ScrollingStateTree&, ScrollingNodeID);
125     ScrollingStateFrameScrollingNode(const ScrollingStateFrameScrollingNode&, ScrollingStateTree&);
126
127     LayerRepresentation m_counterScrollingLayer;
128     LayerRepresentation m_insetClipLayer;
129     LayerRepresentation m_scrolledContentsLayer;
130     LayerRepresentation m_contentShadowLayer;
131     LayerRepresentation m_headerLayer;
132     LayerRepresentation m_footerLayer;
133
134 #if PLATFORM(MAC)
135     RetainPtr<NSScrollerImp> m_verticalScrollerImp;
136     RetainPtr<NSScrollerImp> m_horizontalScrollerImp;
137 #endif
138
139     EventTrackingRegions m_eventTrackingRegions;
140     FloatPoint m_requestedScrollPosition;
141     float m_frameScaleFactor { 1 };
142     float m_topContentInset { 0 };
143     int m_headerHeight { 0 };
144     int m_footerHeight { 0 };
145     SynchronousScrollingReasons m_synchronousScrollingReasons { 0 };
146     ScrollBehaviorForFixedElements m_behaviorForFixed { StickToDocumentBounds };
147     bool m_requestedScrollPositionRepresentsProgrammaticScroll { false };
148     bool m_fixedElementsLayoutRelativeToFrame { false };
149 };
150
151 } // namespace WebCore
152
153 SPECIALIZE_TYPE_TRAITS_SCROLLING_STATE_NODE(ScrollingStateFrameScrollingNode, isFrameScrollingNode())
154
155 #endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)