0818daf4cbde8699c50e316e5265943b72d55434
[WebKit-https.git] / Source / WebKit2 / UIProcess / Scrolling / RemoteScrollingCoordinatorProxy.h
1 /*
2  * Copyright (C) 2014 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     bool isPointInNonFastScrollableRegion(const 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     // FIXME: expose the tree and pass this to that?
65     bool handleWheelEvent(const WebCore::PlatformWheelEvent&);
66     
67     WebCore::ScrollingNodeID rootScrollingNodeID() const;
68
69     const RemoteLayerTreeHost* layerTreeHost() const;
70
71     struct RequestedScrollInfo {
72         bool requestsScrollPositionUpdate { };
73         bool requestIsProgrammaticScroll { };
74         WebCore::FloatPoint requestedScrollPosition;
75     };
76     void updateScrollingTree(const RemoteScrollingCoordinatorTransaction&, RequestedScrollInfo&);
77
78     void setPropagatesMainFrameScrolls(bool propagatesMainFrameScrolls) { m_propagatesMainFrameScrolls = propagatesMainFrameScrolls; }
79     bool propagatesMainFrameScrolls() const { return m_propagatesMainFrameScrolls; }
80     bool hasFixedOrSticky() const { return m_scrollingTree->hasFixedOrSticky(); }
81
82 #if PLATFORM(IOS)
83     WebCore::FloatRect customFixedPositionRect() const;
84     void scrollingTreeNodeWillStartPanGesture();
85     void scrollingTreeNodeWillStartScroll();
86     void scrollingTreeNodeDidEndScroll();
87 #if ENABLE(CSS_SCROLL_SNAP)
88     void adjustTargetContentOffsetForSnapping(CGSize maxScrollDimensions, CGPoint velocity, CGPoint* targetContentOffset) const;
89     bool shouldSetScrollViewDecelerationRateFast() const;
90 #endif
91 #endif
92
93 private:
94     void connectStateNodeLayers(WebCore::ScrollingStateTree&, const RemoteLayerTreeHost&);
95 #if ENABLE(CSS_SCROLL_SNAP)
96     bool shouldSnapForMainFrameScrolling(WebCore::ScrollEventAxis) const;
97     float closestSnapOffsetForMainFrameScrolling(WebCore::ScrollEventAxis, float scrollDestination, float velocity) const;
98 #endif
99
100     WebPageProxy& m_webPageProxy;
101     RefPtr<RemoteScrollingTree> m_scrollingTree;
102     RequestedScrollInfo* m_requestedScrollInfo;
103     bool m_propagatesMainFrameScrolls;
104 };
105
106 } // namespace WebKit
107
108 #endif // ENABLE(ASYNC_SCROLLING)
109
110 #endif // RemoteScrollingCoordinatorProxy_h