Limit user-agent interactions based on the touch-action property on iOS
[WebKit-https.git] / Source / WebKit / UIProcess / RemoteLayerTree / ios / ScrollingTreeScrollingNodeDelegateIOS.h
1 /*
2  * Copyright (C) 2017 Igalia S.L. 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 #pragma once
27
28 #if PLATFORM(IOS_FAMILY) && ENABLE(ASYNC_SCROLLING)
29
30 #include <UIKit/UIScrollView.h>
31 #include <WebCore/ScrollingCoordinator.h>
32 #include <WebCore/ScrollingTreeScrollingNode.h>
33 #include <WebCore/ScrollingTreeScrollingNodeDelegate.h>
34
35 OBJC_CLASS CALayer;
36 OBJC_CLASS WKScrollingNodeScrollViewDelegate;
37
38 namespace WebCore {
39
40 class FloatPoint;
41 class FloatRect;
42 class FloatSize;
43 class ScrollingTreeScrollingNode;
44
45 }
46
47 namespace WebKit {
48
49 class ScrollingTreeScrollingNodeDelegateIOS : public WebCore::ScrollingTreeScrollingNodeDelegate {
50 public:
51     explicit ScrollingTreeScrollingNodeDelegateIOS(WebCore::ScrollingTreeScrollingNode&);
52     ~ScrollingTreeScrollingNodeDelegateIOS() final;
53
54     void scrollWillStart() const;
55     void scrollDidEnd() const;
56     void scrollViewWillStartPanGesture() const;
57     void scrollViewDidScroll(const WebCore::FloatPoint& scrollPosition, bool inUserInteraction) const;
58     void currentSnapPointIndicesDidChange(unsigned horizontal, unsigned vertical) const;
59     CALayer *scrollLayer() const { return m_scrollLayer.get(); }
60
61     void resetScrollViewDelegate();
62     void commitStateBeforeChildren(const WebCore::ScrollingStateScrollingNode&);
63     void commitStateAfterChildren(const WebCore::ScrollingStateScrollingNode&);
64     void updateLayersAfterAncestorChange(const WebCore::ScrollingTreeNode& changedNode, const WebCore::FloatRect& fixedPositionRect, const WebCore::FloatSize& cumulativeDelta);
65     WebCore::FloatPoint scrollPosition() const;
66     void setScrollLayerPosition(const WebCore::FloatPoint&);
67     void updateChildNodesAfterScroll(const WebCore::FloatPoint& scrollPosition);
68 #if ENABLE(POINTER_EVENTS)
69     Optional<TouchActionData> touchActionData() const;
70 #endif
71
72 private:
73     RetainPtr<CALayer> m_scrollLayer;
74     RetainPtr<CALayer> m_scrolledContentsLayer;
75     RetainPtr<WKScrollingNodeScrollViewDelegate> m_scrollViewDelegate;
76     bool m_updatingFromStateNode { false };
77 };
78
79 } // namespace WebKit
80
81 @interface WKScrollingNodeScrollViewDelegate : NSObject <UIScrollViewDelegate> {
82     WebKit::ScrollingTreeScrollingNodeDelegateIOS* _scrollingTreeNodeDelegate;
83 }
84
85 @property (nonatomic, getter=_isInUserInteraction) BOOL inUserInteraction;
86
87 - (instancetype)initWithScrollingTreeNodeDelegate:(WebKit::ScrollingTreeScrollingNodeDelegateIOS*)delegate;
88
89 @end
90
91 #endif // PLATFORM(IOS_FAMILY) && ENABLE(ASYNC_SCROLLING)