b32d79fe9289b1457c8ead2d8d35c3b79daec96a
[WebKit-https.git] / Source / WebKit / UIProcess / RemoteLayerTree / RemoteScrollingCoordinatorProxy.h
1 /*
2  * Copyright (C) 2014-2015 Apple 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(ASYNC_SCROLLING)
29
30 #include "MessageReceiver.h"
31 #include "RemoteScrollingCoordinator.h"
32 #include "RemoteScrollingTree.h"
33 #include <wtf/Noncopyable.h>
34 #include <wtf/RefPtr.h>
35
36 namespace WebCore {
37 class FloatPoint;
38 class PlatformWheelEvent;
39 }
40
41 namespace WebKit {
42
43 class RemoteLayerTreeHost;
44 class RemoteScrollingCoordinatorTransaction;
45 class RemoteScrollingTree;
46 class WebPageProxy;
47
48 class RemoteScrollingCoordinatorProxy {
49     WTF_MAKE_NONCOPYABLE(RemoteScrollingCoordinatorProxy);
50 public:
51     explicit RemoteScrollingCoordinatorProxy(WebPageProxy&);
52     virtual ~RemoteScrollingCoordinatorProxy();
53
54     bool visualViewportEnabled() const { return m_scrollingTree && m_scrollingTree->visualViewportEnabled(); }
55
56     // Inform the web process that the scroll position changed (called from the scrolling tree)
57     void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint& newScrollPosition, const Optional<WebCore::FloatPoint>& layoutViewportOrigin, WebCore::ScrollingLayerPositionAction);
58     void scrollingTreeNodeRequestsScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint& scrollPosition, bool representsProgrammaticScroll);
59
60     WebCore::TrackingType eventTrackingTypeForPoint(const AtomicString& eventName, WebCore::IntPoint) const;
61
62     // Called externally when native views move around.
63     void viewportChangedViaDelegatedScrolling(WebCore::ScrollingNodeID, const WebCore::FloatRect& fixedPositionRect, double scale);
64
65     void currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID, unsigned horizontal, unsigned vertical);
66
67     // FIXME: expose the tree and pass this to that?
68     bool handleWheelEvent(const WebCore::PlatformWheelEvent&);
69     void handleMouseEvent(const WebCore::PlatformMouseEvent&);
70
71     WebCore::ScrollingNodeID rootScrollingNodeID() const;
72
73     const RemoteLayerTreeHost* layerTreeHost() const;
74
75     struct RequestedScrollInfo {
76         bool requestsScrollPositionUpdate { };
77         bool requestIsProgrammaticScroll { };
78         WebCore::FloatPoint requestedScrollPosition;
79     };
80     void commitScrollingTreeState(const RemoteScrollingCoordinatorTransaction&, RequestedScrollInfo&);
81
82     void setPropagatesMainFrameScrolls(bool propagatesMainFrameScrolls) { m_propagatesMainFrameScrolls = propagatesMainFrameScrolls; }
83     bool propagatesMainFrameScrolls() const { return m_propagatesMainFrameScrolls; }
84     bool hasFixedOrSticky() const { return m_scrollingTree->hasFixedOrSticky(); }
85
86 #if PLATFORM(IOS_FAMILY)
87     WebCore::FloatRect customFixedPositionRect() const;
88     void scrollingTreeNodeWillStartPanGesture();
89     void scrollingTreeNodeWillStartScroll();
90     void scrollingTreeNodeDidEndScroll();
91 #if ENABLE(CSS_SCROLL_SNAP)
92     void adjustTargetContentOffsetForSnapping(CGSize maxScrollDimensions, CGPoint velocity, CGFloat topInset, CGPoint* targetContentOffset);
93     bool hasActiveSnapPoint() const;
94     CGPoint nearestActiveContentInsetAdjustedSnapPoint(CGFloat topInset, const CGPoint&) const;
95     bool shouldSetScrollViewDecelerationRateFast() const;
96 #endif
97 #endif
98
99     String scrollingTreeAsText() const;
100
101 private:
102     void connectStateNodeLayers(WebCore::ScrollingStateTree&, const RemoteLayerTreeHost&);
103 #if ENABLE(CSS_SCROLL_SNAP)
104     bool shouldSnapForMainFrameScrolling(WebCore::ScrollEventAxis) const;
105     float closestSnapOffsetForMainFrameScrolling(WebCore::ScrollEventAxis, float scrollDestination, float velocity, unsigned& closestIndex) const;
106 #endif
107
108     WebPageProxy& m_webPageProxy;
109     RefPtr<RemoteScrollingTree> m_scrollingTree;
110     RequestedScrollInfo* m_requestedScrollInfo;
111 #if ENABLE(CSS_SCROLL_SNAP)
112     unsigned m_currentHorizontalSnapPointIndex { 0 };
113     unsigned m_currentVerticalSnapPointIndex { 0 };
114 #endif
115     bool m_propagatesMainFrameScrolls;
116 };
117
118 } // namespace WebKit
119
120 #endif // ENABLE(ASYNC_SCROLLING)