62faef9552656083f384ea3399a8151c9c71d401
[WebKit-https.git] / Source / WebKit2 / UIProcess / Scrolling / 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 #ifndef RemoteScrollingCoordinatorProxy_h
27 #define RemoteScrollingCoordinatorProxy_h
28
29 #if ENABLE(ASYNC_SCROLLING)
30
31 #include "MessageReceiver.h"
32 #include "RemoteScrollingCoordinator.h"
33 #include "RemoteScrollingTree.h"
34 #include <wtf/Noncopyable.h>
35 #include <wtf/RefPtr.h>
36
37 namespace WebCore {
38 class FloatPoint;
39 class PlatformWheelEvent;
40 }
41
42 namespace WebKit {
43
44 class RemoteLayerTreeHost;
45 class RemoteScrollingCoordinatorTransaction;
46 class RemoteScrollingTree;
47 class WebPageProxy;
48
49 class RemoteScrollingCoordinatorProxy {
50     WTF_MAKE_NONCOPYABLE(RemoteScrollingCoordinatorProxy);
51 public:
52     explicit RemoteScrollingCoordinatorProxy(WebPageProxy&);
53     virtual ~RemoteScrollingCoordinatorProxy();
54     
55     // Inform the web process that the scroll position changed (called from the scrolling tree)
56     void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint& newScrollPosition, WebCore::SetOrSyncScrollingLayerPosition);
57     void scrollingTreeNodeRequestsScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint& scrollPosition, bool representsProgrammaticScroll);
58
59     WebCore::TrackingType eventTrackingTypeForPoint(const AtomicString& eventName, WebCore::IntPoint) const;
60
61     // Called externally when native views move around.
62     void viewportChangedViaDelegatedScrolling(WebCore::ScrollingNodeID, const WebCore::FloatRect& fixedPositionRect, double scale);
63
64     void currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID, unsigned horizontal, unsigned vertical);
65
66     // FIXME: expose the tree and pass this to that?
67     bool handleWheelEvent(const WebCore::PlatformWheelEvent&);
68     
69     WebCore::ScrollingNodeID rootScrollingNodeID() const;
70
71     const RemoteLayerTreeHost* layerTreeHost() const;
72
73     struct RequestedScrollInfo {
74         bool requestsScrollPositionUpdate { };
75         bool requestIsProgrammaticScroll { };
76         WebCore::FloatPoint requestedScrollPosition;
77     };
78     void commitScrollingTreeState(const RemoteScrollingCoordinatorTransaction&, RequestedScrollInfo&);
79
80     void setPropagatesMainFrameScrolls(bool propagatesMainFrameScrolls) { m_propagatesMainFrameScrolls = propagatesMainFrameScrolls; }
81     bool propagatesMainFrameScrolls() const { return m_propagatesMainFrameScrolls; }
82     bool hasFixedOrSticky() const { return m_scrollingTree->hasFixedOrSticky(); }
83
84 #if PLATFORM(IOS)
85     WebCore::FloatRect customFixedPositionRect() const;
86     void scrollingTreeNodeWillStartPanGesture();
87     void scrollingTreeNodeWillStartScroll();
88     void scrollingTreeNodeDidEndScroll();
89 #if ENABLE(CSS_SCROLL_SNAP)
90     void adjustTargetContentOffsetForSnapping(CGSize maxScrollDimensions, CGPoint velocity, CGFloat topInset, CGPoint* targetContentOffset);
91     bool hasActiveSnapPoint() const;
92     CGPoint nearestActiveContentInsetAdjustedSnapPoint(CGFloat topInset, const CGPoint&) const;
93     bool shouldSetScrollViewDecelerationRateFast() const;
94 #endif
95 #endif
96
97 private:
98     void connectStateNodeLayers(WebCore::ScrollingStateTree&, const RemoteLayerTreeHost&);
99 #if ENABLE(CSS_SCROLL_SNAP)
100     bool shouldSnapForMainFrameScrolling(WebCore::ScrollEventAxis) const;
101     float closestSnapOffsetForMainFrameScrolling(WebCore::ScrollEventAxis, float scrollDestination, float velocity, unsigned& closestIndex) const;
102 #endif
103
104     WebPageProxy& m_webPageProxy;
105     RefPtr<RemoteScrollingTree> m_scrollingTree;
106     RequestedScrollInfo* m_requestedScrollInfo;
107 #if ENABLE(CSS_SCROLL_SNAP)
108     unsigned m_currentHorizontalSnapPointIndex { 0 };
109     unsigned m_currentVerticalSnapPointIndex { 0 };
110 #endif
111     bool m_propagatesMainFrameScrolls;
112 };
113
114 } // namespace WebKit
115
116 #endif // ENABLE(ASYNC_SCROLLING)
117
118 #endif // RemoteScrollingCoordinatorProxy_h