1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef ScrollbarStyles_h
8 #define ScrollbarStyles_h
9 
10 #include <stdint.h>
11 #include "nsStyleConsts.h"  // for NS_STYLE_SCROLL_SNAP_*
12 #include "nsStyleCoord.h"   // for nsStyleCoord
13 #include "mozilla/dom/WindowBinding.h"
14 
15 // Forward declarations
16 struct nsStyleDisplay;
17 
18 namespace mozilla {
19 
20 struct ScrollbarStyles {
21   // Always one of NS_STYLE_OVERFLOW_SCROLL, NS_STYLE_OVERFLOW_HIDDEN,
22   // or NS_STYLE_OVERFLOW_AUTO.
23   uint8_t mHorizontal;
24   uint8_t mVertical;
25   // Always one of NS_STYLE_SCROLL_BEHAVIOR_AUTO or
26   // NS_STYLE_SCROLL_BEHAVIOR_SMOOTH
27   uint8_t mScrollBehavior;
28   mozilla::StyleOverscrollBehavior mOverscrollBehaviorX;
29   mozilla::StyleOverscrollBehavior mOverscrollBehaviorY;
30   // Always one of NS_STYLE_SCROLL_SNAP_NONE, NS_STYLE_SCROLL_SNAP_MANDATORY,
31   // or NS_STYLE_SCROLL_SNAP_PROXIMITY.
32   uint8_t mScrollSnapTypeX;
33   uint8_t mScrollSnapTypeY;
34   nsStyleCoord mScrollSnapPointsX;
35   nsStyleCoord mScrollSnapPointsY;
36   nsStyleCoord::CalcValue mScrollSnapDestinationX;
37   nsStyleCoord::CalcValue mScrollSnapDestinationY;
38 
ScrollbarStylesScrollbarStyles39   ScrollbarStyles(uint8_t aH, uint8_t aV)
40       : mHorizontal(aH),
41         mVertical(aV),
42         mScrollBehavior(NS_STYLE_SCROLL_BEHAVIOR_AUTO),
43         mOverscrollBehaviorX(StyleOverscrollBehavior::Auto),
44         mOverscrollBehaviorY(StyleOverscrollBehavior::Auto),
45         mScrollSnapTypeX(NS_STYLE_SCROLL_SNAP_TYPE_NONE),
46         mScrollSnapTypeY(NS_STYLE_SCROLL_SNAP_TYPE_NONE),
47         mScrollSnapPointsX(nsStyleCoord(eStyleUnit_None)),
48         mScrollSnapPointsY(nsStyleCoord(eStyleUnit_None)) {
49     mScrollSnapDestinationX.mPercent = 0;
50     mScrollSnapDestinationX.mLength = nscoord(0.0f);
51     mScrollSnapDestinationX.mHasPercent = false;
52     mScrollSnapDestinationY.mPercent = 0;
53     mScrollSnapDestinationY.mLength = nscoord(0.0f);
54     mScrollSnapDestinationY.mHasPercent = false;
55   }
56 
57   explicit ScrollbarStyles(const nsStyleDisplay* aDisplay);
58   ScrollbarStyles(uint8_t aH, uint8_t aV, const nsStyleDisplay* aDisplay);
59   bool operator==(const ScrollbarStyles& aStyles) const {
60     return aStyles.mHorizontal == mHorizontal &&
61            aStyles.mVertical == mVertical &&
62            aStyles.mScrollBehavior == mScrollBehavior &&
63            aStyles.mOverscrollBehaviorX == mOverscrollBehaviorX &&
64            aStyles.mOverscrollBehaviorY == mOverscrollBehaviorY &&
65            aStyles.mScrollSnapTypeX == mScrollSnapTypeX &&
66            aStyles.mScrollSnapTypeY == mScrollSnapTypeY &&
67            aStyles.mScrollSnapPointsX == mScrollSnapPointsX &&
68            aStyles.mScrollSnapPointsY == mScrollSnapPointsY &&
69            aStyles.mScrollSnapDestinationX == mScrollSnapDestinationX &&
70            aStyles.mScrollSnapDestinationY == mScrollSnapDestinationY;
71   }
72   bool operator!=(const ScrollbarStyles& aStyles) const {
73     return !(*this == aStyles);
74   }
IsHiddenInBothDirectionsScrollbarStyles75   bool IsHiddenInBothDirections() const {
76     return mHorizontal == NS_STYLE_OVERFLOW_HIDDEN &&
77            mVertical == NS_STYLE_OVERFLOW_HIDDEN;
78   }
IsSmoothScrollScrollbarStyles79   bool IsSmoothScroll(dom::ScrollBehavior aBehavior) const {
80     return aBehavior == dom::ScrollBehavior::Smooth ||
81            (aBehavior == dom::ScrollBehavior::Auto &&
82             mScrollBehavior == NS_STYLE_SCROLL_BEHAVIOR_SMOOTH);
83   }
84 };
85 
86 }  // namespace mozilla
87 
88 #endif
89