Expand test infrastructure to support scrolling tests
[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 "FloatSize.h"
36 #include "LayoutUnit.h"
37 #include "PlatformWheelEvent.h"
38 #include "ScrollTypes.h"
39 #include "WheelEventTestTrigger.h"
40 #include <wtf/FastMalloc.h>
41 #include <wtf/Forward.h>
42
43 #if (ENABLE(RUBBER_BANDING) || ENABLE(CSS_SCROLL_SNAP)) && PLATFORM(MAC)
44 #include "ScrollController.h"
45 #endif
46
47 namespace WebCore {
48
49 class FloatPoint;
50 class PlatformTouchEvent;
51 class ScrollableArea;
52 class Scrollbar;
53 class WheelEventTestTrigger;
54
55 #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) && PLATFORM(MAC)
56 class ScrollAnimator : private ScrollControllerClient {
57 #else
58 class ScrollAnimator {
59 #endif
60     WTF_MAKE_FAST_ALLOCATED;
61 public:
62     static std::unique_ptr<ScrollAnimator> create(ScrollableArea&);
63
64     explicit ScrollAnimator(ScrollableArea&);
65     virtual ~ScrollAnimator();
66
67     // Computes a scroll destination for the given parameters.  Returns false if
68     // already at the destination.  Otherwise, starts scrolling towards the
69     // destination and returns true.  Scrolling may be immediate or animated.
70     // The base class implementation always scrolls immediately, never animates.
71     virtual bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier);
72
73     virtual void scrollToOffsetWithoutAnimation(const FloatPoint&);
74
75     ScrollableArea& scrollableArea() const { return m_scrollableArea; }
76
77     virtual bool handleWheelEvent(const PlatformWheelEvent&);
78
79 #if ENABLE(TOUCH_EVENTS)
80     virtual bool handleTouchEvent(const PlatformTouchEvent&);
81 #endif
82
83 #if PLATFORM(COCOA)
84     virtual void handleWheelEventPhase(PlatformWheelEventPhase) { }
85 #endif
86
87     void setCurrentPosition(const FloatPoint&);
88     FloatPoint currentPosition() const;
89
90     virtual void cancelAnimations() { }
91     virtual void serviceScrollAnimations() { }
92
93     virtual void contentAreaWillPaint() const { }
94     virtual void mouseEnteredContentArea() const { }
95     virtual void mouseExitedContentArea() const { }
96     virtual void mouseMovedInContentArea() const { }
97     virtual void mouseEnteredScrollbar(Scrollbar*) const { }
98     virtual void mouseExitedScrollbar(Scrollbar*) const { }
99     virtual void willStartLiveResize() { }
100     virtual void contentsResized() const { }
101     virtual void willEndLiveResize() { }
102     virtual void contentAreaDidShow() const { }
103     virtual void contentAreaDidHide() const { }
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 verticalScrollbarLayerDidChange() { }
114     virtual void horizontalScrollbarLayerDidChange() { }
115
116     virtual bool shouldScrollbarParticipateInHitTesting(Scrollbar*) { return true; }
117
118     virtual void notifyContentAreaScrolled(const FloatSize& delta) { UNUSED_PARAM(delta); }
119
120     virtual bool isRubberBandInProgress() const { return false; }
121
122     void setWheelEventTestTrigger(RefPtr<WheelEventTestTrigger>&& testTrigger) { m_wheelEventTestTrigger = testTrigger; }
123 #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) && PLATFORM(MAC)
124     WheelEventTestTrigger* testTrigger() const override { return m_wheelEventTestTrigger.get(); }
125 #endif
126     
127 #if ENABLE(CSS_SCROLL_SNAP) && PLATFORM(MAC)
128     bool processWheelEventForScrollSnap(const PlatformWheelEvent&);
129     void updateScrollAnimatorsAndTimers();
130     LayoutUnit scrollOffsetOnAxis(ScrollEventAxis) const override;
131     void immediateScrollOnAxis(ScrollEventAxis, float delta) override;
132 #endif
133
134 protected:
135     virtual void notifyPositionChanged(const FloatSize& delta);
136
137     ScrollableArea& m_scrollableArea;
138     RefPtr<WheelEventTestTrigger> m_wheelEventTestTrigger;
139 #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) && PLATFORM(MAC)
140     ScrollController m_scrollController;
141 #endif
142     float m_currentPosX; // We avoid using a FloatPoint in order to reduce
143     float m_currentPosY; // subclass code complexity.
144 };
145
146 } // namespace WebCore
147
148 #endif // ScrollAnimator_h