[WebGPU] Buffer updates part 1: async mapping functions, unmap, and destroy
[WebKit-https.git] / Source / WebCore / page / scrolling / ios / ScrollingTreeIOS.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 "ScrollingTreeIOS.h"
28
29 #if ENABLE(ASYNC_SCROLLING) && PLATFORM(IOS_FAMILY)
30
31 #include "AsyncScrollingCoordinator.h"
32 #include "PlatformWheelEvent.h"
33 #include "ScrollingThread.h"
34 #include "ScrollingTreeFixedNode.h"
35 #include "ScrollingTreeFrameHostingNode.h"
36 #include "ScrollingTreeFrameScrollingNodeIOS.h"
37 #include "ScrollingTreeNode.h"
38 #include "ScrollingTreeScrollingNode.h"
39 #include "ScrollingTreeStickyNode.h"
40 #include <wtf/MainThread.h>
41
42 namespace WebCore {
43
44 Ref<ScrollingTreeIOS> ScrollingTreeIOS::create(AsyncScrollingCoordinator& scrollingCoordinator)
45 {
46     return adoptRef(*new ScrollingTreeIOS(scrollingCoordinator));
47 }
48
49 ScrollingTreeIOS::ScrollingTreeIOS(AsyncScrollingCoordinator& scrollingCoordinator)
50     : m_scrollingCoordinator(&scrollingCoordinator)
51 {
52 }
53
54 ScrollingTreeIOS::~ScrollingTreeIOS()
55 {
56     // invalidate() should have cleared m_scrollingCoordinator.
57     ASSERT(!m_scrollingCoordinator);
58 }
59
60 void ScrollingTreeIOS::invalidate()
61 {
62     // Invalidate is dispatched by the ScrollingCoordinator class on the ScrollingThread
63     // to break the reference cycle between ScrollingTree and ScrollingCoordinator when the
64     // ScrollingCoordinator's page is destroyed.
65     ASSERT(ScrollingThread::isCurrentThread());
66
67     // Since this can potentially be the last reference to the scrolling coordinator,
68     // we need to release it on the main thread since it has member variables (such as timers)
69     // that expect to be destroyed from the main thread.
70     callOnMainThread([scrollingCoordinator = WTFMove(m_scrollingCoordinator)] {
71     });
72 }
73
74 void ScrollingTreeIOS::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint& scrollPosition, const Optional<FloatPoint>& layoutViewportOrigin, ScrollingLayerPositionAction scrollingLayerPositionAction)
75 {
76     if (!m_scrollingCoordinator)
77         return;
78
79     if (nodeID == rootNode()->scrollingNodeID())
80         setMainFrameScrollPosition(scrollPosition);
81
82     callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, scrollPosition, layoutViewportOrigin, localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll(), scrollingLayerPositionAction] {
83         scrollingCoordinator->scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, layoutViewportOrigin, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction);
84     });
85 }
86
87 Ref<ScrollingTreeNode> ScrollingTreeIOS::createScrollingTreeNode(ScrollingNodeType nodeType, ScrollingNodeID nodeID)
88 {
89     switch (nodeType) {
90     case ScrollingNodeType::MainFrame:
91     case ScrollingNodeType::Subframe:
92         return ScrollingTreeFrameScrollingNodeIOS::create(*this, nodeType, nodeID);
93     case ScrollingNodeType::FrameHosting:
94         return ScrollingTreeFrameHostingNode::create(*this, nodeID);
95     case ScrollingNodeType::Overflow:
96         ASSERT_NOT_REACHED();
97         break;
98     case ScrollingNodeType::Fixed:
99         return ScrollingTreeFixedNode::create(*this, nodeID);
100     case ScrollingNodeType::Sticky:
101         return ScrollingTreeStickyNode::create(*this, nodeID);
102     }
103     ASSERT_NOT_REACHED();
104     return ScrollingTreeFixedNode::create(*this, nodeID);
105 }
106
107 FloatRect ScrollingTreeIOS::fixedPositionRect()
108 {
109     // When ScrollingTreeIOS starts being used for WK1 on iOS, this needs to get the customFixedPositionRect from
110     // the ScrollingCoordinator.
111     ASSERT_NOT_REACHED();
112     return FloatRect();
113 }
114
115 void ScrollingTreeIOS::currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID nodeID, unsigned horizontal, unsigned vertical)
116 {
117     if (!m_scrollingCoordinator)
118         return;
119     
120     callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, horizontal, vertical] {
121         scrollingCoordinator->setActiveScrollSnapIndices(nodeID, horizontal, vertical);
122     });
123 }
124
125 } // namespace WebCore
126
127 #endif // ENABLE(ASYNC_SCROLLING) && PLATFORM(IOS_FAMILY)