1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_EVENT_SENDER_H_ 6 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_EVENT_SENDER_H_ 7 8 #include <queue> 9 #include <string> 10 #include <vector> 11 12 #include "base/macros.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/weak_ptr.h" 15 #include "build/build_config.h" 16 #include "content/shell/renderer/test_runner/WebTask.h" 17 #include "third_party/WebKit/public/platform/WebDragData.h" 18 #include "third_party/WebKit/public/platform/WebPoint.h" 19 #include "third_party/WebKit/public/web/WebDragOperation.h" 20 #include "third_party/WebKit/public/web/WebInputEvent.h" 21 #include "third_party/WebKit/public/web/WebTouchPoint.h" 22 23 namespace blink { 24 class WebFrame; 25 class WebView; 26 struct WebContextMenuData; 27 } 28 29 namespace gin { 30 class Arguments; 31 } 32 33 namespace content { 34 35 class TestInterfaces; 36 class WebTestDelegate; 37 38 // Key event location code introduced in DOM Level 3. 39 // See also: http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboardevents 40 enum KeyLocationCode { 41 DOMKeyLocationStandard = 0x00, 42 DOMKeyLocationLeft = 0x01, 43 DOMKeyLocationRight = 0x02, 44 DOMKeyLocationNumpad = 0x03 45 }; 46 47 class EventSender : public base::SupportsWeakPtr<EventSender> { 48 public: 49 explicit EventSender(TestInterfaces*); 50 virtual ~EventSender(); 51 52 void Reset(); 53 void Install(blink::WebFrame*); 54 void SetDelegate(WebTestDelegate*); 55 void SetWebView(blink::WebView*); 56 57 void SetContextMenuData(const blink::WebContextMenuData&); 58 59 void DoDragDrop(const blink::WebDragData&, blink::WebDragOperationsMask); 60 61 void MouseDown(int button_number, int modifiers); 62 void MouseUp(int button_number, int modifiers); 63 void KeyDown(const std::string& code_str, 64 int modifiers, 65 KeyLocationCode location); 66 67 WebTaskList* mutable_task_list() { return &task_list_; } 68 69 private: 70 friend class EventSenderBindings; 71 72 struct SavedEvent { 73 enum SavedEventType { 74 TYPE_UNSPECIFIED, 75 TYPE_MOUSE_UP, 76 TYPE_MOUSE_MOVE, 77 TYPE_LEAP_FORWARD 78 }; 79 80 SavedEvent(); 81 82 SavedEventType type; 83 blink::WebMouseEvent::Button button_type; // For MouseUp. 84 blink::WebPoint pos; // For MouseMove. 85 int milliseconds; // For LeapForward. 86 int modifiers; 87 }; 88 89 void EnableDOMUIEventLogging(); 90 void FireKeyboardEventsToElement(); 91 void ClearKillRing(); 92 93 std::vector<std::string> ContextClick(); 94 95 void TextZoomIn(); 96 void TextZoomOut(); 97 98 void ZoomPageIn(); 99 void ZoomPageOut(); 100 void SetPageZoomFactor(double zoom_factor); 101 102 void SetPageScaleFactor(float scale_factor, int x, int y); 103 104 void ClearTouchPoints(); 105 void ReleaseTouchPoint(unsigned index); 106 void UpdateTouchPoint(unsigned index, float x, float y); 107 void CancelTouchPoint(unsigned index); 108 void SetTouchModifier(const std::string& key_name, bool set_mask); 109 void SetTouchCancelable(bool cancelable); 110 void ThrowTouchPointError(); 111 112 void DumpFilenameBeingDragged(); 113 114 void GestureFlingCancel(); 115 void GestureFlingStart(float x, float y, float velocity_x, float velocity_y); 116 void GestureScrollFirstPoint(int x, int y); 117 118 void TouchStart(); 119 void TouchMove(); 120 void TouchCancel(); 121 void TouchEnd(); 122 123 void LeapForward(int milliseconds); 124 125 void BeginDragWithFiles(const std::vector<std::string>& files); 126 127 void AddTouchPoint(gin::Arguments* args); 128 129 void MouseDragBegin(); 130 void MouseDragEnd(); 131 132 void GestureScrollBegin(gin::Arguments* args); 133 void GestureScrollEnd(gin::Arguments* args); 134 void GestureScrollUpdate(gin::Arguments* args); 135 void GestureScrollUpdateWithoutPropagation(gin::Arguments* args); 136 void GestureTap(gin::Arguments* args); 137 void GestureTapDown(gin::Arguments* args); 138 void GestureShowPress(gin::Arguments* args); 139 void GestureTapCancel(gin::Arguments* args); 140 void GestureLongPress(gin::Arguments* args); 141 void GestureLongTap(gin::Arguments* args); 142 void GestureTwoFingerTap(gin::Arguments* args); 143 144 void ContinuousMouseScrollBy(gin::Arguments* args); 145 void MouseMoveTo(gin::Arguments* args); 146 void TrackpadScrollBegin(); 147 void TrackpadScroll(gin::Arguments* args); 148 void TrackpadScrollEnd(); 149 void MouseScrollBy(gin::Arguments* args); 150 void MouseMomentumBegin(); 151 void MouseMomentumBegin2(gin::Arguments* args); 152 void MouseMomentumScrollBy(gin::Arguments* args); 153 void MouseMomentumEnd(); 154 void ScheduleAsynchronousClick(int button_number, int modifiers); 155 void ScheduleAsynchronousKeyDown(const std::string& code_str, 156 int modifiers, 157 KeyLocationCode location); 158 159 double GetCurrentEventTimeSec(); 160 161 void DoLeapForward(int milliseconds); 162 163 void SendCurrentTouchEvent(blink::WebInputEvent::Type); 164 165 void GestureEvent(blink::WebInputEvent::Type, gin::Arguments*); 166 167 void UpdateClickCountForButton(blink::WebMouseEvent::Button); 168 169 void InitMouseWheelEvent(gin::Arguments* args, 170 bool continuous, 171 blink::WebMouseWheelEvent* event); 172 173 void FinishDragAndDrop(const blink::WebMouseEvent&, blink::WebDragOperation); 174 175 void DoMouseUp(const blink::WebMouseEvent&); 176 void DoMouseMove(const blink::WebMouseEvent&); 177 void ReplaySavedEvents(); 178 179 bool force_layout_on_events() const { return force_layout_on_events_; } 180 void set_force_layout_on_events(bool force) { 181 force_layout_on_events_ = force; 182 } 183 184 bool is_drag_mode() const { return is_drag_mode_; } 185 void set_is_drag_mode(bool drag_mode) { is_drag_mode_ = drag_mode; } 186 187 #if defined(OS_WIN) 188 int wm_key_down() const { return wm_key_down_; } 189 void set_wm_key_down(int key_down) { wm_key_down_ = key_down; } 190 191 int wm_key_up() const { return wm_key_up_; } 192 void set_wm_key_up(int key_up) { wm_key_up_ = key_up; } 193 194 int wm_char() const { return wm_char_; } 195 void set_wm_char(int wm_char) { wm_char_ = wm_char; } 196 197 int wm_dead_char() const { return wm_dead_char_; } 198 void set_wm_dead_char(int dead_char) { 199 wm_dead_char_ = dead_char; 200 } 201 202 int wm_sys_key_down() const { return wm_sys_key_down_; } 203 void set_wm_sys_key_down(int key_down) { wm_sys_key_down_ = key_down; } 204 205 int wm_sys_key_up() const { return wm_sys_key_up_; } 206 void set_wm_sys_key_up(int key_up) { wm_sys_key_up_ = key_up; } 207 208 int wm_sys_char() const { return wm_sys_char_; } 209 void set_wm_sys_char(int sys_char) { wm_sys_char_ = sys_char; } 210 211 int wm_sys_dead_char() const { return wm_sys_dead_char_; } 212 void set_wm_sys_dead_char(int sys_dead_char) { 213 wm_sys_dead_char_ = sys_dead_char; 214 } 215 216 int wm_key_down_; 217 int wm_key_up_; 218 int wm_char_; 219 int wm_dead_char_; 220 int wm_sys_key_down_; 221 int wm_sys_key_up_; 222 int wm_sys_char_; 223 int wm_sys_dead_char_; 224 #endif 225 226 WebTaskList task_list_; 227 228 TestInterfaces* interfaces_; 229 WebTestDelegate* delegate_; 230 blink::WebView* view_; 231 232 bool force_layout_on_events_; 233 234 // When set to true (the default value), we batch mouse move and mouse up 235 // events so we can simulate drag & drop. 236 bool is_drag_mode_; 237 238 int touch_modifiers_; 239 bool touch_cancelable_; 240 std::vector<blink::WebTouchPoint> touch_points_; 241 242 scoped_ptr<blink::WebContextMenuData> last_context_menu_data_; 243 244 blink::WebDragData current_drag_data_; 245 246 // Location of the touch point that initiated a gesture. 247 blink::WebPoint current_gesture_location_; 248 249 // Currently pressed mouse button (Left/Right/Middle or None). 250 static blink::WebMouseEvent::Button pressed_button_; 251 252 bool replaying_saved_events_; 253 254 std::deque<SavedEvent> mouse_event_queue_; 255 256 blink::WebDragOperationsMask current_drag_effects_allowed_; 257 258 // Location of last mouseMoveTo event. 259 static blink::WebPoint last_mouse_pos_; 260 261 // Time and place of the last mouse up event. 262 double last_click_time_sec_; 263 blink::WebPoint last_click_pos_; 264 265 // The last button number passed to mouseDown and mouseUp. 266 // Used to determine whether the click count continues to increment or not. 267 static blink::WebMouseEvent::Button last_button_type_; 268 269 blink::WebDragOperation current_drag_effect_; 270 271 uint32 time_offset_ms_; 272 int click_count_; 273 274 base::WeakPtrFactory<EventSender> weak_factory_; 275 276 DISALLOW_COPY_AND_ASSIGN(EventSender); 277 }; 278 279 } // namespace content 280 281 #endif // CONTENT_SHELL_RENDERER_TEST_RUNNER_EVENT_SENDER_H_ 282