Home | History | Annotate | Download | only in tests
      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