• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/web_task.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 
mutable_task_list()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 
force_layout_on_events()179   bool force_layout_on_events() const { return force_layout_on_events_; }
set_force_layout_on_events(bool force)180   void set_force_layout_on_events(bool force) {
181     force_layout_on_events_ = force;
182   }
183 
is_drag_mode()184   bool is_drag_mode() const { return is_drag_mode_; }
set_is_drag_mode(bool drag_mode)185   void set_is_drag_mode(bool drag_mode) { is_drag_mode_ = drag_mode; }
186 
187 #if defined(OS_WIN)
wm_key_down()188   int wm_key_down() const { return wm_key_down_; }
set_wm_key_down(int key_down)189   void set_wm_key_down(int key_down) { wm_key_down_ = key_down; }
190 
wm_key_up()191   int wm_key_up() const { return wm_key_up_; }
set_wm_key_up(int key_up)192   void set_wm_key_up(int key_up) { wm_key_up_ = key_up; }
193 
wm_char()194   int wm_char() const { return wm_char_; }
set_wm_char(int wm_char)195   void set_wm_char(int wm_char) { wm_char_ = wm_char; }
196 
wm_dead_char()197   int wm_dead_char() const { return wm_dead_char_; }
set_wm_dead_char(int dead_char)198   void set_wm_dead_char(int dead_char) {
199     wm_dead_char_ = dead_char;
200   }
201 
wm_sys_key_down()202   int wm_sys_key_down() const { return wm_sys_key_down_; }
set_wm_sys_key_down(int key_down)203   void set_wm_sys_key_down(int key_down) { wm_sys_key_down_ = key_down; }
204 
wm_sys_key_up()205   int wm_sys_key_up() const { return wm_sys_key_up_; }
set_wm_sys_key_up(int key_up)206   void set_wm_sys_key_up(int key_up) { wm_sys_key_up_ = key_up; }
207 
wm_sys_char()208   int wm_sys_char() const { return wm_sys_char_; }
set_wm_sys_char(int sys_char)209   void set_wm_sys_char(int sys_char) { wm_sys_char_ = sys_char; }
210 
wm_sys_dead_char()211   int wm_sys_dead_char() const { return wm_sys_dead_char_; }
set_wm_sys_dead_char(int 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