[iOS WK2] Header bar on nytimes articles lands in the wrong place after rubberbanding
[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 #endif
88
89 private:
90     void connectStateNodeLayers(WebCore::ScrollingStateTree&, const RemoteLayerTreeHost&);
91
92     WebPageProxy& m_webPageProxy;
93     RefPtr<RemoteScrollingTree> m_scrollingTree;
94     RequestedScrollInfo* m_requestedScrollInfo;
95     bool m_propagatesMainFrameScrolls;
96 };
97
98 } // namespace WebKit
99
100 #endif // ENABLE(ASYNC_SCROLLING)
101
102 #endif // RemoteScrollingCoordinatorProxy_h