b06cdee9f6b9a951dfebc2c6ebbbcf458498cb4c
[WebKit-https.git] / Source / WebCore / platform / mac / ScrollAnimatorMac.h
1 /*
2  * Copyright (C) 2010, 2011 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 ScrollAnimatorMac_h
27 #define ScrollAnimatorMac_h
28
29 #if ENABLE(SMOOTH_SCROLLING)
30
31 #include "IntRect.h"
32 #include "FloatPoint.h"
33 #include "FloatSize.h"
34 #include "ScrollAnimator.h"
35 #include "ScrollElasticityController.h"
36 #include "Timer.h"
37 #include <wtf/RetainPtr.h>
38
39 OBJC_CLASS WebScrollAnimationHelperDelegate;
40 OBJC_CLASS WebScrollbarPainterControllerDelegate;
41 OBJC_CLASS WebScrollbarPainterDelegate;
42
43 typedef id ScrollbarPainterController;
44
45 #if !ENABLE(RUBBER_BANDING)
46 class ScrollElasticityControllerClient { };
47 #endif
48
49 namespace WebCore {
50
51 class Scrollbar;
52
53 class ScrollAnimatorMac : public ScrollAnimator, private ScrollElasticityControllerClient {
54
55 public:
56     ScrollAnimatorMac(ScrollableArea*);
57     virtual ~ScrollAnimatorMac();
58
59     void immediateScrollToPointForScrollAnimation(const FloatPoint& newPosition);
60     bool haveScrolledSincePageLoad() const { return m_haveScrolledSincePageLoad; }
61
62     void updateScrollerStyle();
63
64     bool scrollbarPaintTimerIsActive() const;
65     void startScrollbarPaintTimer();
66     void stopScrollbarPaintTimer();
67
68     void setVisibleScrollerThumbRect(const IntRect&);
69
70     virtual bool scrollbarsCanBeActive() const override final;
71
72 private:
73     RetainPtr<id> m_scrollAnimationHelper;
74     RetainPtr<WebScrollAnimationHelperDelegate> m_scrollAnimationHelperDelegate;
75
76     RetainPtr<ScrollbarPainterController> m_scrollbarPainterController;
77     RetainPtr<WebScrollbarPainterControllerDelegate> m_scrollbarPainterControllerDelegate;
78     RetainPtr<WebScrollbarPainterDelegate> m_horizontalScrollbarPainterDelegate;
79     RetainPtr<WebScrollbarPainterDelegate> m_verticalScrollbarPainterDelegate;
80
81     void initialScrollbarPaintTimerFired(Timer&);
82     Timer m_initialScrollbarPaintTimer;
83
84     void sendContentAreaScrolledTimerFired(Timer&);
85     Timer m_sendContentAreaScrolledTimer;
86     FloatSize m_contentAreaScrolledTimerScrollDelta;
87
88     virtual bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier);
89     virtual void scrollToOffsetWithoutAnimation(const FloatPoint&);
90
91 #if ENABLE(RUBBER_BANDING)
92     virtual bool handleWheelEvent(const PlatformWheelEvent&) override;
93 #endif
94
95     virtual void handleWheelEventPhase(PlatformWheelEventPhase) override;
96
97     virtual void cancelAnimations();
98     
99     virtual void notifyPositionChanged(const FloatSize& delta);
100     virtual void contentAreaWillPaint() const;
101     virtual void mouseEnteredContentArea() const;
102     virtual void mouseExitedContentArea() const;
103     virtual void mouseMovedInContentArea() const;
104     virtual void mouseEnteredScrollbar(Scrollbar*) const;
105     virtual void mouseExitedScrollbar(Scrollbar*) const;
106     virtual void willStartLiveResize();
107     virtual void contentsResized() const;
108     virtual void willEndLiveResize();
109     virtual void contentAreaDidShow() const;
110     virtual void contentAreaDidHide() const;
111     void didBeginScrollGesture() const;
112     void didEndScrollGesture() const;
113     void mayBeginScrollGesture() const;
114
115     virtual void lockOverlayScrollbarStateToHidden(bool shouldLockState) override final;
116
117     virtual void didAddVerticalScrollbar(Scrollbar*);
118     virtual void willRemoveVerticalScrollbar(Scrollbar*);
119     virtual void didAddHorizontalScrollbar(Scrollbar*);
120     virtual void willRemoveHorizontalScrollbar(Scrollbar*);
121
122     virtual void verticalScrollbarLayerDidChange();
123     virtual void horizontalScrollbarLayerDidChange();
124
125     virtual bool shouldScrollbarParticipateInHitTesting(Scrollbar*);
126
127     virtual void notifyContentAreaScrolled(const FloatSize& delta) override;
128
129     // sendContentAreaScrolledSoon() will do the same work that sendContentAreaScrolled() does except
130     // it does it after a zero-delay timer fires. This will prevent us from updating overlay scrollbar 
131     // information during layout.
132     void sendContentAreaScrolled(const FloatSize& scrollDelta);
133     void sendContentAreaScrolledSoon(const FloatSize& scrollDelta);
134
135     FloatPoint adjustScrollPositionIfNecessary(const FloatPoint&) const;
136
137     void immediateScrollTo(const FloatPoint&);
138
139     virtual bool isRubberBandInProgress() const override;
140
141 #if ENABLE(RUBBER_BANDING)
142     /// ScrollElasticityControllerClient member functions.
143     virtual IntSize stretchAmount() override;
144     virtual bool allowsHorizontalStretching(const PlatformWheelEvent&) override;
145     virtual bool allowsVerticalStretching(const PlatformWheelEvent&) override;
146     virtual bool pinnedInDirection(const FloatSize&) override;
147     virtual bool canScrollHorizontally() override;
148     virtual bool canScrollVertically() override;
149     virtual bool shouldRubberBandInDirection(ScrollDirection) override;
150     virtual WebCore::IntPoint absoluteScrollPosition() override;
151     virtual void immediateScrollByWithoutContentEdgeConstraints(const FloatSize&) override;
152     virtual void immediateScrollBy(const FloatSize&) override;
153     virtual void startSnapRubberbandTimer() override;
154     virtual void stopSnapRubberbandTimer() override;
155     virtual void adjustScrollPositionToBoundsIfNecessary() override;
156
157     bool pinnedInDirection(float deltaX, float deltaY);
158     void snapRubberBandTimerFired(Timer&);
159
160     bool isAlreadyPinnedInDirectionOfGesture(const PlatformWheelEvent&, ScrollEventAxis);
161
162     ScrollElasticityController m_scrollElasticityController;
163     Timer m_snapRubberBandTimer;
164 #endif
165
166     bool m_haveScrolledSincePageLoad;
167     bool m_needsScrollerStyleUpdate;
168     IntRect m_visibleScrollerThumbRect;
169 };
170
171 } // namespace WebCore
172
173 #endif // ENABLE(SMOOTH_SCROLLING)
174
175 #endif // ScrollAnimatorMac_h