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