WinCairo build fails to link.
[WebKit-https.git] / Source / WebKit / chromium / tests / WebInputEventConversionTest.cpp
1 /*
2  * Copyright (C) 2012 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 are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32
33 #include "WebInputEventConversion.h"
34
35 #include "Frame.h"
36 #include "FrameTestHelpers.h"
37 #include "FrameView.h"
38 #include "GestureEvent.h"
39 #include "KeyboardEvent.h"
40 #include "MouseEvent.h"
41 #include "Touch.h"
42 #include "TouchEvent.h"
43 #include "TouchList.h"
44 #include "URLTestHelpers.h"
45 #include "WebFrame.h"
46 #include "WebSettings.h"
47 #include "WebViewImpl.h"
48 #include <gtest/gtest.h>
49
50 using namespace WebKit;
51 using namespace WebCore;
52
53 namespace {
54
55 PassRefPtr<WebCore::KeyboardEvent> createKeyboardEventWithLocation(WebCore::KeyboardEvent::KeyLocationCode location)
56 {
57     return WebCore::KeyboardEvent::create("keydown", true, true, 0, "", location, false, false, false, false, false);
58 }
59
60 int getModifiersForKeyLocationCode(WebCore::KeyboardEvent::KeyLocationCode location)
61 {
62     RefPtr<WebCore::KeyboardEvent> event = createKeyboardEventWithLocation(location);
63     WebKit::WebKeyboardEventBuilder convertedEvent(*event);
64     return convertedEvent.modifiers;
65 }
66
67 TEST(WebInputEventConversionTest, WebKeyboardEventBuilder)
68 {
69     // Test key location conversion.
70     int modifiers = getModifiersForKeyLocationCode(WebCore::KeyboardEvent::DOMKeyLocationStandard);
71     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsLeft || modifiers & WebInputEvent::IsRight);
72
73     modifiers = getModifiersForKeyLocationCode(WebCore::KeyboardEvent::DOMKeyLocationLeft);
74     EXPECT_TRUE(modifiers & WebInputEvent::IsLeft);
75     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsRight);
76
77     modifiers = getModifiersForKeyLocationCode(WebCore::KeyboardEvent::DOMKeyLocationRight);
78     EXPECT_TRUE(modifiers & WebInputEvent::IsRight);
79     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsLeft);
80
81     modifiers = getModifiersForKeyLocationCode(WebCore::KeyboardEvent::DOMKeyLocationNumpad);
82     EXPECT_TRUE(modifiers & WebInputEvent::IsKeyPad);
83     EXPECT_FALSE(modifiers & WebInputEvent::IsLeft || modifiers & WebInputEvent::IsRight);
84 }
85
86 TEST(WebInputEventConversionTest, WebTouchEventBuilder)
87 {
88     RefPtr<WebCore::TouchEvent> event = WebCore::TouchEvent::create();
89     WebMouseEventBuilder mouse(0, 0, *event);
90     EXPECT_EQ(WebInputEvent::Undefined, mouse.type);
91 }
92
93 TEST(WebInputEventConversionTest, InputEventsScaling)
94 {
95     const std::string baseURL("http://www.test.com/");
96     const std::string fileName("fixed_layout.html");
97
98     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
99     WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(baseURL + fileName, true));
100     webViewImpl->enableFixedLayoutMode(true);
101     webViewImpl->settings()->setViewportEnabled(true);
102     int pageWidth = 640;
103     int pageHeight = 480;
104     webViewImpl->resize(WebSize(pageWidth, pageHeight));
105     webViewImpl->layout();
106
107     webViewImpl->setPageScaleFactor(2, WebPoint());
108
109     FrameView* view = webViewImpl->page()->mainFrame()->view();
110     RefPtr<Document> document = webViewImpl->page()->mainFrame()->document();
111     DOMWindow* domWindow = webViewImpl->page()->mainFrame()->document()->defaultView();
112     RenderObject* docRenderer = webViewImpl->page()->mainFrame()->document()->renderer();
113
114     {
115         WebMouseEvent webMouseEvent;
116         webMouseEvent.type = WebInputEvent::MouseMove;
117         webMouseEvent.x = 10;
118         webMouseEvent.y = 10;
119         webMouseEvent.windowX = 10;
120         webMouseEvent.windowY = 10;
121         webMouseEvent.globalX = 10;
122         webMouseEvent.globalY = 10;
123         webMouseEvent.movementX = 10;
124         webMouseEvent.movementY = 10;
125
126         PlatformMouseEventBuilder platformMouseBuilder(view, webMouseEvent);
127         EXPECT_EQ(5, platformMouseBuilder.position().x());
128         EXPECT_EQ(5, platformMouseBuilder.position().y());
129         EXPECT_EQ(10, platformMouseBuilder.globalPosition().x());
130         EXPECT_EQ(10, platformMouseBuilder.globalPosition().y());
131         EXPECT_EQ(5, platformMouseBuilder.movementDelta().x());
132         EXPECT_EQ(5, platformMouseBuilder.movementDelta().y());
133     }
134
135     {
136         WebGestureEvent webGestureEvent;
137         webGestureEvent.type = WebInputEvent::GestureScrollUpdate;
138         webGestureEvent.x = 10;
139         webGestureEvent.y = 10;
140         webGestureEvent.globalX = 10;
141         webGestureEvent.globalY = 10;
142         webGestureEvent.data.scrollUpdate.deltaX = 10;
143         webGestureEvent.data.scrollUpdate.deltaY = 10;
144
145         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
146         EXPECT_EQ(5, platformGestureBuilder.position().x());
147         EXPECT_EQ(5, platformGestureBuilder.position().y());
148         EXPECT_EQ(10, platformGestureBuilder.globalPosition().x());
149         EXPECT_EQ(10, platformGestureBuilder.globalPosition().y());
150         EXPECT_EQ(5, platformGestureBuilder.deltaX());
151         EXPECT_EQ(5, platformGestureBuilder.deltaY());
152     }
153
154     {
155         WebGestureEvent webGestureEvent;
156         webGestureEvent.type = WebInputEvent::GestureTap;
157         webGestureEvent.data.tap.width = 10;
158         webGestureEvent.data.tap.height = 10;
159
160         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
161         EXPECT_EQ(5, platformGestureBuilder.area().width());
162         EXPECT_EQ(5, platformGestureBuilder.area().height());
163     }
164
165     {
166         WebGestureEvent webGestureEvent;
167         webGestureEvent.type = WebInputEvent::GestureTapDown;
168         webGestureEvent.data.tapDown.width = 10;
169         webGestureEvent.data.tapDown.height = 10;
170
171         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
172         EXPECT_EQ(5, platformGestureBuilder.area().width());
173         EXPECT_EQ(5, platformGestureBuilder.area().height());
174     }
175
176     {
177         WebGestureEvent webGestureEvent;
178         webGestureEvent.type = WebInputEvent::GestureLongPress;
179         webGestureEvent.data.longPress.width = 10;
180         webGestureEvent.data.longPress.height = 10;
181
182         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
183         EXPECT_EQ(5, platformGestureBuilder.area().width());
184         EXPECT_EQ(5, platformGestureBuilder.area().height());
185     }
186
187     {
188         WebGestureEvent webGestureEvent;
189         webGestureEvent.type = WebInputEvent::GestureTwoFingerTap;
190         webGestureEvent.data.twoFingerTap.firstFingerWidth = 10;
191         webGestureEvent.data.twoFingerTap.firstFingerHeight = 10;
192
193         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
194         EXPECT_EQ(5, platformGestureBuilder.area().width());
195         EXPECT_EQ(5, platformGestureBuilder.area().height());
196     }
197
198     {
199         WebTouchEvent webTouchEvent;
200         webTouchEvent.type = WebInputEvent::TouchMove;
201         webTouchEvent.touchesLength = 1;
202         webTouchEvent.touches[0].state = WebTouchPoint::StateMoved;
203         webTouchEvent.touches[0].screenPosition.x = 10;
204         webTouchEvent.touches[0].screenPosition.y = 10;
205         webTouchEvent.touches[0].position.x = 10;
206         webTouchEvent.touches[0].position.y = 10;
207         webTouchEvent.touches[0].radiusX = 10;
208         webTouchEvent.touches[0].radiusY = 10;
209
210         PlatformTouchEventBuilder platformTouchBuilder(view, webTouchEvent);
211         EXPECT_EQ(10, platformTouchBuilder.touchPoints()[0].screenPos().x());
212         EXPECT_EQ(10, platformTouchBuilder.touchPoints()[0].screenPos().y());
213         EXPECT_EQ(5, platformTouchBuilder.touchPoints()[0].pos().x());
214         EXPECT_EQ(5, platformTouchBuilder.touchPoints()[0].pos().y());
215         EXPECT_EQ(5, platformTouchBuilder.touchPoints()[0].radiusX());
216         EXPECT_EQ(5, platformTouchBuilder.touchPoints()[0].radiusY());
217     }
218
219     // Reverse builders should *not* go back to physical pixels, as they are used for plugins
220     // which expect CSS pixel coordinates.
221     {
222         PlatformMouseEvent platformMouseEvent(IntPoint(10, 10), IntPoint(10, 10), LeftButton, PlatformEvent::MouseMoved, 1, false, false, false, false, 0);
223         RefPtr<MouseEvent> mouseEvent = MouseEvent::create(WebCore::eventNames().mousemoveEvent, domWindow, platformMouseEvent, 0, document);
224         WebMouseEventBuilder webMouseBuilder(view, docRenderer, *mouseEvent);
225
226         EXPECT_EQ(10, webMouseBuilder.x);
227         EXPECT_EQ(10, webMouseBuilder.y);
228         EXPECT_EQ(10, webMouseBuilder.globalX);
229         EXPECT_EQ(10, webMouseBuilder.globalY);
230         EXPECT_EQ(10, webMouseBuilder.windowX);
231         EXPECT_EQ(10, webMouseBuilder.windowY);
232     }
233
234     {
235         PlatformGestureEvent platformGestureEvent(PlatformEvent::GestureScrollUpdate, IntPoint(10, 10), IntPoint(10, 10), 0, IntSize(10, 10), FloatPoint(10, 10), false, false, false, false);
236         RefPtr<GestureEvent> gestureEvent = GestureEvent::create(domWindow, platformGestureEvent);
237         WebGestureEventBuilder webGestureBuilder(view, docRenderer, *gestureEvent);
238
239         EXPECT_EQ(10, webGestureBuilder.x);
240         EXPECT_EQ(10, webGestureBuilder.y);
241         EXPECT_EQ(10, webGestureBuilder.globalX);
242         EXPECT_EQ(10, webGestureBuilder.globalY);
243         EXPECT_EQ(10, webGestureBuilder.data.scrollUpdate.deltaX);
244         EXPECT_EQ(10, webGestureBuilder.data.scrollUpdate.deltaY);
245     }
246
247     {
248         RefPtr<Touch> touch = Touch::create(webViewImpl->page()->mainFrame(), document.get(), 0, 10, 10, 10, 10, 10, 10, 0, 0);
249         RefPtr<TouchList> touchList = TouchList::create();
250         touchList->append(touch);
251         RefPtr<TouchEvent> touchEvent = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(), WebCore::eventNames().touchmoveEvent, domWindow, 10, 10, 10, 10, false, false, false, false);
252
253         WebTouchEventBuilder webTouchBuilder(view, docRenderer, *touchEvent);
254         ASSERT_EQ(1u, webTouchBuilder.touchesLength);
255         EXPECT_EQ(10, webTouchBuilder.touches[0].screenPosition.x);
256         EXPECT_EQ(10, webTouchBuilder.touches[0].screenPosition.y);
257         EXPECT_EQ(10, webTouchBuilder.touches[0].position.x);
258         EXPECT_EQ(10, webTouchBuilder.touches[0].position.y);
259         EXPECT_EQ(10, webTouchBuilder.touches[0].radiusX);
260         EXPECT_EQ(10, webTouchBuilder.touches[0].radiusY);
261     }
262
263     webViewImpl->close();
264 }
265
266 } // anonymous namespace