Home | History | Annotate | Download | only in runner
      1 /*
      2  * Copyright (C) 2010 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 /*
     32   EventSender class:
     33   Bound to a JavaScript window.eventSender object using
     34   CppBoundClass::bindToJavascript(), this allows layout tests to fire DOM events.
     35 */
     36 
     37 #ifndef EventSender_h
     38 #define EventSender_h
     39 
     40 #include "CppBoundClass.h"
     41 #include "public/platform/WebPoint.h"
     42 #include "public/testing/WebScopedPtr.h"
     43 #include "public/testing/WebTask.h"
     44 #include "public/web/WebDragOperation.h"
     45 #include "public/web/WebInputEvent.h"
     46 
     47 namespace blink {
     48 class WebDragData;
     49 class WebView;
     50 struct WebContextMenuData;
     51 }
     52 
     53 namespace WebTestRunner {
     54 
     55 class TestInterfaces;
     56 class WebTestDelegate;
     57 
     58 class EventSender : public CppBoundClass {
     59 public:
     60     explicit EventSender(TestInterfaces*);
     61     ~EventSender();
     62 
     63     void setDelegate(WebTestDelegate* delegate) { m_delegate = delegate; }
     64     void setWebView(blink::WebView* webView) { m_webView = webView; }
     65 
     66     void setContextMenuData(const blink::WebContextMenuData&);
     67 
     68     // Resets some static variable state.
     69     void reset();
     70 
     71     // Simulate drag&drop system call.
     72     void doDragDrop(const blink::WebDragData&, blink::WebDragOperationsMask);
     73 
     74     // Test helper for dragging out images.
     75     void dumpFilenameBeingDragged(const CppArgumentList&, CppVariant*);
     76 
     77     // JS callback methods.
     78     void contextClick(const CppArgumentList&, CppVariant*);
     79     void mouseDown(const CppArgumentList&, CppVariant*);
     80     void mouseUp(const CppArgumentList&, CppVariant*);
     81     void mouseMoveTo(const CppArgumentList&, CppVariant*);
     82     void leapForward(const CppArgumentList&, CppVariant*);
     83     void keyDown(const CppArgumentList&, CppVariant*);
     84     void dispatchMessage(const CppArgumentList&, CppVariant*);
     85     // FIXME: These aren't really events. They should be moved to layout controller.
     86     void textZoomIn(const CppArgumentList&, CppVariant*);
     87     void textZoomOut(const CppArgumentList&, CppVariant*);
     88     void zoomPageIn(const CppArgumentList&, CppVariant*);
     89     void zoomPageOut(const CppArgumentList&, CppVariant*);
     90     void setPageScaleFactor(const CppArgumentList&, CppVariant*);
     91 
     92     void mouseDragBegin(const CppArgumentList&, CppVariant*);
     93     void mouseDragEnd(const CppArgumentList&, CppVariant*);
     94     void mouseMomentumBegin(const CppArgumentList&, CppVariant*);
     95     void mouseMomentumScrollBy(const CppArgumentList&, CppVariant*);
     96     void mouseMomentumEnd(const CppArgumentList&, CppVariant*);
     97     void mouseScrollBy(const CppArgumentList&, CppVariant*);
     98     void continuousMouseScrollBy(const CppArgumentList&, CppVariant*);
     99     void scheduleAsynchronousClick(const CppArgumentList&, CppVariant*);
    100     void scheduleAsynchronousKeyDown(const CppArgumentList&, CppVariant*);
    101     void beginDragWithFiles(const CppArgumentList&, CppVariant*);
    102     CppVariant dragMode;
    103 
    104     void addTouchPoint(const CppArgumentList&, CppVariant*);
    105     void cancelTouchPoint(const CppArgumentList&, CppVariant*);
    106     void clearTouchPoints(const CppArgumentList&, CppVariant*);
    107     void releaseTouchPoint(const CppArgumentList&, CppVariant*);
    108     void setTouchModifier(const CppArgumentList&, CppVariant*);
    109     void touchCancel(const CppArgumentList&, CppVariant*);
    110     void touchEnd(const CppArgumentList&, CppVariant*);
    111     void touchMove(const CppArgumentList&, CppVariant*);
    112     void touchStart(const CppArgumentList&, CppVariant*);
    113     void updateTouchPoint(const CppArgumentList&, CppVariant*);
    114 
    115     void gestureFlingCancel(const CppArgumentList&, CppVariant*);
    116     void gestureFlingStart(const CppArgumentList&, CppVariant*);
    117     void gestureScrollBegin(const CppArgumentList&, CppVariant*);
    118     void gestureScrollEnd(const CppArgumentList&, CppVariant*);
    119     void gestureScrollFirstPoint(const CppArgumentList&, CppVariant*);
    120     void gestureScrollUpdate(const CppArgumentList&, CppVariant*);
    121     void gestureScrollUpdateWithoutPropagation(const CppArgumentList&, CppVariant*);
    122     void gestureTap(const CppArgumentList&, CppVariant*);
    123     void gestureTapDown(const CppArgumentList&, CppVariant*);
    124     void gestureShowPress(const CppArgumentList&, CppVariant*);
    125     void gestureTapCancel(const CppArgumentList&, CppVariant*);
    126     void gestureLongPress(const CppArgumentList&, CppVariant*);
    127     void gestureLongTap(const CppArgumentList&, CppVariant*);
    128     void gestureTwoFingerTap(const CppArgumentList&, CppVariant*);
    129     void gestureEvent(blink::WebInputEvent::Type, const CppArgumentList&);
    130 
    131     // Setting this to false makes EventSender not force layout() calls.
    132     // This makes it possible to test the standard WebCore event dispatch.
    133     CppVariant forceLayoutOnEvents;
    134 
    135     // Unimplemented stubs
    136     void enableDOMUIEventLogging(const CppArgumentList&, CppVariant*);
    137     void fireKeyboardEventsToElement(const CppArgumentList&, CppVariant*);
    138     void clearKillRing(const CppArgumentList&, CppVariant*);
    139 
    140     // Properties used in layout tests.
    141 #if defined(OS_WIN)
    142     CppVariant wmKeyDown;
    143     CppVariant wmKeyUp;
    144     CppVariant wmChar;
    145     CppVariant wmDeadChar;
    146     CppVariant wmSysKeyDown;
    147     CppVariant wmSysKeyUp;
    148     CppVariant wmSysChar;
    149     CppVariant wmSysDeadChar;
    150 #endif
    151 
    152     WebTaskList* taskList() { return &m_taskList; }
    153 
    154 private:
    155     blink::WebView* webview() { return m_webView; }
    156 
    157     // Returns true if dragMode is true.
    158     bool isDragMode() { return dragMode.isBool() && dragMode.toBoolean(); }
    159 
    160     bool shouldForceLayoutOnEvents() const { return forceLayoutOnEvents.isBool() && forceLayoutOnEvents.toBoolean(); }
    161 
    162     // Sometimes we queue up mouse move and mouse up events for drag drop
    163     // handling purposes. These methods dispatch the event.
    164     void doMouseMove(const blink::WebMouseEvent&);
    165     void doMouseUp(const blink::WebMouseEvent&);
    166     static void doLeapForward(int milliseconds);
    167     void replaySavedEvents();
    168 
    169     // Helper to return the button type given a button code
    170     static blink::WebMouseEvent::Button getButtonTypeFromButtonNumber(int);
    171 
    172     // Helper to extract the button number from the optional argument in
    173     // mouseDown and mouseUp
    174     static int getButtonNumberFromSingleArg(const CppArgumentList&);
    175 
    176     // Returns true if the specified key code passed in needs a shift key
    177     // modifier to be passed into the generated event.
    178     bool needsShiftModifier(int);
    179 
    180     void finishDragAndDrop(const blink::WebMouseEvent&, blink::WebDragOperation);
    181     void updateClickCountForButton(blink::WebMouseEvent::Button);
    182 
    183     // Compose a touch event from the current touch points and send it.
    184     void sendCurrentTouchEvent(const blink::WebInputEvent::Type);
    185 
    186     // Init a mouse wheel event from the given args.
    187     void initMouseWheelEvent(const CppArgumentList&, CppVariant*, bool continuous, blink::WebMouseWheelEvent*);
    188 
    189     WebTaskList m_taskList;
    190 
    191     TestInterfaces* m_testInterfaces;
    192     WebTestDelegate* m_delegate;
    193     blink::WebView* m_webView;
    194 
    195     WebScopedPtr<blink::WebContextMenuData> m_lastContextMenuData;
    196 
    197     // Location of the touch point that initiated a gesture.
    198     blink::WebPoint m_currentGestureLocation;
    199 
    200     // Location of last mouseMoveTo event.
    201     static blink::WebPoint lastMousePos;
    202 
    203     // Currently pressed mouse button (Left/Right/Middle or None)
    204     static blink::WebMouseEvent::Button pressedButton;
    205 
    206     // The last button number passed to mouseDown and mouseUp.
    207     // Used to determine whether the click count continues to
    208     // increment or not.
    209     static blink::WebMouseEvent::Button lastButtonType;
    210 };
    211 
    212 }
    213 
    214 #endif // EventSender_h
    215