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 717