[css-grid] Prevent grid-template-rows from serializing adjacent <line-names>
[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 #pragma once
33
34 #include "FloatPoint.h"
35 #include "PlatformWheelEvent.h"
36 #include "ScrollTypes.h"
37 #include "WheelEventTestMonitor.h"
38 #include <wtf/FastMalloc.h>
39 #include <wtf/Forward.h>
40
41 #if ENABLE(RUBBER_BANDING) || ENABLE(CSS_SCROLL_SNAP)
42 #include "ScrollController.h"
43 #endif
44
45 namespace WebCore {
46
47 class FloatPoint;
48 class PlatformTouchEvent;
49 class ScrollAnimation;
50 class ScrollableArea;
51 class Scrollbar;
52 class WheelEventTestMonitor;
53
54 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
55 class ScrollControllerTimer;
56 #endif
57
58 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
59 class ScrollAnimator : private ScrollControllerClient {
60 #else
61 class ScrollAnimator {
62 #endif
63     WTF_MAKE_FAST_ALLOCATED;
64 public:
65     static std::unique_ptr<ScrollAnimator> create(ScrollableArea&);
66
67     explicit ScrollAnimator(ScrollableArea&);
68     virtual ~ScrollAnimator();
69
70     // Computes a scroll destination for the given parameters.  Returns false if
71     // already at the destination.  Otherwise, starts scrolling towards the
72     // destination and returns true.  Scrolling may be immediate or animated.
73     // The base class implementation always scrolls immediately, never animates.
74     virtual bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier);
75
76     void scrollToOffset(const FloatPoint&);
77     virtual void scrollToOffsetWithoutAnimation(const FloatPoint&, ScrollClamping = ScrollClamping::Clamped);
78
79     ScrollableArea& scrollableArea() const { return m_scrollableArea; }
80
81     virtual bool handleWheelEvent(const PlatformWheelEvent&);
82
83 #if ENABLE(TOUCH_EVENTS)
84     virtual bool handleTouchEvent(const PlatformTouchEvent&);
85 #endif
86
87 #if PLATFORM(COCOA)
88     virtual void handleWheelEventPhase(PlatformWheelEventPhase) { }
89 #endif
90
91     void setCurrentPosition(const FloatPoint&);
92     const FloatPoint& currentPosition() const { return m_currentPosition; }
93
94     virtual void cancelAnimations();
95     virtual void serviceScrollAnimations();
96
97     virtual void contentAreaWillPaint() const { }
98     virtual void mouseEnteredContentArea() { }
99     virtual void mouseExitedContentArea() { }
100     virtual void mouseMovedInContentArea() { }
101     virtual void mouseEnteredScrollbar(Scrollbar*) const { }
102     virtual void mouseExitedScrollbar(Scrollbar*) const { }
103     virtual void mouseIsDownInScrollbar(Scrollbar*, bool) const { }
104     virtual void willStartLiveResize() { }
105     virtual void contentsResized() const { }
106     virtual void willEndLiveResize();
107     virtual void contentAreaDidShow() { }
108     virtual void contentAreaDidHide() { }
109
110     virtual void lockOverlayScrollbarStateToHidden(bool) { }
111     virtual bool scrollbarsCanBeActive() const { return true; }
112
113     virtual void didAddVerticalScrollbar(Scrollbar*);
114     virtual void willRemoveVerticalScrollbar(Scrollbar*) { }
115     virtual void didAddHorizontalScrollbar(Scrollbar*);
116     virtual void willRemoveHorizontalScrollbar(Scrollbar*) { }
117
118     virtual void invalidateScrollbarPartLayers(Scrollbar*) { }
119
120     virtual void verticalScrollbarLayerDidChange() { }
121     virtual void horizontalScrollbarLayerDidChange() { }
122
123     virtual bool shouldScrollbarParticipateInHitTesting(Scrollbar*) { return true; }
124
125     virtual void notifyContentAreaScrolled(const FloatSize& delta) { UNUSED_PARAM(delta); }
126
127     virtual bool isRubberBandInProgress() const { return false; }
128     virtual bool isScrollSnapInProgress() const { return false; }
129
130     virtual String horizontalScrollbarStateForTesting() const { return emptyString(); }
131     virtual String verticalScrollbarStateForTesting() const { return emptyString(); }
132
133     void setWheelEventTestMonitor(RefPtr<WheelEventTestMonitor>&& testMonitor) { m_wheelEventTestMonitor = testMonitor; }
134
135 #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) && PLATFORM(MAC)
136     void deferWheelEventTestCompletionForReason(WheelEventTestMonitor::ScrollableAreaIdentifier, WheelEventTestMonitor::DeferReason) const override;
137     void removeWheelEventTestCompletionDeferralForReason(WheelEventTestMonitor::ScrollableAreaIdentifier, WheelEventTestMonitor::DeferReason) const override;
138 #endif
139
140 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
141     std::unique_ptr<ScrollControllerTimer> createTimer(Function<void()>&&) final;
142 #endif
143
144 #if ENABLE(CSS_SCROLL_SNAP)
145 #if PLATFORM(MAC)
146     bool processWheelEventForScrollSnap(const PlatformWheelEvent&);
147 #endif
148     void updateScrollSnapState();
149     FloatPoint scrollOffset() const override;
150     void immediateScrollOnAxis(ScrollEventAxis, float delta) override;
151     bool activeScrollSnapIndexDidChange() const;
152     unsigned activeScrollSnapIndexForAxis(ScrollEventAxis) const;
153     LayoutSize scrollExtent() const override;
154     FloatSize viewportSize() const override;
155 #endif
156
157 protected:
158     virtual void notifyPositionChanged(const FloatSize& delta);
159     void updateActiveScrollSnapIndexForOffset();
160
161     ScrollableArea& m_scrollableArea;
162     RefPtr<WheelEventTestMonitor> m_wheelEventTestMonitor;
163 #if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
164     ScrollController m_scrollController;
165 #endif
166     FloatPoint m_currentPosition;
167
168     std::unique_ptr<ScrollAnimation> m_animationProgrammaticScroll;
169 };
170
171 } // namespace WebCore
172