File: ScrollbarsController.h

package info (click to toggle)
webkit2gtk 2.51.91-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 484,084 kB
  • sloc: cpp: 3,931,583; javascript: 197,713; ansic: 167,619; python: 53,160; asm: 21,857; ruby: 18,114; perl: 17,149; xml: 4,631; sh: 2,462; yacc: 2,394; java: 2,032; lex: 1,358; pascal: 372; makefile: 215
file content (139 lines) | stat: -rw-r--r-- 6,503 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * Copyright (C) 2021 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#include <WebCore/FloatPoint.h>
#include <WebCore/FloatSize.h>
#include <WebCore/UserInterfaceLayoutDirection.h>
#include <wtf/TZoneMalloc.h>
#include <wtf/WeakHashSet.h>
#include <wtf/text/WTFString.h>

namespace WebCore {

class Scrollbar;
class ScrollableArea;
enum class ScrollbarOrientation : uint8_t;
enum class ScrollbarWidth : uint8_t;

struct ScrollbarColor;

class ScrollbarsController {
    WTF_MAKE_TZONE_ALLOCATED_EXPORT(ScrollbarsController, WEBCORE_EXPORT);
    WTF_MAKE_NONCOPYABLE(ScrollbarsController);
public:
    WEBCORE_EXPORT static std::unique_ptr<ScrollbarsController> create(ScrollableArea&);

    WEBCORE_EXPORT explicit ScrollbarsController(ScrollableArea&);
    WEBCORE_EXPORT virtual ~ScrollbarsController();
    
    inline ScrollableArea& scrollableArea() const; // Defined in ScrollbarsControllerInlines.h
    inline CheckedRef<ScrollableArea> checkedScrollableArea() const; // Defined in ScrollbarsControllerInlines.h

    bool scrollbarAnimationsUnsuspendedByUserInteraction() const { return m_scrollbarAnimationsUnsuspendedByUserInteraction; }
    void setScrollbarAnimationsUnsuspendedByUserInteraction(bool unsuspended) { m_scrollbarAnimationsUnsuspendedByUserInteraction = unsuspended; }

#if PLATFORM(MAC)
    WEBCORE_EXPORT virtual bool isRemoteScrollbarsController() const { return false; }
#elif USE(COORDINATED_GRAPHICS_ASYNC_SCROLLBAR)
    virtual bool isScrollbarsControllerCoordinated() const { return false; }
#endif
    WEBCORE_EXPORT virtual bool isScrollbarsControllerMac() const { return false; }
    WEBCORE_EXPORT virtual bool isScrollbarsControllerMock() const { return false; }

    bool shouldSuspendScrollbarAnimations() const;

    virtual void notifyContentAreaScrolled(const FloatSize&) { }

    WEBCORE_EXPORT virtual void cancelAnimations();

    WEBCORE_EXPORT virtual void didBeginScrollGesture();
    WEBCORE_EXPORT virtual void didEndScrollGesture();
    WEBCORE_EXPORT virtual void mayBeginScrollGesture();

    WEBCORE_EXPORT virtual void contentAreaWillPaint() const { }
    WEBCORE_EXPORT virtual void mouseEnteredContentArea() { }
    WEBCORE_EXPORT virtual void mouseExitedContentArea() { }
    WEBCORE_EXPORT virtual void mouseMovedInContentArea() { }
    WEBCORE_EXPORT virtual void mouseEnteredScrollbar(Scrollbar*) const { }
    WEBCORE_EXPORT virtual void mouseExitedScrollbar(Scrollbar*) const { }
    WEBCORE_EXPORT virtual void mouseIsDownInScrollbar(Scrollbar*, bool) const { }
#if USE(COORDINATED_GRAPHICS_ASYNC_SCROLLBAR)
    void virtual hoveredPartChanged(Scrollbar&) { }
    void virtual pressedPartChanged(Scrollbar&) { }
#endif
    WEBCORE_EXPORT virtual void willStartLiveResize() { }
    WEBCORE_EXPORT virtual void contentsSizeChanged() const { }
    WEBCORE_EXPORT virtual void willEndLiveResize() { }
    WEBCORE_EXPORT virtual void contentAreaDidShow() { }
    WEBCORE_EXPORT virtual void contentAreaDidHide() { }

    WEBCORE_EXPORT virtual void lockOverlayScrollbarStateToHidden(bool) { }
    WEBCORE_EXPORT virtual bool scrollbarsCanBeActive() const { return true; }

    WEBCORE_EXPORT virtual void didAddVerticalScrollbar(Scrollbar*) { }
    WEBCORE_EXPORT virtual void willRemoveVerticalScrollbar(Scrollbar*) { }
    WEBCORE_EXPORT virtual void didAddHorizontalScrollbar(Scrollbar*) { }
    WEBCORE_EXPORT virtual void willRemoveHorizontalScrollbar(Scrollbar*) { }

    WEBCORE_EXPORT virtual void invalidateScrollbarPartLayers(Scrollbar*) { }

    WEBCORE_EXPORT virtual void verticalScrollbarLayerDidChange() { }
    WEBCORE_EXPORT virtual void horizontalScrollbarLayerDidChange() { }

    WEBCORE_EXPORT virtual bool shouldScrollbarParticipateInHitTesting(Scrollbar*) { return true; }

    WEBCORE_EXPORT virtual String horizontalScrollbarStateForTesting() const { return emptyString(); }
    WEBCORE_EXPORT virtual String verticalScrollbarStateForTesting() const { return emptyString(); }

    WEBCORE_EXPORT virtual void setScrollbarVisibilityState(ScrollbarOrientation, bool) { }

    WEBCORE_EXPORT virtual bool shouldDrawIntoScrollbarLayer(Scrollbar&) const { return true; }
    WEBCORE_EXPORT virtual bool shouldRegisterScrollbars() const { return true; }
    WEBCORE_EXPORT virtual void updateScrollbarEnabledState(Scrollbar&) { }

    WEBCORE_EXPORT virtual void setScrollbarMinimumThumbLength(WebCore::ScrollbarOrientation, int) { }
    WEBCORE_EXPORT virtual int minimumThumbLength(WebCore::ScrollbarOrientation) { return 0; }
    WEBCORE_EXPORT virtual void scrollbarLayoutDirectionChanged(UserInterfaceLayoutDirection) { }
    WEBCORE_EXPORT virtual void scrollbarColorChanged(std::optional<ScrollbarColor>);
#if USE(COORDINATED_GRAPHICS_ASYNC_SCROLLBAR)
    virtual void scrollbarOpacityChanged() { }
#endif

    WEBCORE_EXPORT virtual void updateScrollerStyle() { }

    WEBCORE_EXPORT void updateScrollbarsThickness();

    WEBCORE_EXPORT virtual void updateScrollbarStyle() { }

    WEBCORE_EXPORT virtual void scrollbarWidthChanged(WebCore::ScrollbarWidth) { }

private:
    WeakRef<ScrollableArea> m_scrollableArea;
    bool m_scrollbarAnimationsUnsuspendedByUserInteraction { true };
};

} // namespace WebCore