Process Scroll-gesture events from the compositor.
[WebKit-https.git] / Source / WebKit / chromium / tests / WebCompositorInputHandlerImplTest.cpp
1 /*
2  * Copyright (C) 2011 Google 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #include "WebCompositorInputHandlerImpl.h"
29
30 #include "WebCompositor.h"
31 #include "WebCompositorInputHandlerClient.h"
32 #include "WebInputEvent.h"
33 #include "cc/CCInputHandler.h"
34 #include "cc/CCSingleThreadProxy.h"
35
36 #include <gtest/gtest.h>
37 #include <wtf/OwnPtr.h>
38
39 using WebKit::WebCompositorInputHandler;
40 using WebKit::WebCompositorInputHandlerImpl;
41
42 namespace {
43
44 class MockInputHandlerClient : public WebCore::CCInputHandlerClient {
45     WTF_MAKE_NONCOPYABLE(MockInputHandlerClient);
46 public:
47     MockInputHandlerClient()
48         : m_scrollStatus(ScrollStarted)
49     {
50     }
51     virtual ~MockInputHandlerClient() { }
52
53     void setScrollStatus(ScrollStatus status) { m_scrollStatus = status; }
54
55 private:
56     virtual void setNeedsRedraw() OVERRIDE { }
57     virtual ScrollStatus scrollBegin(const WebCore::IntPoint&) OVERRIDE
58     {
59         return m_scrollStatus;
60     }
61     virtual void scrollBy(const WebCore::IntSize&) OVERRIDE { }
62     virtual void scrollEnd() OVERRIDE { }
63
64     virtual bool haveWheelEventHandlers() OVERRIDE { return false; }
65     virtual void pinchGestureBegin() OVERRIDE { }
66     virtual void pinchGestureUpdate(float magnifyDelta, const WebCore::IntPoint& anchor) OVERRIDE { }
67     virtual void pinchGestureEnd() OVERRIDE { }
68     virtual void startPageScaleAnimation(const WebCore::IntSize& targetPosition,
69                                          bool anchorPoint,
70                                          float pageScale,
71                                          double startTimeMs,
72                                          double durationMs) OVERRIDE { }
73
74     ScrollStatus m_scrollStatus;
75 };
76
77 class MockWebCompositorInputHandlerClient : public WebKit::WebCompositorInputHandlerClient {
78     WTF_MAKE_NONCOPYABLE(MockWebCompositorInputHandlerClient);
79 public:
80     MockWebCompositorInputHandlerClient()
81         : m_handled(false)
82         , m_sendToWidget(false)
83     {
84     }
85     virtual ~MockWebCompositorInputHandlerClient() { }
86
87     void reset()
88     {
89         m_handled = false;
90         m_sendToWidget = false;
91     }
92
93     bool handled() const { return m_handled; }
94     bool sendToWidget() const { return m_sendToWidget; }
95
96 private:
97     virtual void willShutdown() OVERRIDE { }
98     virtual void didHandleInputEvent() OVERRIDE
99     {
100         m_handled = true;
101     }
102     virtual void didNotHandleInputEvent(bool sendToWidget) OVERRIDE
103     {
104         m_sendToWidget = sendToWidget;
105     }
106
107     bool m_handled;
108     bool m_sendToWidget;
109 };
110
111 TEST(WebCompositorInputHandlerImpl, fromIdentifier)
112 {
113     WebKit::WebCompositor::initialize(0);
114 #ifndef NDEBUG
115     // WebCompositorInputHandler APIs can only be called from the compositor thread.
116     WebCore::DebugScopedSetImplThread alwaysImplThread;
117 #endif
118
119     // Before creating any WebCompositorInputHandlers, lookups for any value should fail and not crash.
120     EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(2));
121     EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(0));
122     EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(-1));
123
124     int compositorIdentifier = -1;
125     {
126         OwnPtr<WebCompositorInputHandlerImpl> inputHandler = WebCompositorInputHandlerImpl::create(0);
127         compositorIdentifier = inputHandler->identifier();
128         // The compositor we just created should be locatable.
129         EXPECT_EQ(inputHandler.get(), WebCompositorInputHandler::fromIdentifier(compositorIdentifier));
130
131         // But nothing else.
132         EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(inputHandler->identifier() + 10));
133     }
134
135     // After the compositor is destroyed, its entry should be removed from the map.
136     EXPECT_EQ(0, WebCompositorInputHandler::fromIdentifier(compositorIdentifier));
137
138     WebKit::WebCompositor::shutdown();
139 }
140
141 TEST(WebCompositorInputHandlerImpl, gestureScroll)
142 {
143     WebKit::WebCompositor::initialize(0);
144 #ifndef NDEBUG
145     // WebCompositorInputHandler APIs can only be called from the compositor thread.
146     WebCore::DebugScopedSetImplThread alwaysImplThread;
147 #endif
148
149     MockInputHandlerClient mockInputHandler;
150     OwnPtr<WebCompositorInputHandlerImpl> inputHandler = WebCompositorInputHandlerImpl::create(&mockInputHandler);
151     MockWebCompositorInputHandlerClient mockClient;
152     inputHandler->setClient(&mockClient);
153
154     WebKit::WebGestureEvent gesture;
155
156     gesture.type = WebKit::WebInputEvent::GestureScrollBegin;
157     inputHandler->handleInputEvent(gesture);
158     EXPECT_TRUE(mockClient.handled());
159     EXPECT_FALSE(mockClient.sendToWidget());
160     mockClient.reset();
161
162     gesture.type = WebKit::WebInputEvent::GestureScrollUpdate;
163     gesture.deltaY = 40;
164     inputHandler->handleInputEvent(gesture);
165     EXPECT_TRUE(mockClient.handled());
166     EXPECT_FALSE(mockClient.sendToWidget());
167     mockClient.reset();
168
169     gesture.type = WebKit::WebInputEvent::GestureScrollEnd;
170     gesture.deltaY = 0;
171     inputHandler->handleInputEvent(gesture);
172     EXPECT_TRUE(mockClient.handled());
173     EXPECT_FALSE(mockClient.sendToWidget());
174     mockClient.reset();
175
176     mockInputHandler.setScrollStatus(WebCore::CCInputHandlerClient::ScrollFailed);
177
178     gesture.type = WebKit::WebInputEvent::GestureScrollBegin;
179     inputHandler->handleInputEvent(gesture);
180     EXPECT_FALSE(mockClient.handled());
181     EXPECT_TRUE(mockClient.sendToWidget());
182     mockClient.reset();
183
184     gesture.type = WebKit::WebInputEvent::GestureScrollUpdate;
185     gesture.deltaY = 40;
186     inputHandler->handleInputEvent(gesture);
187     EXPECT_FALSE(mockClient.handled());
188     EXPECT_TRUE(mockClient.sendToWidget());
189     mockClient.reset();
190
191     gesture.type = WebKit::WebInputEvent::GestureScrollEnd;
192     gesture.deltaY = 0;
193     inputHandler->handleInputEvent(gesture);
194     EXPECT_FALSE(mockClient.handled());
195     EXPECT_TRUE(mockClient.sendToWidget());
196     mockClient.reset();
197
198     inputHandler->setClient(0);
199
200     WebKit::WebCompositor::shutdown();
201 }
202
203 }