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 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 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 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 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 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 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 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 497 static void setupVirtualViewportPinch(WebSettings* settings) 498 { 499 settings->setPinchVirtualViewportEnabled(true); 500 settings->setAcceleratedCompositingEnabled(true); 501 } 502 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