Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / web / 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 "web/WebInputEventConversion.h"
34
35 #include "core/dom/Touch.h"
36 #include "core/dom/TouchList.h"
37 #include "core/events/GestureEvent.h"
38 #include "core/events/KeyboardEvent.h"
39 #include "core/events/MouseEvent.h"
40 #include "core/events/TouchEvent.h"
41 #include "core/frame/FrameHost.h"
42 #include "core/frame/FrameView.h"
43 #include "core/frame/LocalFrame.h"
44 #include "core/page/Page.h"
45 #include "core/rendering/RenderView.h"
46 #include "core/testing/URLTestHelpers.h"
47 #include "public/web/WebFrame.h"
48 #include "public/web/WebSettings.h"
49 #include "web/WebViewImpl.h"
50 #include "web/tests/FrameTestHelpers.h"
51 #include <gtest/gtest.h>
52
53 using namespace blink;
54
55 namespace {
56
57 PassRefPtrWillBeRawPtr<KeyboardEvent> createKeyboardEventWithLocation(KeyboardEvent::KeyLocationCode location)
58 {
59     return KeyboardEvent::create("keydown", true, true, 0, "", location, false, false, false, false);
60 }
61
62 int getModifiersForKeyLocationCode(KeyboardEvent::KeyLocationCode location)
63 {
64     RefPtrWillBeRawPtr<KeyboardEvent> event = createKeyboardEventWithLocation(location);
65     WebKeyboardEventBuilder convertedEvent(*event);
66     return convertedEvent.modifiers;
67 }
68
69 TEST(WebInputEventConversionTest, WebKeyboardEventBuilder)
70 {
71     // Test key location conversion.
72     int modifiers = getModifiersForKeyLocationCode(KeyboardEvent::DOM_KEY_LOCATION_STANDARD);
73     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsLeft || modifiers & WebInputEvent::IsRight);
74
75     modifiers = getModifiersForKeyLocationCode(KeyboardEvent::DOM_KEY_LOCATION_LEFT);
76     EXPECT_TRUE(modifiers & WebInputEvent::IsLeft);
77     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsRight);
78
79     modifiers = getModifiersForKeyLocationCode(KeyboardEvent::DOM_KEY_LOCATION_RIGHT);
80     EXPECT_TRUE(modifiers & WebInputEvent::IsRight);
81     EXPECT_FALSE(modifiers & WebInputEvent::IsKeyPad || modifiers & WebInputEvent::IsLeft);
82
83     modifiers = getModifiersForKeyLocationCode(KeyboardEvent::DOM_KEY_LOCATION_NUMPAD);
84     EXPECT_TRUE(modifiers & WebInputEvent::IsKeyPad);
85     EXPECT_FALSE(modifiers & WebInputEvent::IsLeft || modifiers & WebInputEvent::IsRight);
86 }
87
88 TEST(WebInputEventConversionTest, WebMouseEventBuilder)
89 {
90     RefPtrWillBeRawPtr<TouchEvent> event = TouchEvent::create();
91     WebMouseEventBuilder mouse(0, 0, *event);
92     EXPECT_EQ(WebInputEvent::Undefined, mouse.type);
93 }
94
95 TEST(WebInputEventConversionTest, WebTouchEventBuilder)
96 {
97     const std::string baseURL("http://www.test0.com/");
98     const std::string fileName("fixed_layout.html");
99
100     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
101     FrameTestHelpers::WebViewHelper webViewHelper;
102     WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(baseURL + fileName, true);
103     int pageWidth = 640;
104     int pageHeight = 480;
105     webViewImpl->resize(WebSize(pageWidth, pageHeight));
106     webViewImpl->layout();
107
108     FrameView* view = toLocalFrame(webViewImpl->page()->mainFrame())->view();
109     RefPtrWillBeRawPtr<Document> document = toLocalFrame(webViewImpl->page()->mainFrame())->document();
110     LocalDOMWindow* domWindow = document->domWindow();
111     RenderView* documentRenderView = document->renderView();
112
113     WebTouchPoint p0, p1;
114     p0.id = 1;
115     p1.id = 2;
116     p0.screenPosition = WebFloatPoint(100.f, 50.f);
117     p1.screenPosition = WebFloatPoint(150.f, 25.f);
118     p0.position = WebFloatPoint(10.f, 10.f);
119     p1.position = WebFloatPoint(5.f, 5.f);
120     p0.radiusX = p1.radiusY = 10.f;
121     p0.radiusY = p1.radiusX = 5.f;
122     p0.rotationAngle = p1.rotationAngle = 1.f;
123     p0.force = p1.force = 25.f;
124
125     RefPtrWillBeRawPtr<Touch> touch0 = Touch::create(toLocalFrame(webViewImpl->page()->mainFrame()), document.get(), p0.id, p0.screenPosition, p0.position, FloatSize(p0.radiusX, p0.radiusY), p0.rotationAngle, p0.force);
126     RefPtrWillBeRawPtr<Touch> touch1 = Touch::create(toLocalFrame(webViewImpl->page()->mainFrame()), document.get(), p1.id, p1.screenPosition, p1.position, FloatSize(p1.radiusX, p1.radiusY), p1.rotationAngle, p1.force);
127
128     // Test touchstart.
129     {
130         RefPtrWillBeRawPtr<TouchList> touchList = TouchList::create();
131         touchList->append(touch0);
132         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(), EventTypeNames::touchstart, domWindow, false, false, false, false, false);
133
134         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
135         ASSERT_EQ(1u, webTouchBuilder.touchesLength);
136         EXPECT_EQ(WebInputEvent::TouchStart, webTouchBuilder.type);
137         EXPECT_EQ(WebTouchPoint::StatePressed, webTouchBuilder.touches[0].state);
138         EXPECT_FLOAT_EQ(p0.screenPosition.x, webTouchBuilder.touches[0].screenPosition.x);
139         EXPECT_FLOAT_EQ(p0.screenPosition.y, webTouchBuilder.touches[0].screenPosition.y);
140         EXPECT_FLOAT_EQ(p0.position.x, webTouchBuilder.touches[0].position.x);
141         EXPECT_FLOAT_EQ(p0.position.y, webTouchBuilder.touches[0].position.y);
142         EXPECT_FLOAT_EQ(p0.radiusX, webTouchBuilder.touches[0].radiusX);
143         EXPECT_FLOAT_EQ(p0.radiusY, webTouchBuilder.touches[0].radiusY);
144         EXPECT_FLOAT_EQ(p0.rotationAngle, webTouchBuilder.touches[0].rotationAngle);
145         EXPECT_FLOAT_EQ(p0.force, webTouchBuilder.touches[0].force);
146     }
147
148     // Test touchmove.
149     {
150         RefPtrWillBeRawPtr<TouchList> activeTouchList = TouchList::create();
151         RefPtrWillBeRawPtr<TouchList> movedTouchList = TouchList::create();
152         activeTouchList->append(touch0);
153         activeTouchList->append(touch1);
154         movedTouchList->append(touch0);
155         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(activeTouchList.get(), activeTouchList.get(), movedTouchList.get(), EventTypeNames::touchmove, domWindow, false, false, false, false, false);
156
157         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
158         ASSERT_EQ(2u, webTouchBuilder.touchesLength);
159         EXPECT_EQ(WebInputEvent::TouchMove, webTouchBuilder.type);
160         EXPECT_EQ(WebTouchPoint::StateMoved, webTouchBuilder.touches[0].state);
161         EXPECT_EQ(WebTouchPoint::StateStationary, webTouchBuilder.touches[1].state);
162         EXPECT_EQ(p0.id, webTouchBuilder.touches[0].id);
163         EXPECT_EQ(p1.id, webTouchBuilder.touches[1].id);
164     }
165
166     // Test touchend.
167     {
168         RefPtrWillBeRawPtr<TouchList> activeTouchList = TouchList::create();
169         RefPtrWillBeRawPtr<TouchList> releasedTouchList = TouchList::create();
170         activeTouchList->append(touch0);
171         releasedTouchList->append(touch1);
172         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(activeTouchList.get(), activeTouchList.get(), releasedTouchList.get(), EventTypeNames::touchend, domWindow, false, false, false, false, false);
173
174         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
175         ASSERT_EQ(2u, webTouchBuilder.touchesLength);
176         EXPECT_EQ(WebInputEvent::TouchEnd, webTouchBuilder.type);
177         EXPECT_EQ(WebTouchPoint::StateReleased, webTouchBuilder.touches[0].state);
178         EXPECT_EQ(WebTouchPoint::StateStationary, webTouchBuilder.touches[1].state);
179         EXPECT_EQ(p1.id, webTouchBuilder.touches[0].id);
180         EXPECT_EQ(p0.id, webTouchBuilder.touches[1].id);
181     }
182
183     // Test touchcancel.
184     {
185         RefPtrWillBeRawPtr<TouchList> activeTouchList = TouchList::create();
186         RefPtrWillBeRawPtr<TouchList> cancelledTouchList = TouchList::create();
187         cancelledTouchList->append(touch0);
188         cancelledTouchList->append(touch1);
189         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(activeTouchList.get(), activeTouchList.get(), cancelledTouchList.get(), EventTypeNames::touchcancel, domWindow, false, false, false, false, false);
190
191         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
192         ASSERT_EQ(2u, webTouchBuilder.touchesLength);
193         EXPECT_EQ(WebInputEvent::TouchCancel, webTouchBuilder.type);
194         EXPECT_EQ(WebTouchPoint::StateCancelled, webTouchBuilder.touches[0].state);
195         EXPECT_EQ(WebTouchPoint::StateCancelled, webTouchBuilder.touches[1].state);
196         EXPECT_EQ(p0.id, webTouchBuilder.touches[0].id);
197         EXPECT_EQ(p1.id, webTouchBuilder.touches[1].id);
198     }
199
200     // Test max point limit.
201     {
202         RefPtrWillBeRawPtr<TouchList> touchList = TouchList::create();
203         RefPtrWillBeRawPtr<TouchList> changedTouchList = TouchList::create();
204         for (unsigned i = 0; i <= static_cast<unsigned>(WebTouchEvent::touchesLengthCap) * 2; ++i) {
205             RefPtrWillBeRawPtr<Touch> touch = Touch::create(toLocalFrame(webViewImpl->page()->mainFrame()), document.get(), i, p0.screenPosition, p0.position, FloatSize(p0.radiusX, p0.radiusY), p0.rotationAngle, p0.force);
206             touchList->append(touch);
207             changedTouchList->append(touch);
208         }
209         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(), EventTypeNames::touchstart, domWindow, false, false, false, false, false);
210
211         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
212         ASSERT_EQ(static_cast<unsigned>(WebTouchEvent::touchesLengthCap), webTouchBuilder.touchesLength);
213     }
214 }
215
216 TEST(WebInputEventConversionTest, InputEventsScaling)
217 {
218     const std::string baseURL("http://www.test.com/");
219     const std::string fileName("fixed_layout.html");
220
221     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
222     FrameTestHelpers::WebViewHelper webViewHelper;
223     WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(baseURL + fileName, true);
224     webViewImpl->settings()->setViewportEnabled(true);
225     int pageWidth = 640;
226     int pageHeight = 480;
227     webViewImpl->resize(WebSize(pageWidth, pageHeight));
228     webViewImpl->layout();
229
230     webViewImpl->setPageScaleFactor(2);
231
232     FrameView* view = toLocalFrame(webViewImpl->page()->mainFrame())->view();
233     RefPtrWillBeRawPtr<Document> document = toLocalFrame(webViewImpl->page()->mainFrame())->document();
234     LocalDOMWindow* domWindow = document->domWindow();
235     RenderView* documentRenderView = document->renderView();
236
237     {
238         WebMouseEvent webMouseEvent;
239         webMouseEvent.type = WebInputEvent::MouseMove;
240         webMouseEvent.x = 10;
241         webMouseEvent.y = 10;
242         webMouseEvent.windowX = 10;
243         webMouseEvent.windowY = 10;
244         webMouseEvent.globalX = 10;
245         webMouseEvent.globalY = 10;
246         webMouseEvent.movementX = 10;
247         webMouseEvent.movementY = 10;
248
249         PlatformMouseEventBuilder platformMouseBuilder(view, webMouseEvent);
250         EXPECT_EQ(5, platformMouseBuilder.position().x());
251         EXPECT_EQ(5, platformMouseBuilder.position().y());
252         EXPECT_EQ(10, platformMouseBuilder.globalPosition().x());
253         EXPECT_EQ(10, platformMouseBuilder.globalPosition().y());
254         EXPECT_EQ(5, platformMouseBuilder.movementDelta().x());
255         EXPECT_EQ(5, platformMouseBuilder.movementDelta().y());
256     }
257
258     {
259         WebGestureEvent webGestureEvent;
260         webGestureEvent.type = WebInputEvent::GestureScrollUpdate;
261         webGestureEvent.x = 10;
262         webGestureEvent.y = 10;
263         webGestureEvent.globalX = 10;
264         webGestureEvent.globalY = 10;
265         webGestureEvent.data.scrollUpdate.deltaX = 10;
266         webGestureEvent.data.scrollUpdate.deltaY = 10;
267
268         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
269         EXPECT_EQ(5, platformGestureBuilder.position().x());
270         EXPECT_EQ(5, platformGestureBuilder.position().y());
271         EXPECT_EQ(10, platformGestureBuilder.globalPosition().x());
272         EXPECT_EQ(10, platformGestureBuilder.globalPosition().y());
273         EXPECT_EQ(5, platformGestureBuilder.deltaX());
274         EXPECT_EQ(5, platformGestureBuilder.deltaY());
275     }
276
277     {
278         WebGestureEvent webGestureEvent;
279         webGestureEvent.type = WebInputEvent::GestureTap;
280         webGestureEvent.data.tap.width = 10;
281         webGestureEvent.data.tap.height = 10;
282
283         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
284         EXPECT_EQ(5, platformGestureBuilder.area().width());
285         EXPECT_EQ(5, platformGestureBuilder.area().height());
286     }
287
288     {
289         WebGestureEvent webGestureEvent;
290         webGestureEvent.type = WebInputEvent::GestureTapUnconfirmed;
291         webGestureEvent.data.tap.width = 10;
292         webGestureEvent.data.tap.height = 10;
293
294         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
295         EXPECT_EQ(5, platformGestureBuilder.area().width());
296         EXPECT_EQ(5, platformGestureBuilder.area().height());
297     }
298
299     {
300         WebGestureEvent webGestureEvent;
301         webGestureEvent.type = WebInputEvent::GestureTapDown;
302         webGestureEvent.data.tapDown.width = 10;
303         webGestureEvent.data.tapDown.height = 10;
304
305         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
306         EXPECT_EQ(5, platformGestureBuilder.area().width());
307         EXPECT_EQ(5, platformGestureBuilder.area().height());
308     }
309
310     {
311         WebGestureEvent webGestureEvent;
312         webGestureEvent.type = WebInputEvent::GestureShowPress;
313         webGestureEvent.data.showPress.width = 10;
314         webGestureEvent.data.showPress.height = 10;
315
316         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
317         EXPECT_EQ(5, platformGestureBuilder.area().width());
318         EXPECT_EQ(5, platformGestureBuilder.area().height());
319     }
320
321     {
322         WebGestureEvent webGestureEvent;
323         webGestureEvent.type = WebInputEvent::GestureLongPress;
324         webGestureEvent.data.longPress.width = 10;
325         webGestureEvent.data.longPress.height = 10;
326
327         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
328         EXPECT_EQ(5, platformGestureBuilder.area().width());
329         EXPECT_EQ(5, platformGestureBuilder.area().height());
330     }
331
332     {
333         WebGestureEvent webGestureEvent;
334         webGestureEvent.type = WebInputEvent::GestureTwoFingerTap;
335         webGestureEvent.data.twoFingerTap.firstFingerWidth = 10;
336         webGestureEvent.data.twoFingerTap.firstFingerHeight = 10;
337
338         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
339         EXPECT_EQ(5, platformGestureBuilder.area().width());
340         EXPECT_EQ(5, platformGestureBuilder.area().height());
341     }
342
343     {
344         WebTouchEvent webTouchEvent;
345         webTouchEvent.type = WebInputEvent::TouchMove;
346         webTouchEvent.touchesLength = 1;
347         webTouchEvent.touches[0].state = WebTouchPoint::StateMoved;
348         webTouchEvent.touches[0].screenPosition.x = 10.6f;
349         webTouchEvent.touches[0].screenPosition.y = 10.4f;
350         webTouchEvent.touches[0].position.x = 10.6f;
351         webTouchEvent.touches[0].position.y = 10.4f;
352         webTouchEvent.touches[0].radiusX = 10.6f;
353         webTouchEvent.touches[0].radiusY = 10.4f;
354
355         EXPECT_FLOAT_EQ(10.6f, webTouchEvent.touches[0].screenPosition.x);
356         EXPECT_FLOAT_EQ(10.4f, webTouchEvent.touches[0].screenPosition.y);
357         EXPECT_FLOAT_EQ(10.6f, webTouchEvent.touches[0].position.x);
358         EXPECT_FLOAT_EQ(10.4f, webTouchEvent.touches[0].position.y);
359         EXPECT_FLOAT_EQ(10.6f, webTouchEvent.touches[0].radiusX);
360         EXPECT_FLOAT_EQ(10.4f, webTouchEvent.touches[0].radiusY);
361
362         PlatformTouchEventBuilder platformTouchBuilder(view, webTouchEvent);
363         EXPECT_FLOAT_EQ(10.6f, platformTouchBuilder.touchPoints()[0].screenPos().x());
364         EXPECT_FLOAT_EQ(10.4f, platformTouchBuilder.touchPoints()[0].screenPos().y());
365         EXPECT_FLOAT_EQ(5.3f, platformTouchBuilder.touchPoints()[0].pos().x());
366         EXPECT_FLOAT_EQ(5.2f, platformTouchBuilder.touchPoints()[0].pos().y());
367         EXPECT_FLOAT_EQ(5.3f, platformTouchBuilder.touchPoints()[0].radius().width());
368         EXPECT_FLOAT_EQ(5.2f, platformTouchBuilder.touchPoints()[0].radius().height());
369     }
370
371     // Reverse builders should *not* go back to physical pixels, as they are used for plugins
372     // which expect CSS pixel coordinates.
373     {
374         PlatformMouseEvent platformMouseEvent(IntPoint(10, 10), IntPoint(10, 10), LeftButton, PlatformEvent::MouseMoved, 1, false, false, false, false, PlatformMouseEvent::RealOrIndistinguishable, 0);
375         RefPtrWillBeRawPtr<MouseEvent> mouseEvent = MouseEvent::create(EventTypeNames::mousemove, domWindow, platformMouseEvent, 0, document);
376         WebMouseEventBuilder webMouseBuilder(view, documentRenderView, *mouseEvent);
377
378         EXPECT_EQ(10, webMouseBuilder.x);
379         EXPECT_EQ(10, webMouseBuilder.y);
380         EXPECT_EQ(10, webMouseBuilder.globalX);
381         EXPECT_EQ(10, webMouseBuilder.globalY);
382         EXPECT_EQ(10, webMouseBuilder.windowX);
383         EXPECT_EQ(10, webMouseBuilder.windowY);
384     }
385
386     {
387         PlatformMouseEvent platformMouseEvent(IntPoint(10, 10), IntPoint(10, 10), NoButton, PlatformEvent::MouseMoved, 1, false, false, false, false, PlatformMouseEvent::RealOrIndistinguishable, 0);
388         RefPtrWillBeRawPtr<MouseEvent> mouseEvent = MouseEvent::create(EventTypeNames::mousemove, domWindow, platformMouseEvent, 0, document);
389         WebMouseEventBuilder webMouseBuilder(view, documentRenderView, *mouseEvent);
390         EXPECT_EQ(WebMouseEvent::ButtonNone, webMouseBuilder.button);
391     }
392
393     {
394         PlatformGestureEvent platformGestureEvent(PlatformEvent::GestureScrollUpdate, IntPoint(10, 10), IntPoint(10, 10), IntSize(10, 10), 0, false, false, false, false, 10, 10, 10, 10);
395         RefPtrWillBeRawPtr<GestureEvent> gestureEvent = GestureEvent::create(domWindow, platformGestureEvent);
396         WebGestureEventBuilder webGestureBuilder(view, documentRenderView, *gestureEvent);
397
398         EXPECT_EQ(10, webGestureBuilder.x);
399         EXPECT_EQ(10, webGestureBuilder.y);
400         EXPECT_EQ(10, webGestureBuilder.globalX);
401         EXPECT_EQ(10, webGestureBuilder.globalY);
402         EXPECT_EQ(10, webGestureBuilder.data.scrollUpdate.deltaX);
403         EXPECT_EQ(10, webGestureBuilder.data.scrollUpdate.deltaY);
404     }
405
406     {
407         RefPtrWillBeRawPtr<Touch> touch = Touch::create(toLocalFrame(webViewImpl->page()->mainFrame()), document.get(), 0, FloatPoint(10, 9.5), FloatPoint(3.5, 2), FloatSize(4, 4.5), 0, 0);
408         RefPtrWillBeRawPtr<TouchList> touchList = TouchList::create();
409         touchList->append(touch);
410         RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(), EventTypeNames::touchmove, domWindow, false, false, false, false, false);
411
412         WebTouchEventBuilder webTouchBuilder(view, documentRenderView, *touchEvent);
413         ASSERT_EQ(1u, webTouchBuilder.touchesLength);
414         EXPECT_EQ(10, webTouchBuilder.touches[0].screenPosition.x);
415         EXPECT_FLOAT_EQ(9.5, webTouchBuilder.touches[0].screenPosition.y);
416         EXPECT_FLOAT_EQ(3.5, webTouchBuilder.touches[0].position.x);
417         EXPECT_FLOAT_EQ(2, webTouchBuilder.touches[0].position.y);
418         EXPECT_FLOAT_EQ(4, webTouchBuilder.touches[0].radiusX);
419         EXPECT_FLOAT_EQ(4.5, webTouchBuilder.touches[0].radiusY);
420         EXPECT_FALSE(webTouchBuilder.cancelable);
421     }
422 }
423
424 TEST(WebInputEventConversionTest, InputEventsTransform)
425 {
426     const std::string baseURL("http://www.test2.com/");
427     const std::string fileName("fixed_layout.html");
428
429     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
430     FrameTestHelpers::WebViewHelper webViewHelper;
431     WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(baseURL + fileName, true);
432     webViewImpl->settings()->setViewportEnabled(true);
433     int pageWidth = 640;
434     int pageHeight = 480;
435     webViewImpl->resize(WebSize(pageWidth, pageHeight));
436     webViewImpl->layout();
437
438     webViewImpl->setPageScaleFactor(2);
439     webViewImpl->setRootLayerTransform(WebSize(10, 20), 1.5);
440
441     FrameView* view = toLocalFrame(webViewImpl->page()->mainFrame())->view();
442
443     {
444         WebMouseEvent webMouseEvent;
445         webMouseEvent.type = WebInputEvent::MouseMove;
446         webMouseEvent.x = 100;
447         webMouseEvent.y = 110;
448         webMouseEvent.windowX = 100;
449         webMouseEvent.windowY = 110;
450         webMouseEvent.globalX = 100;
451         webMouseEvent.globalY = 110;
452         webMouseEvent.movementX = 60;
453         webMouseEvent.movementY = 60;
454
455         PlatformMouseEventBuilder platformMouseBuilder(view, webMouseEvent);
456         EXPECT_EQ(30, platformMouseBuilder.position().x());
457         EXPECT_EQ(30, platformMouseBuilder.position().y());
458         EXPECT_EQ(100, platformMouseBuilder.globalPosition().x());
459         EXPECT_EQ(110, platformMouseBuilder.globalPosition().y());
460         EXPECT_EQ(20, platformMouseBuilder.movementDelta().x());
461         EXPECT_EQ(20, platformMouseBuilder.movementDelta().y());
462     }
463
464     {
465         WebGestureEvent webGestureEvent;
466         webGestureEvent.type = WebInputEvent::GestureScrollUpdate;
467         webGestureEvent.x = 100;
468         webGestureEvent.y = 110;
469         webGestureEvent.globalX = 100;
470         webGestureEvent.globalY = 110;
471         webGestureEvent.data.scrollUpdate.deltaX = 60;
472         webGestureEvent.data.scrollUpdate.deltaY = 60;
473
474         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
475         EXPECT_EQ(30, platformGestureBuilder.position().x());
476         EXPECT_EQ(30, platformGestureBuilder.position().y());
477         EXPECT_EQ(100, platformGestureBuilder.globalPosition().x());
478         EXPECT_EQ(110, platformGestureBuilder.globalPosition().y());
479         EXPECT_EQ(20, platformGestureBuilder.deltaX());
480         EXPECT_EQ(20, platformGestureBuilder.deltaY());
481     }
482
483     {
484         WebGestureEvent webGestureEvent;
485         webGestureEvent.type = WebInputEvent::GestureTap;
486         webGestureEvent.data.tap.width = 30;
487         webGestureEvent.data.tap.height = 30;
488
489         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
490         EXPECT_EQ(10, platformGestureBuilder.area().width());
491         EXPECT_EQ(10, platformGestureBuilder.area().height());
492     }
493
494     {
495         WebGestureEvent webGestureEvent;
496         webGestureEvent.type = WebInputEvent::GestureTapUnconfirmed;
497         webGestureEvent.data.tap.width = 30;
498         webGestureEvent.data.tap.height = 30;
499
500         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
501         EXPECT_EQ(10, platformGestureBuilder.area().width());
502         EXPECT_EQ(10, platformGestureBuilder.area().height());
503     }
504
505     {
506         WebGestureEvent webGestureEvent;
507         webGestureEvent.type = WebInputEvent::GestureTapDown;
508         webGestureEvent.data.tapDown.width = 30;
509         webGestureEvent.data.tapDown.height = 30;
510
511         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
512         EXPECT_EQ(10, platformGestureBuilder.area().width());
513         EXPECT_EQ(10, platformGestureBuilder.area().height());
514     }
515
516     {
517         WebGestureEvent webGestureEvent;
518         webGestureEvent.type = WebInputEvent::GestureShowPress;
519         webGestureEvent.data.showPress.width = 30;
520         webGestureEvent.data.showPress.height = 30;
521
522         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
523         EXPECT_EQ(10, platformGestureBuilder.area().width());
524         EXPECT_EQ(10, platformGestureBuilder.area().height());
525     }
526
527     {
528         WebGestureEvent webGestureEvent;
529         webGestureEvent.type = WebInputEvent::GestureLongPress;
530         webGestureEvent.data.longPress.width = 30;
531         webGestureEvent.data.longPress.height = 30;
532
533         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
534         EXPECT_EQ(10, platformGestureBuilder.area().width());
535         EXPECT_EQ(10, platformGestureBuilder.area().height());
536     }
537
538     {
539         WebGestureEvent webGestureEvent;
540         webGestureEvent.type = WebInputEvent::GestureTwoFingerTap;
541         webGestureEvent.data.twoFingerTap.firstFingerWidth = 30;
542         webGestureEvent.data.twoFingerTap.firstFingerHeight = 30;
543
544         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
545         EXPECT_EQ(10, platformGestureBuilder.area().width());
546         EXPECT_EQ(10, platformGestureBuilder.area().height());
547     }
548
549     {
550         WebTouchEvent webTouchEvent;
551         webTouchEvent.type = WebInputEvent::TouchMove;
552         webTouchEvent.touchesLength = 1;
553         webTouchEvent.touches[0].state = WebTouchPoint::StateMoved;
554         webTouchEvent.touches[0].screenPosition.x = 100;
555         webTouchEvent.touches[0].screenPosition.y = 110;
556         webTouchEvent.touches[0].position.x = 100;
557         webTouchEvent.touches[0].position.y = 110;
558         webTouchEvent.touches[0].radiusX = 30;
559         webTouchEvent.touches[0].radiusY = 30;
560
561         PlatformTouchEventBuilder platformTouchBuilder(view, webTouchEvent);
562         EXPECT_FLOAT_EQ(100, platformTouchBuilder.touchPoints()[0].screenPos().x());
563         EXPECT_FLOAT_EQ(110, platformTouchBuilder.touchPoints()[0].screenPos().y());
564         EXPECT_FLOAT_EQ(30, platformTouchBuilder.touchPoints()[0].pos().x());
565         EXPECT_FLOAT_EQ(30, platformTouchBuilder.touchPoints()[0].pos().y());
566         EXPECT_FLOAT_EQ(10, platformTouchBuilder.touchPoints()[0].radius().width());
567         EXPECT_FLOAT_EQ(10, platformTouchBuilder.touchPoints()[0].radius().height());
568     }
569 }
570
571 TEST(WebInputEventConversionTest, InputEventsConversions)
572 {
573     const std::string baseURL("http://www.test3.com/");
574     const std::string fileName("fixed_layout.html");
575
576     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
577     FrameTestHelpers::WebViewHelper webViewHelper;
578     WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(baseURL + fileName, true);
579     int pageWidth = 640;
580     int pageHeight = 480;
581     webViewImpl->resize(WebSize(pageWidth, pageHeight));
582     webViewImpl->layout();
583
584     FrameView* view = toLocalFrame(webViewImpl->page()->mainFrame())->view();
585     RefPtrWillBeRawPtr<Document> document = toLocalFrame(webViewImpl->page()->mainFrame())->document();
586     LocalDOMWindow* domWindow = document->domWindow();
587     RenderView* documentRenderView = document->renderView();
588
589     {
590         WebGestureEvent webGestureEvent;
591         webGestureEvent.type = WebInputEvent::GestureTap;
592         webGestureEvent.x = 10;
593         webGestureEvent.y = 10;
594         webGestureEvent.globalX = 10;
595         webGestureEvent.globalY = 10;
596         webGestureEvent.data.tap.tapCount = 1;
597         webGestureEvent.data.tap.width = 10;
598         webGestureEvent.data.tap.height = 10;
599
600         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
601         EXPECT_EQ(10.f, platformGestureBuilder.position().x());
602         EXPECT_EQ(10.f, platformGestureBuilder.position().y());
603         EXPECT_EQ(10.f, platformGestureBuilder.globalPosition().x());
604         EXPECT_EQ(10.f, platformGestureBuilder.globalPosition().y());
605         EXPECT_EQ(1, platformGestureBuilder.tapCount());
606
607         RefPtrWillBeRawPtr<GestureEvent> coreGestureEvent = GestureEvent::create(domWindow, platformGestureBuilder);
608         WebGestureEventBuilder recreatedWebGestureEvent(view, documentRenderView, *coreGestureEvent);
609         EXPECT_EQ(webGestureEvent.type, recreatedWebGestureEvent.type);
610         EXPECT_EQ(webGestureEvent.x, recreatedWebGestureEvent.x);
611         EXPECT_EQ(webGestureEvent.y, recreatedWebGestureEvent.y);
612         EXPECT_EQ(webGestureEvent.globalX, recreatedWebGestureEvent.globalX);
613         EXPECT_EQ(webGestureEvent.globalY, recreatedWebGestureEvent.globalY);
614         EXPECT_EQ(webGestureEvent.data.tap.tapCount, recreatedWebGestureEvent.data.tap.tapCount);
615     }
616 }
617
618 static void setupVirtualViewportPinch(WebSettings* settings)
619 {
620     settings->setPinchVirtualViewportEnabled(true);
621     settings->setAcceleratedCompositingEnabled(true);
622 }
623
624 TEST(WebInputEventConversionTest, PinchViewportOffset)
625 {
626     const std::string baseURL("http://www.test4.com/");
627     const std::string fileName("fixed_layout.html");
628
629     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL.c_str()), WebString::fromUTF8("fixed_layout.html"));
630     FrameTestHelpers::WebViewHelper webViewHelper;
631     WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(baseURL + fileName, true, 0, 0, setupVirtualViewportPinch);
632     int pageWidth = 640;
633     int pageHeight = 480;
634     webViewImpl->resize(WebSize(pageWidth, pageHeight));
635     webViewImpl->layout();
636
637     webViewImpl->setPageScaleFactor(2);
638
639     IntPoint pinchOffset(35, 60);
640     webViewImpl->page()->frameHost().pinchViewport().setLocation(pinchOffset);
641
642     FrameView* view = toLocalFrame(webViewImpl->page()->mainFrame())->view();
643
644     {
645         WebMouseEvent webMouseEvent;
646         webMouseEvent.type = WebInputEvent::MouseMove;
647         webMouseEvent.x = 10;
648         webMouseEvent.y = 10;
649         webMouseEvent.windowX = 10;
650         webMouseEvent.windowY = 10;
651         webMouseEvent.globalX = 10;
652         webMouseEvent.globalY = 10;
653
654         PlatformMouseEventBuilder platformMouseBuilder(view, webMouseEvent);
655         EXPECT_EQ(5 + pinchOffset.x(), platformMouseBuilder.position().x());
656         EXPECT_EQ(5 + pinchOffset.y(), platformMouseBuilder.position().y());
657         EXPECT_EQ(10, platformMouseBuilder.globalPosition().x());
658         EXPECT_EQ(10, platformMouseBuilder.globalPosition().y());
659     }
660
661     {
662         WebMouseWheelEvent webMouseWheelEvent;
663         webMouseWheelEvent.type = WebInputEvent::MouseWheel;
664         webMouseWheelEvent.x = 10;
665         webMouseWheelEvent.y = 10;
666         webMouseWheelEvent.windowX = 10;
667         webMouseWheelEvent.windowY = 10;
668         webMouseWheelEvent.globalX = 10;
669         webMouseWheelEvent.globalY = 10;
670
671         PlatformWheelEventBuilder platformWheelBuilder(view, webMouseWheelEvent);
672         EXPECT_EQ(5 + pinchOffset.x(), platformWheelBuilder.position().x());
673         EXPECT_EQ(5 + pinchOffset.y(), platformWheelBuilder.position().y());
674         EXPECT_EQ(10, platformWheelBuilder.globalPosition().x());
675         EXPECT_EQ(10, platformWheelBuilder.globalPosition().y());
676     }
677
678     {
679         WebGestureEvent webGestureEvent;
680         webGestureEvent.type = WebInputEvent::GestureScrollUpdate;
681         webGestureEvent.x = 10;
682         webGestureEvent.y = 10;
683         webGestureEvent.globalX = 10;
684         webGestureEvent.globalY = 10;
685
686         PlatformGestureEventBuilder platformGestureBuilder(view, webGestureEvent);
687         EXPECT_EQ(5 + pinchOffset.x(), platformGestureBuilder.position().x());
688         EXPECT_EQ(5 + pinchOffset.y(), platformGestureBuilder.position().y());
689         EXPECT_EQ(10, platformGestureBuilder.globalPosition().x());
690         EXPECT_EQ(10, platformGestureBuilder.globalPosition().y());
691     }
692
693     {
694         WebTouchEvent webTouchEvent;
695         webTouchEvent.type = WebInputEvent::TouchMove;
696         webTouchEvent.touchesLength = 1;
697         webTouchEvent.touches[0].state = WebTouchPoint::StateMoved;
698         webTouchEvent.touches[0].screenPosition.x = 10.6f;
699         webTouchEvent.touches[0].screenPosition.y = 10.4f;
700         webTouchEvent.touches[0].position.x = 10.6f;
701         webTouchEvent.touches[0].position.y = 10.4f;
702
703         EXPECT_FLOAT_EQ(10.6f, webTouchEvent.touches[0].screenPosition.x);
704         EXPECT_FLOAT_EQ(10.4f, webTouchEvent.touches[0].screenPosition.y);
705         EXPECT_FLOAT_EQ(10.6f, webTouchEvent.touches[0].position.x);
706         EXPECT_FLOAT_EQ(10.4f, webTouchEvent.touches[0].position.y);
707
708         PlatformTouchEventBuilder platformTouchBuilder(view, webTouchEvent);
709         EXPECT_FLOAT_EQ(10.6f, platformTouchBuilder.touchPoints()[0].screenPos().x());
710         EXPECT_FLOAT_EQ(10.4f, platformTouchBuilder.touchPoints()[0].screenPos().y());
711         EXPECT_FLOAT_EQ(5.3f + pinchOffset.x(), platformTouchBuilder.touchPoints()[0].pos().x());
712         EXPECT_FLOAT_EQ(5.2f + pinchOffset.y(), platformTouchBuilder.touchPoints()[0].pos().y());
713     }
714 }
715
716 } // anonymous namespace