d7c73dbdda613afe25fd4ae6c707455e5826795f
[WebKit-https.git] / Source / WebCore / platform / ScrollAnimator.h
1 /*
2  * Copyright (c) 2010, Google Inc. All rights reserved.
3  * Copyright (C) 2015 Apple Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  * 
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  * 
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef ScrollAnimator_h
33 #define ScrollAnimator_h
34
35 #include "FloatPoint.h"
36 #include "PlatformWheelEvent.h"
37 #include "ScrollTypes.h"
38 #include "WheelEventTestTrigger.h"
39 #include <wtf/FastMalloc.h>
40 #include <wtf/Forward.h>
41
42 #if ENABLE(RUBBER_BANDING) || ENABLE(CSS_SCROLL_SNAP)
43 #include "ScrollController.h"
44 #endif
45
46 namespace WebCore {
47
48 class FloatPoint;
49 class PlatformTouchEvent;
50 class ScrollableArea;
51 class Scrollbar;
52 class WheelEventTestTrigger;
53
54 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
55 class ScrollAnimator : private ScrollControllerClient {
56 #else
57 class ScrollAnimator {
58 #endif
59     WTF_MAKE_FAST_ALLOCATED;
60 public:
61     static std::unique_ptr<ScrollAnimator> create(ScrollableArea&);
62
63     explicit ScrollAnimator(ScrollableArea&);
64     virtual ~ScrollAnimator();
65
66     // Computes a scroll destination for the given parameters.  Returns false if
67     // already at the destination.  Otherwise, starts scrolling towards the
68     // destination and returns true.  Scrolling may be immediate or animated.
69     // The base class implementation always scrolls immediately, never animates.
70     virtual bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier);
71
72     virtual void scrollToOffsetWithoutAnimation(const FloatPoint&);
73
74     ScrollableArea& scrollableArea() const { return m_scrollableArea; }
75
76     virtual bool handleWheelEvent(const PlatformWheelEvent&);
77
78 #if ENABLE(TOUCH_EVENTS)
79     virtual bool handleTouchEvent(const PlatformTouchEvent&);
80 #endif
81
82 #if PLATFORM(COCOA)
83     virtual void handleWheelEventPhase(PlatformWheelEventPhase) { }
84 #endif
85
86     void setCurrentPosition(const FloatPoint&);
87     const FloatPoint& currentPosition() const { return m_currentPosition; }
88
89     virtual void cancelAnimations() { }
90     virtual void serviceScrollAnimations() { }
91
92     virtual void contentAreaWillPaint() const { }
93     virtual void mouseEnteredContentArea() { }
94     virtual void mouseExitedContentArea() { }
95     virtual void mouseMovedInContentArea() { }
96     virtual void mouseEnteredScrollbar(Scrollbar*) const { }
97     virtual void mouseExitedScrollbar(Scrollbar*) const { }
98     virtual void mouseIsDownInScrollbar(Scrollbar*, bool) const { }
99     virtual void willStartLiveResize() { }
100     virtual void contentsResized() const { }
101     virtual void willEndLiveResize() { }
102     virtual void contentAreaDidShow() { }
103     virtual void contentAreaDidHide() { }
104
105     virtual void lockOverlayScrollbarStateToHidden(bool) { }
106     virtual bool scrollbarsCanBeActive() const { return true; }
107
108     virtual void didAddVerticalScrollbar(Scrollbar*) { }
109     virtual void willRemoveVerticalScrollbar(Scrollbar*) { }
110     virtual void didAddHorizontalScrollbar(Scrollbar*) { }
111     virtual void willRemoveHorizontalScrollbar(Scrollbar*) { }
112
113     virtual void invalidateScrollbarPartLayers(Scrollbar*) { }
114
115     virtual void verticalScrollbarLayerDidChange() { }
116     virtual void horizontalScrollbarLayerDidChange() { }
117
118     virtual bool shouldScrollbarParticipateInHitTesting(Scrollbar*) { return true; }
119
120     virtual void notifyContentAreaScrolled(const FloatSize& delta) { UNUSED_PARAM(delta); }
121
122     virtual bool isRubberBandInProgress() const { return false; }
123     virtual bool isScrollSnapInProgress() const { return false; }
124
125     void setWheelEventTestTrigger(RefPtr<WheelEventTestTrigger>&& testTrigger) { m_wheelEventTestTrigger = testTrigger; }
126 #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) && PLATFORM(MAC)
127     void deferTestsForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const override;
128     void removeTestDeferralForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const override;
129 #endif
130     
131 #if ENABLE(CSS_SCROLL_SNAP)
132 #if PLATFORM(MAC)
133     bool processWheelEventForScrollSnap(const PlatformWheelEvent&);
134 #endif
135     void updateScrollSnapState();
136     FloatPoint scrollOffset() const override;
137     void immediateScrollOnAxis(ScrollEventAxis, float delta) override;
138     bool activeScrollSnapIndexDidChange() const;
139     unsigned activeScrollSnapIndexForAxis(ScrollEventAxis) const;
140     LayoutSize scrollExtent() const override;
141     FloatSize viewportSize() const override;
142 #endif
143
144 protected:
145     virtual void notifyPositionChanged(const FloatSize& delta);
146     void updateActiveScrollSnapIndexForOffset();
147
148     ScrollableArea& m_scrollableArea;
149     RefPtr<WheelEventTestTrigger> m_wheelEventTestTrigger;
150 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
151     ScrollController m_scrollController;
152 #endif
153     FloatPoint m_currentPosition;
154 };
155
156 } // namespace WebCore
157
158 #endif // ScrollAnimator_h