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