text: // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  
  /*
    EventSendingController class:
    Bound to a JavaScript window.eventSender object using
    CppBoundClass::BindToJavascript(), this allows layout tests that are run in
    the test_shell to fire DOM events.
  
    The OSX reference file is in
    WebKit/WebKitTools/DumpRenderTree/EventSendingController.m
  */
  
  #ifndef WEBKIT_TOOLS_TEST_SHELL_EVENT_SENDING_CONTROLLER_H_
  #define WEBKIT_TOOLS_TEST_SHELL_EVENT_SENDING_CONTROLLER_H_
  
  #include "build/build_config.h"
  #include "base/gfx/point.h"
  #include "base/task.h"
  #include "webkit/api/public/WebInputEvent.h"
  #include "webkit/glue/cpp_bound_class.h"
  
  class TestShell;
  class WebView;
  
  namespace WebKit {
  class WebDragData;
  class WebMouseEvent;
  }
  
  class EventSendingController : public CppBoundClass {
   public:
    // Builds the property and method lists needed to bind this class to a JS
    // object.
    EventSendingController(TestShell* shell);
  
    // Resets some static variable state.
    void Reset();
  
    // Simulate drag&drop system call.
    static void DoDragDrop(const WebKit::WebDragData& drag_data);
  
    // JS callback methods.
    void mouseDown(const CppArgumentList& args, CppVariant* result);
    void mouseUp(const CppArgumentList& args, CppVariant* result);
    void mouseMoveTo(const CppArgumentList& args, CppVariant* result);
    void leapForward(const CppArgumentList& args, CppVariant* result);
    void keyDown(const CppArgumentList& args, CppVariant* result);
    void dispatchMessage(const CppArgumentList& args, CppVariant* result);
    void textZoomIn(const CppArgumentList& args, CppVariant* result);
    void textZoomOut(const CppArgumentList& args, CppVariant* result);
    void zoomPageIn(const CppArgumentList& args, CppVariant* result);
    void zoomPageOut(const CppArgumentList& args, CppVariant* result);
    void scheduleAsynchronousClick(const CppArgumentList& args,
                                   CppVariant* result);
  
    // Unimplemented stubs
    void contextClick(const CppArgumentList& args, CppVariant* result);
    void enableDOMUIEventLogging(const CppArgumentList& args, CppVariant* result);
    void fireKeyboardEventsToElement(const CppArgumentList& args, CppVariant* result);
    void clearKillRing(const CppArgumentList& args, CppVariant* result);
    CppVariant dragMode;
  
    // Properties used in layout tests.
  #if defined(OS_WIN)
    CppVariant wmKeyDown;
    CppVariant wmKeyUp;
    CppVariant wmChar;
    CppVariant wmDeadChar;
    CppVariant wmSysKeyDown;
    CppVariant wmSysKeyUp;
    CppVariant wmSysChar;
    CppVariant wmSysDeadChar;
  #endif
  
   private:
    // Returns the test shell's webview.
    static WebView* webview();
  
    // Returns true if dragMode is true.
    bool drag_mode() { return dragMode.isBool() && dragMode.ToBoolean(); }
  
    // Sometimes we queue up mouse move and mouse up events for drag drop
    // handling purposes.  These methods dispatch the event.
    static void DoMouseMove(const WebKit::WebMouseEvent& e);
    static void DoMouseUp(const WebKit::WebMouseEvent& e);
    static void ReplaySavedEvents();
  
    // Helper to return the button type given a button code
    static WebKit::WebMouseEvent::Button GetButtonTypeFromButtonNumber(
        int button_code);
  
    // Helper to extract the button number from the optional argument in
    // mouseDown and mouseUp
    static int GetButtonNumberFromSingleArg(const CppArgumentList& args);
  
    // Returns true if the key_code passed in needs a shift key modifier to
    // be passed into the generated event.
    bool NeedsShiftModifier(int key_code);
  
    ScopedRunnableMethodFactory<EventSendingController> method_factory_;
  
    // Non-owning pointer.  The LayoutTestController is owned by the host.
    static TestShell* shell_;
  
    // Location of last mouseMoveTo event.
    static gfx::Point last_mouse_pos_;
  
    // Currently pressed mouse button (Left/Right/Middle or None)
    static WebKit::WebMouseEvent::Button pressed_button_;
  
    // The last button number passed to mouseDown and mouseUp.
    // Used to determine whether the click count continues to
    // increment or not.
    static int last_button_number_;
  };
  
  #endif  // WEBKIT_TOOLS_TEST_SHELL_EVENT_SENDING_CONTROLLER_H_
  