https://bugs.webkit.org/show_bug.cgi?id=99204
[WebKit-https.git] / Source / WebCore / page / scrolling / ScrollingStateScrollingNode.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 ScrollingStateScrollingNode_h
27 #define ScrollingStateScrollingNode_h
28
29 #if ENABLE(THREADED_SCROLLING)
30
31 #include "IntRect.h"
32 #include "Region.h"
33 #include "ScrollTypes.h"
34 #include "ScrollingCoordinator.h"
35 #include "ScrollingStateNode.h"
36 #include <wtf/PassOwnPtr.h>
37
38 namespace WebCore {
39
40 class ScrollingStateScrollingNode : public ScrollingStateNode {
41 public:
42     static PassOwnPtr<ScrollingStateScrollingNode> create(ScrollingStateTree*, ScrollingNodeID);
43     virtual ~ScrollingStateScrollingNode();
44
45     enum ChangedProperty {
46         ViewportRect = 1 << 0,
47         ContentsSize = 1 << 1,
48         NonFastScrollableRegion = 1 << 2,
49         WheelEventHandlerCount = 1 << 3,
50         ShouldUpdateScrollLayerPositionOnMainThread = 1 << 4,
51         HorizontalScrollElasticity = 1 << 5,
52         VerticalScrollElasticity = 1 << 6,
53         HasEnabledHorizontalScrollbar = 1 << 7,
54         HasEnabledVerticalScrollbar = 1 << 8,
55         HorizontalScrollbarMode = 1 << 9,
56         VerticalScrollbarMode = 1 << 10,
57         ScrollOrigin = 1 << 11,
58         RequestedScrollPosition = 1 << 12,
59         All = (1 << 13) - 1 // This will need to be updated if we add or remove anything the ChangedProperties.
60     };
61
62     virtual bool isScrollingStateScrollingNode() OVERRIDE { return true; }
63
64     virtual PassOwnPtr<ScrollingStateNode> cloneAndResetNode() OVERRIDE;
65
66     virtual bool hasChangedProperties() const OVERRIDE { return m_changedProperties; }
67     virtual unsigned changedProperties() const OVERRIDE { return m_changedProperties; }
68     virtual void resetChangedProperties() OVERRIDE { m_changedProperties = 0; }
69     virtual void setHasChangedProperties();
70
71     const IntRect& viewportRect() const { return m_viewportRect; }
72     void setViewportRect(const IntRect&);
73
74     const IntSize& contentsSize() const { return m_contentsSize; }
75     void setContentsSize(const IntSize&);
76
77     const Region& nonFastScrollableRegion() const { return m_nonFastScrollableRegion; }
78     void setNonFastScrollableRegion(const Region&);
79
80     unsigned wheelEventHandlerCount() const { return m_wheelEventHandlerCount; }
81     void setWheelEventHandlerCount(unsigned);
82
83     MainThreadScrollingReasons shouldUpdateScrollLayerPositionOnMainThread() const { return m_shouldUpdateScrollLayerPositionOnMainThread; }
84     void setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons);
85
86     ScrollElasticity horizontalScrollElasticity() const { return m_horizontalScrollElasticity; }
87     void setHorizontalScrollElasticity(ScrollElasticity);
88
89     ScrollElasticity verticalScrollElasticity() const { return m_verticalScrollElasticity; }
90     void setVerticalScrollElasticity(ScrollElasticity);
91
92     bool hasEnabledHorizontalScrollbar() const { return m_hasEnabledHorizontalScrollbar; }
93     void setHasEnabledHorizontalScrollbar(bool);
94
95     bool hasEnabledVerticalScrollbar() const { return m_hasEnabledVerticalScrollbar; }
96     void setHasEnabledVerticalScrollbar(bool);
97
98     ScrollbarMode horizontalScrollbarMode() const { return m_horizontalScrollbarMode; }
99     void setHorizontalScrollbarMode(ScrollbarMode);
100
101     ScrollbarMode verticalScrollbarMode() const { return m_verticalScrollbarMode; }
102     void setVerticalScrollbarMode(ScrollbarMode);
103
104     const IntPoint& requestedScrollPosition() const { return m_requestedScrollPosition; }
105     void setRequestedScrollPosition(const IntPoint&, bool representsProgrammaticScroll);
106
107     const IntPoint& scrollOrigin() const { return m_scrollOrigin; }
108     void setScrollOrigin(const IntPoint&);
109
110     bool requestedScrollPositionRepresentsProgrammaticScroll() const { return m_requestedScrollPositionRepresentsProgrammaticScroll; }
111
112 private:
113     ScrollingStateScrollingNode(ScrollingStateTree*, ScrollingNodeID);
114     ScrollingStateScrollingNode(ScrollingStateScrollingNode*);
115
116     unsigned m_changedProperties;
117
118     IntRect m_viewportRect;
119     IntSize m_contentsSize;
120
121     Region m_nonFastScrollableRegion;
122
123     unsigned m_wheelEventHandlerCount;
124
125     MainThreadScrollingReasons m_shouldUpdateScrollLayerPositionOnMainThread;
126
127     ScrollElasticity m_horizontalScrollElasticity;
128     ScrollElasticity m_verticalScrollElasticity;
129
130     bool m_hasEnabledHorizontalScrollbar;
131     bool m_hasEnabledVerticalScrollbar;
132     bool m_requestedScrollPositionRepresentsProgrammaticScroll;
133
134     ScrollbarMode m_horizontalScrollbarMode;
135     ScrollbarMode m_verticalScrollbarMode;
136
137     IntPoint m_requestedScrollPosition;
138     IntPoint m_scrollOrigin;
139 };
140
141 inline ScrollingStateScrollingNode* toScrollingStateScrollingNode(ScrollingStateNode* node)
142 {
143     ASSERT(!node || node->isScrollingStateScrollingNode());
144     return static_cast<ScrollingStateScrollingNode*>(node);
145 }
146     
147 // This will catch anyone doing an unnecessary cast.
148 void toScrollingStateScrollingNode(const ScrollingStateScrollingNode*);
149
150 } // namespace WebCore
151
152 #endif // ENABLE(THREADED_SCROLLING)
153
154 #endif // ScrollingStateScrollingNode_h