1 /*
2 * Copyright (C) 2006 Apple Computer, 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 COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_TYPES_H_
27 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_TYPES_H_
28
29 #include "third_party/blink/public/common/input/web_gesture_event.h"
30 #include "third_party/blink/public/mojom/input/scroll_direction.mojom-blink.h"
31 #include "third_party/blink/public/mojom/scroll/scroll_enums.mojom-blink.h"
32 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
33 #include "third_party/blink/renderer/platform/geometry/float_point.h"
34 #include "third_party/blink/renderer/platform/geometry/float_size.h"
35 #include "third_party/blink/renderer/platform/wtf/assertions.h"
36
37 namespace blink {
38
39 // A ScrollOffset represents an offset from the scroll origin of a
40 // ScrollableArea. Note that "scroll origin" is not the same as the layout
41 // concept of "location", nor is it necessarily coincident with the top/left of
42 // the ScrollableArea's overflow rect. See core/layout/README.md for more
43 // information.
44 typedef FloatSize ScrollOffset;
45
ToScrollOffset(const FloatPoint & p)46 inline ScrollOffset ToScrollOffset(const FloatPoint& p) {
47 return ScrollOffset(p.X(), p.Y());
48 }
49
ToScrollOffset(const gfx::PointF & p)50 inline ScrollOffset ToScrollOffset(const gfx::PointF& p) {
51 return ScrollOffset(p.x(), p.y());
52 }
53
54 using ui::ScrollGranularity;
55
56 enum ScrollDirectionPhysical {
57 kScrollUp,
58 kScrollDown,
59 kScrollLeft,
60 kScrollRight
61 };
62
63 // An explicit scroll is one that was requested by the user or the webpage.
64 // An implicit scroll is a side effect of a layout change.
IsExplicitScrollType(mojom::blink::ScrollType scroll_type)65 inline bool IsExplicitScrollType(mojom::blink::ScrollType scroll_type) {
66 return scroll_type == mojom::blink::ScrollType::kUser ||
67 scroll_type == mojom::blink::ScrollType::kProgrammatic ||
68 scroll_type == mojom::blink::ScrollType::kCompositor ||
69 scroll_type == mojom::blink::ScrollType::kSequenced;
70 }
71
72 // Convert logical scroll direction to physical. Physical scroll directions are
73 // unaffected.
ToPhysicalDirection(mojom::blink::ScrollDirection direction,bool is_vertical,bool is_flipped)74 inline ScrollDirectionPhysical ToPhysicalDirection(
75 mojom::blink::ScrollDirection direction,
76 bool is_vertical,
77 bool is_flipped) {
78 switch (direction) {
79 case mojom::blink::ScrollDirection::kScrollBlockDirectionBackward: {
80 if (is_vertical) {
81 if (!is_flipped)
82 return kScrollUp;
83 return kScrollDown;
84 }
85 if (!is_flipped)
86 return kScrollLeft;
87 return kScrollRight;
88 }
89 case mojom::blink::ScrollDirection::kScrollBlockDirectionForward: {
90 if (is_vertical) {
91 if (!is_flipped)
92 return kScrollDown;
93 return kScrollUp;
94 }
95 if (!is_flipped)
96 return kScrollRight;
97 return kScrollLeft;
98 }
99 case mojom::blink::ScrollDirection::kScrollInlineDirectionBackward: {
100 if (is_vertical) {
101 if (!is_flipped)
102 return kScrollLeft;
103 return kScrollRight;
104 }
105 if (!is_flipped)
106 return kScrollUp;
107 return kScrollDown;
108 }
109 case mojom::blink::ScrollDirection::kScrollInlineDirectionForward: {
110 if (is_vertical) {
111 if (!is_flipped)
112 return kScrollRight;
113 return kScrollLeft;
114 }
115 if (!is_flipped)
116 return kScrollDown;
117 return kScrollUp;
118 }
119 // Direction is already physical
120 case mojom::blink::ScrollDirection::kScrollUpIgnoringWritingMode:
121 return kScrollUp;
122 case mojom::blink::ScrollDirection::kScrollDownIgnoringWritingMode:
123 return kScrollDown;
124 case mojom::blink::ScrollDirection::kScrollLeftIgnoringWritingMode:
125 return kScrollLeft;
126 case mojom::blink::ScrollDirection::kScrollRightIgnoringWritingMode:
127 return kScrollRight;
128 default:
129 NOTREACHED();
130 break;
131 }
132 return kScrollUp;
133 }
134
ToScrollDirection(ScrollDirectionPhysical direction)135 inline mojom::blink::ScrollDirection ToScrollDirection(
136 ScrollDirectionPhysical direction) {
137 switch (direction) {
138 case kScrollUp:
139 return mojom::blink::ScrollDirection::kScrollUpIgnoringWritingMode;
140 case kScrollDown:
141 return mojom::blink::ScrollDirection::kScrollDownIgnoringWritingMode;
142 case kScrollLeft:
143 return mojom::blink::ScrollDirection::kScrollLeftIgnoringWritingMode;
144 case kScrollRight:
145 return mojom::blink::ScrollDirection::kScrollRightIgnoringWritingMode;
146 default:
147 NOTREACHED();
148 break;
149 }
150 return mojom::blink::ScrollDirection::kScrollUpIgnoringWritingMode;
151 }
152
153 enum ScrollInertialPhase {
154 kScrollInertialPhaseUnknown,
155 kScrollInertialPhaseNonMomentum,
156 kScrollInertialPhaseMomentum
157 };
158
159 enum ScrollbarOrientation { kHorizontalScrollbar, kVerticalScrollbar };
160
161 enum ScrollOrientation { kHorizontalScroll, kVerticalScroll };
162
163 enum ScrollbarControlSize { kRegularScrollbar, kSmallScrollbar };
164
165 typedef unsigned ScrollbarControlState;
166
167 enum ScrollbarControlStateMask {
168 kActiveScrollbarState = 1,
169 kEnabledScrollbarState = 1 << 1,
170 kPressedScrollbarState = 1 << 2
171 };
172
173 enum ScrollbarPart {
174 kNoPart = 0,
175 kBackButtonStartPart = 1,
176 kForwardButtonStartPart = 1 << 1, // For custom scrollbars only.
177 kBackTrackPart = 1 << 2,
178 kThumbPart = 1 << 3,
179 kForwardTrackPart = 1 << 4,
180 kBackButtonEndPart = 1 << 5, // For custom scrollbars only.
181 kForwardButtonEndPart = 1 << 6,
182 kScrollbarBGPart = 1 << 7, // For custom scrollbars only.
183 kTrackBGPart = 1 << 8,
184 kAllParts = 0xffffffff
185 };
186
187 enum ScrollbarOverlayColorTheme {
188 kScrollbarOverlayColorThemeDark,
189 kScrollbarOverlayColorThemeLight
190 };
191
192 // The result of an attempt to scroll. If didScroll is true, then
193 // unusedScrollDelta gives the amount of the scroll delta that was not consumed
194 // by scrolling.
195 struct ScrollResult {
196 STACK_ALLOCATED();
197
198 public:
ScrollResultScrollResult199 explicit ScrollResult()
200 : did_scroll_x(false),
201 did_scroll_y(false),
202 unused_scroll_delta_x(0),
203 unused_scroll_delta_y(0) {}
ScrollResultScrollResult204 ScrollResult(bool did_scroll_x,
205 bool did_scroll_y,
206 float unused_scroll_delta_x,
207 float unused_scroll_delta_y)
208 : did_scroll_x(did_scroll_x),
209 did_scroll_y(did_scroll_y),
210 unused_scroll_delta_x(unused_scroll_delta_x),
211 unused_scroll_delta_y(unused_scroll_delta_y) {}
212
DidScrollScrollResult213 bool DidScroll() { return did_scroll_x || did_scroll_y; }
214
215 bool did_scroll_x;
216 bool did_scroll_y;
217
218 // In pixels.
219 float unused_scroll_delta_x;
220 float unused_scroll_delta_y;
221 };
222
ToScrollDelta(ScrollbarOrientation orientation,float delta)223 inline ScrollOffset ToScrollDelta(ScrollbarOrientation orientation,
224 float delta) {
225 return orientation == kHorizontalScrollbar ? ScrollOffset(delta, 0.0f)
226 : ScrollOffset(0.0f, delta);
227 }
228
ToScrollDelta(ScrollDirectionPhysical dir,float delta)229 inline ScrollOffset ToScrollDelta(ScrollDirectionPhysical dir, float delta) {
230 if (dir == kScrollUp || dir == kScrollLeft)
231 delta = -delta;
232
233 return (dir == kScrollLeft || dir == kScrollRight) ? ScrollOffset(delta, 0)
234 : ScrollOffset(0, delta);
235 }
236
237 } // namespace blink
238
239 #endif // THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_TYPES_H_
240