f30e25ca112918babab686a051112be7758c7161
[WebKit-https.git] / Source / WebKit / UIProcess / RemoteLayerTree / RemoteScrollingTree.cpp
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 #include "config.h"
27 #include "RemoteScrollingTree.h"
28
29 #if ENABLE(ASYNC_SCROLLING)
30
31 #include "RemoteLayerTreeHost.h"
32 #include "RemoteScrollingCoordinatorProxy.h"
33 #include <WebCore/ScrollingTreeFixedNode.h>
34 #include <WebCore/ScrollingTreeFrameHostingNode.h>
35 #include <WebCore/ScrollingTreeStickyNode.h>
36
37 #if PLATFORM(IOS_FAMILY)
38 #include "ScrollingTreeFrameScrollingNodeRemoteIOS.h"
39 #include "ScrollingTreeOverflowScrollingNodeIOS.h"
40 #include <WebCore/ScrollingTreeFrameScrollingNodeIOS.h>
41 #else
42 #include "ScrollingTreeFrameScrollingNodeRemoteMac.h"
43 #endif
44
45 namespace WebKit {
46 using namespace WebCore;
47
48 Ref<RemoteScrollingTree> RemoteScrollingTree::create(RemoteScrollingCoordinatorProxy& scrollingCoordinator)
49 {
50     return adoptRef(*new RemoteScrollingTree(scrollingCoordinator));
51 }
52
53 RemoteScrollingTree::RemoteScrollingTree(RemoteScrollingCoordinatorProxy& scrollingCoordinator)
54     : m_scrollingCoordinatorProxy(scrollingCoordinator)
55 {
56 }
57
58 RemoteScrollingTree::~RemoteScrollingTree()
59 {
60 }
61
62 ScrollingEventResult RemoteScrollingTree::tryToHandleWheelEvent(const PlatformWheelEvent& wheelEvent)
63 {
64     if (shouldHandleWheelEventSynchronously(wheelEvent))
65         return ScrollingEventResult::SendToMainThread;
66
67     if (willWheelEventStartSwipeGesture(wheelEvent))
68         return ScrollingEventResult::DidNotHandleEvent;
69
70     handleWheelEvent(wheelEvent);
71     return ScrollingEventResult::DidHandleEvent;
72 }
73
74 #if PLATFORM(MAC)
75 void RemoteScrollingTree::handleWheelEventPhase(PlatformWheelEventPhase phase)
76 {
77     // FIXME: hand off to m_scrollingCoordinatorProxy?
78 }
79 #endif
80
81 #if PLATFORM(IOS_FAMILY)
82 WebCore::FloatRect RemoteScrollingTree::fixedPositionRect()
83 {
84     return m_scrollingCoordinatorProxy.customFixedPositionRect();
85 }
86
87 void RemoteScrollingTree::scrollingTreeNodeWillStartPanGesture()
88 {
89     m_scrollingCoordinatorProxy.scrollingTreeNodeWillStartPanGesture();
90 }
91
92 void RemoteScrollingTree::scrollingTreeNodeWillStartScroll()
93 {
94     m_scrollingCoordinatorProxy.scrollingTreeNodeWillStartScroll();
95 }
96
97 void RemoteScrollingTree::scrollingTreeNodeDidEndScroll()
98 {
99     m_scrollingCoordinatorProxy.scrollingTreeNodeDidEndScroll();
100 }
101
102 #endif
103
104 void RemoteScrollingTree::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint& scrollPosition, const Optional<FloatPoint>& layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
105 {
106     m_scrollingCoordinatorProxy.scrollingTreeNodeDidScroll(nodeID, scrollPosition, layoutViewportOrigin, scrollingLayerPositionAction);
107 }
108
109 void RemoteScrollingTree::scrollingTreeNodeRequestsScroll(ScrollingNodeID nodeID, const FloatPoint& scrollPosition, bool representsProgrammaticScroll)
110 {
111     m_scrollingCoordinatorProxy.scrollingTreeNodeRequestsScroll(nodeID, scrollPosition, representsProgrammaticScroll);
112 }
113
114 Ref<ScrollingTreeNode> RemoteScrollingTree::createScrollingTreeNode(ScrollingNodeType nodeType, ScrollingNodeID nodeID)
115 {
116     switch (nodeType) {
117     case ScrollingNodeType::MainFrame:
118     case ScrollingNodeType::Subframe:
119 #if PLATFORM(IOS_FAMILY)
120         return ScrollingTreeFrameScrollingNodeRemoteIOS::create(*this, nodeType, nodeID);
121 #else
122         return ScrollingTreeFrameScrollingNodeRemoteMac::create(*this, nodeType, nodeID);
123 #endif
124     case ScrollingNodeType::FrameHosting:
125         return ScrollingTreeFrameHostingNode::create(*this, nodeID);
126     case ScrollingNodeType::Overflow:
127 #if PLATFORM(IOS_FAMILY)
128         return ScrollingTreeOverflowScrollingNodeIOS::create(*this, nodeID);
129 #else
130         ASSERT_NOT_REACHED();
131         break;
132 #endif
133     case ScrollingNodeType::Fixed:
134         return ScrollingTreeFixedNode::create(*this, nodeID);
135     case ScrollingNodeType::Sticky:
136         return ScrollingTreeStickyNode::create(*this, nodeID);
137     }
138     ASSERT_NOT_REACHED();
139     return ScrollingTreeFixedNode::create(*this, nodeID);
140 }
141
142 void RemoteScrollingTree::currentSnapPointIndicesDidChange(ScrollingNodeID nodeID, unsigned horizontal, unsigned vertical)
143 {
144     m_scrollingCoordinatorProxy.currentSnapPointIndicesDidChange(nodeID, horizontal, vertical);
145 }
146
147 void RemoteScrollingTree::handleMouseEvent(const WebCore::PlatformMouseEvent& event)
148 {
149 #if ENABLE(ASYNC_SCROLLING) && PLATFORM(MAC)
150     static_cast<ScrollingTreeFrameScrollingNodeRemoteMac&>(*rootNode()).handleMouseEvent(event);
151 #else
152     UNUSED_PARAM(event);
153 #endif
154 }
155
156 } // namespace WebKit
157
158 #endif // ENABLE(ASYNC_SCROLLING)