OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains the definition for EventSendingController. | 5 // This file contains the definition for EventSendingController. |
6 // | 6 // |
7 // Some notes about drag and drop handling: | 7 // Some notes about drag and drop handling: |
8 // Windows drag and drop goes through a system call to DoDragDrop. At that | 8 // Windows drag and drop goes through a system call to DoDragDrop. At that |
9 // point, program control is given to Windows which then periodically makes | 9 // point, program control is given to Windows which then periodically makes |
10 // callbacks into the webview. This won't work for layout tests, so instead, | 10 // callbacks into the webview. This won't work for layout tests, so instead, |
11 // we queue up all the mouse move and mouse up events. When the test tries to | 11 // we queue up all the mouse move and mouse up events. When the test tries to |
12 // start a drag (by calling EvenSendingController::DoDragDrop), we take the | 12 // start a drag (by calling EvenSendingController::DoDragDrop), we take the |
13 // events in the queue and replay them. | 13 // events in the queue and replay them. |
14 // The behavior of queueing events and replaying them can be disabled by a | 14 // The behavior of queueing events and replaying them can be disabled by a |
15 // layout test by setting eventSender.dragMode to false. | 15 // layout test by setting eventSender.dragMode to false. |
16 | 16 |
17 #include "webkit/tools/test_shell/event_sending_controller.h" | 17 #include "webkit/tools/test_shell/event_sending_controller.h" |
18 | 18 |
| 19 #if defined(OS_WIN) |
19 #include <objidl.h> | 20 #include <objidl.h> |
| 21 #endif |
20 #include <queue> | 22 #include <queue> |
21 | 23 |
22 #include "base/ref_counted.h" | 24 #include "base/ref_counted.h" |
23 #include "base/string_util.h" | 25 #include "base/string_util.h" |
| 26 #include "base/time.h" |
24 #include "webkit/glue/webview.h" | 27 #include "webkit/glue/webview.h" |
25 #include "webkit/tools/test_shell/test_shell.h" | 28 #include "webkit/tools/test_shell/test_shell.h" |
26 | 29 |
27 // TODO(mpcomplete): layout before each event? | 30 // TODO(mpcomplete): layout before each event? |
28 // TODO(mpcomplete): do we need modifiers for mouse events? | 31 // TODO(mpcomplete): do we need modifiers for mouse events? |
29 | 32 |
30 TestShell* EventSendingController::shell_ = NULL; | 33 TestShell* EventSendingController::shell_ = NULL; |
31 gfx::Point EventSendingController::last_mouse_pos_; | 34 gfx::Point EventSendingController::last_mouse_pos_; |
32 WebMouseEvent::Button EventSendingController::pressed_button_ = | 35 WebMouseEvent::Button EventSendingController::pressed_button_ = |
33 WebMouseEvent::BUTTON_NONE; | 36 WebMouseEvent::BUTTON_NONE; |
34 | 37 |
35 namespace { | 38 namespace { |
36 | 39 |
| 40 #if defined(OS_WIN) |
37 static scoped_refptr<IDataObject> drag_data_object; | 41 static scoped_refptr<IDataObject> drag_data_object; |
| 42 #elif defined(OS_MACOSX) |
| 43 // Throughout this file, drag support is #ifdef-ed out. TODO(port): Add it in |
| 44 // for the Mac. |
| 45 #endif |
38 static bool replaying_saved_events = false; | 46 static bool replaying_saved_events = false; |
39 static std::queue<WebMouseEvent> mouse_event_queue; | 47 static std::queue<WebMouseEvent> mouse_event_queue; |
40 | 48 |
41 // Time and place of the last mouse up event. | 49 // Time and place of the last mouse up event. |
42 static double last_click_time_sec = 0; | 50 static double last_click_time_sec = 0; |
43 static gfx::Point last_click_pos; | 51 static gfx::Point last_click_pos; |
44 static int click_count = 0; | 52 static int click_count = 0; |
45 | 53 |
46 // maximum distance (in space and time) for a mouse click | 54 // maximum distance (in space and time) for a mouse click |
47 // to register as a double or triple click | 55 // to register as a double or triple click |
48 static const double kMultiClickTimeSec = 1; | 56 static const double kMultiClickTimeSec = 1; |
49 static const int kMultiClickRadiusPixels = 5; | 57 static const int kMultiClickRadiusPixels = 5; |
50 | 58 |
51 inline bool outside_multiclick_radius(const gfx::Point &a, const gfx::Point &b)
{ | 59 inline bool outside_multiclick_radius(const gfx::Point &a, const gfx::Point &b)
{ |
52 return ((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y()))
> | 60 return ((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y()))
> |
53 kMultiClickRadiusPixels * kMultiClickRadiusPixels; | 61 kMultiClickRadiusPixels * kMultiClickRadiusPixels; |
54 } | 62 } |
55 | 63 |
56 // Used to offset the time the event hander things an event happened. This is | 64 // Used to offset the time the event hander things an event happened. This is |
57 // done so tests can run without a delay, but bypass checks that are time | 65 // done so tests can run without a delay, but bypass checks that are time |
58 // dependent (e.g., dragging has a timeout vs selection). | 66 // dependent (e.g., dragging has a timeout vs selection). |
59 static uint32 time_offset_ms = 0; | 67 static uint32 time_offset_ms = 0; |
60 | 68 |
61 double GetCurrentEventTimeSec() { | 69 double GetCurrentEventTimeSec() { |
62 return (GetTickCount() + time_offset_ms) / 1000.0; | 70 return (TimeTicks::Now().ToInternalValue() |
| 71 / Time::kMicrosecondsPerMillisecond + |
| 72 time_offset_ms) / 1000.0; |
63 } | 73 } |
64 | 74 |
65 void AdvanceEventTime(int32 delta_ms) { | 75 void AdvanceEventTime(int32 delta_ms) { |
66 time_offset_ms += delta_ms; | 76 time_offset_ms += delta_ms; |
67 } | 77 } |
68 | 78 |
69 void InitMouseEvent(WebInputEvent::Type t, WebMouseEvent::Button b, | 79 void InitMouseEvent(WebInputEvent::Type t, WebMouseEvent::Button b, |
70 const gfx::Point& pos, WebMouseEvent* e) { | 80 const gfx::Point& pos, WebMouseEvent* e) { |
71 e->type = t; | 81 e->type = t; |
72 e->button = b; | 82 e->button = b; |
(...skipping 10 matching lines...) Expand all Loading... |
83 std::vector<std::wstring> args = arg->ToStringVector(); | 93 std::vector<std::wstring> args = arg->ToStringVector(); |
84 for (std::vector<std::wstring>::iterator i = args.begin(); | 94 for (std::vector<std::wstring>::iterator i = args.begin(); |
85 i != args.end(); ++i) { | 95 i != args.end(); ++i) { |
86 const wchar_t* arg_string = (*i).c_str(); | 96 const wchar_t* arg_string = (*i).c_str(); |
87 if (!wcscmp(arg_string, L"ctrlKey")) { | 97 if (!wcscmp(arg_string, L"ctrlKey")) { |
88 event->modifiers |= WebInputEvent::CTRL_KEY; | 98 event->modifiers |= WebInputEvent::CTRL_KEY; |
89 } else if (!wcscmp(arg_string, L"shiftKey")) { | 99 } else if (!wcscmp(arg_string, L"shiftKey")) { |
90 event->modifiers |= WebInputEvent::SHIFT_KEY; | 100 event->modifiers |= WebInputEvent::SHIFT_KEY; |
91 } else if (!wcscmp(arg_string, L"altKey")) { | 101 } else if (!wcscmp(arg_string, L"altKey")) { |
92 event->modifiers |= WebInputEvent::ALT_KEY; | 102 event->modifiers |= WebInputEvent::ALT_KEY; |
| 103 #if defined(OS_WIN) |
93 event->system_key = true; | 104 event->system_key = true; |
| 105 #endif |
94 } else if (!wcscmp(arg_string, L"metaKey")) { | 106 } else if (!wcscmp(arg_string, L"metaKey")) { |
95 event->modifiers |= WebInputEvent::META_KEY; | 107 event->modifiers |= WebInputEvent::META_KEY; |
96 } | 108 } |
97 } | 109 } |
98 } | 110 } |
99 | 111 |
100 } // anonymous namespace | 112 } // anonymous namespace |
101 | 113 |
102 EventSendingController::EventSendingController(TestShell* shell) { | 114 EventSendingController::EventSendingController(TestShell* shell) { |
103 // Set static shell_ variable since we can't do it in an initializer list. | 115 // Set static shell_ variable since we can't do it in an initializer list. |
(...skipping 18 matching lines...) Expand all Loading... |
122 BindMethod("textZoomIn", &EventSendingController::textZoomIn); | 134 BindMethod("textZoomIn", &EventSendingController::textZoomIn); |
123 BindMethod("textZoomOut", &EventSendingController::textZoomOut); | 135 BindMethod("textZoomOut", &EventSendingController::textZoomOut); |
124 | 136 |
125 // When set to true (the default value), we batch mouse move and mouse up | 137 // When set to true (the default value), we batch mouse move and mouse up |
126 // events so we can simulate drag & drop. | 138 // events so we can simulate drag & drop. |
127 BindProperty("dragMode", &dragMode); | 139 BindProperty("dragMode", &dragMode); |
128 } | 140 } |
129 | 141 |
130 void EventSendingController::Reset() { | 142 void EventSendingController::Reset() { |
131 // The test should have finished a drag and the mouse button state. | 143 // The test should have finished a drag and the mouse button state. |
| 144 #if defined(OS_WIN) |
132 DCHECK(!drag_data_object); | 145 DCHECK(!drag_data_object); |
133 drag_data_object = NULL; | 146 drag_data_object = NULL; |
| 147 #endif |
134 pressed_button_ = WebMouseEvent::BUTTON_NONE; | 148 pressed_button_ = WebMouseEvent::BUTTON_NONE; |
135 dragMode.Set(true); | 149 dragMode.Set(true); |
136 last_click_time_sec = 0; | 150 last_click_time_sec = 0; |
137 click_count = 0; | 151 click_count = 0; |
138 } | 152 } |
139 | 153 |
140 /* static */ WebView* EventSendingController::webview() { | 154 /* static */ WebView* EventSendingController::webview() { |
141 return shell_->webView(); | 155 return shell_->webView(); |
142 } | 156 } |
143 | 157 |
| 158 #if defined(OS_WIN) |
144 /* static */ void EventSendingController::DoDragDrop(IDataObject* data_obj) { | 159 /* static */ void EventSendingController::DoDragDrop(IDataObject* data_obj) { |
145 drag_data_object = data_obj; | 160 drag_data_object = data_obj; |
146 | 161 |
147 DWORD effect = 0; | 162 DWORD effect = 0; |
148 POINTL screen_ptl = {0, 0}; | 163 POINTL screen_ptl = {0, 0}; |
149 TestWebViewDelegate* delegate = shell_->delegate(); | 164 TestWebViewDelegate* delegate = shell_->delegate(); |
150 delegate->drop_delegate()->DragEnter(drag_data_object, MK_LBUTTON, | 165 delegate->drop_delegate()->DragEnter(drag_data_object, MK_LBUTTON, |
151 screen_ptl, &effect); | 166 screen_ptl, &effect); |
152 | 167 |
153 // Finish processing events. | 168 // Finish processing events. |
154 ReplaySavedEvents(); | 169 ReplaySavedEvents(); |
155 } | 170 } |
| 171 #endif |
156 | 172 |
157 // static | 173 // static |
158 WebMouseEvent::Button EventSendingController::GetButtonTypeFromSingleArg( | 174 WebMouseEvent::Button EventSendingController::GetButtonTypeFromSingleArg( |
159 const CppArgumentList& args) { | 175 const CppArgumentList& args) { |
160 if (args.size() > 0 && args[0].isNumber()) { | 176 if (args.size() > 0 && args[0].isNumber()) { |
161 int button_code = args[0].ToInt32(); | 177 int button_code = args[0].ToInt32(); |
162 if (button_code == 1) | 178 if (button_code == 1) |
163 return WebMouseEvent::BUTTON_MIDDLE; | 179 return WebMouseEvent::BUTTON_MIDDLE; |
164 else if (button_code == 2) | 180 else if (button_code == 2) |
165 return WebMouseEvent::BUTTON_RIGHT; | 181 return WebMouseEvent::BUTTON_RIGHT; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 } | 228 } |
213 | 229 |
214 last_click_time_sec = event.timestamp_sec; | 230 last_click_time_sec = event.timestamp_sec; |
215 last_click_pos = gfx::Point(event.x, event.y); | 231 last_click_pos = gfx::Point(event.x, event.y); |
216 } | 232 } |
217 | 233 |
218 /* static */ void EventSendingController::DoMouseUp(const WebMouseEvent& e) { | 234 /* static */ void EventSendingController::DoMouseUp(const WebMouseEvent& e) { |
219 webview()->HandleInputEvent(&e); | 235 webview()->HandleInputEvent(&e); |
220 pressed_button_ = WebMouseEvent::BUTTON_NONE; | 236 pressed_button_ = WebMouseEvent::BUTTON_NONE; |
221 | 237 |
| 238 #if defined(OS_WIN) |
222 // If we're in a drag operation, complete it. | 239 // If we're in a drag operation, complete it. |
223 if (drag_data_object) { | 240 if (drag_data_object) { |
224 TestWebViewDelegate* delegate = shell_->delegate(); | 241 TestWebViewDelegate* delegate = shell_->delegate(); |
225 // Get screen mouse position. | 242 // Get screen mouse position. |
226 POINT screen_pt = { static_cast<LONG>(e.x), | 243 POINT screen_pt = { static_cast<LONG>(e.x), |
227 static_cast<LONG>(e.y) }; | 244 static_cast<LONG>(e.y) }; |
228 ClientToScreen(shell_->webViewWnd(), &screen_pt); | 245 ClientToScreen(shell_->webViewWnd(), &screen_pt); |
229 POINTL screen_ptl = { screen_pt.x, screen_pt.y }; | 246 POINTL screen_ptl = { screen_pt.x, screen_pt.y }; |
230 | 247 |
231 DWORD effect = 0; | 248 DWORD effect = 0; |
232 delegate->drop_delegate()->DragOver(0, screen_ptl, &effect); | 249 delegate->drop_delegate()->DragOver(0, screen_ptl, &effect); |
233 HRESULT hr = delegate->drag_delegate()->QueryContinueDrag(0, 0); | 250 HRESULT hr = delegate->drag_delegate()->QueryContinueDrag(0, 0); |
234 if (hr == DRAGDROP_S_DROP && effect != DROPEFFECT_NONE) { | 251 if (hr == DRAGDROP_S_DROP && effect != DROPEFFECT_NONE) { |
235 DWORD effect = 0; | 252 DWORD effect = 0; |
236 delegate->drop_delegate()->Drop(drag_data_object.get(), 0, screen_ptl, | 253 delegate->drop_delegate()->Drop(drag_data_object.get(), 0, screen_ptl, |
237 &effect); | 254 &effect); |
238 } else { | 255 } else { |
239 delegate->drop_delegate()->DragLeave(); | 256 delegate->drop_delegate()->DragLeave(); |
240 } | 257 } |
241 drag_data_object = NULL; | 258 drag_data_object = NULL; |
242 } | 259 } |
| 260 #endif |
243 } | 261 } |
244 | 262 |
245 void EventSendingController::mouseMoveTo( | 263 void EventSendingController::mouseMoveTo( |
246 const CppArgumentList& args, CppVariant* result) { | 264 const CppArgumentList& args, CppVariant* result) { |
247 result->SetNull(); | 265 result->SetNull(); |
248 | 266 |
249 if (args.size() >= 2 && args[0].isNumber() && args[1].isNumber()) { | 267 if (args.size() >= 2 && args[0].isNumber() && args[1].isNumber()) { |
250 webview()->Layout(); | 268 webview()->Layout(); |
251 | 269 |
252 WebMouseEvent event; | 270 WebMouseEvent event; |
253 last_mouse_pos_.SetPoint(args[0].ToInt32(), args[1].ToInt32()); | 271 last_mouse_pos_.SetPoint(args[0].ToInt32(), args[1].ToInt32()); |
254 InitMouseEvent(WebInputEvent::MOUSE_MOVE, pressed_button_, | 272 InitMouseEvent(WebInputEvent::MOUSE_MOVE, pressed_button_, |
255 last_mouse_pos_, &event); | 273 last_mouse_pos_, &event); |
256 | 274 |
257 if (drag_mode() && pressed_button_ != WebMouseEvent::BUTTON_NONE && | 275 if (drag_mode() && pressed_button_ != WebMouseEvent::BUTTON_NONE && |
258 !replaying_saved_events) { | 276 !replaying_saved_events) { |
259 mouse_event_queue.push(event); | 277 mouse_event_queue.push(event); |
260 } else { | 278 } else { |
261 DoMouseMove(event); | 279 DoMouseMove(event); |
262 } | 280 } |
263 } | 281 } |
264 } | 282 } |
265 | 283 |
266 /* static */ void EventSendingController::DoMouseMove(const WebMouseEvent& e) { | 284 /* static */ void EventSendingController::DoMouseMove(const WebMouseEvent& e) { |
267 webview()->HandleInputEvent(&e); | 285 webview()->HandleInputEvent(&e); |
268 | 286 |
| 287 #if defined(OS_WIN) |
269 if (pressed_button_ != WebMouseEvent::BUTTON_NONE && drag_data_object) { | 288 if (pressed_button_ != WebMouseEvent::BUTTON_NONE && drag_data_object) { |
270 TestWebViewDelegate* delegate = shell_->delegate(); | 289 TestWebViewDelegate* delegate = shell_->delegate(); |
271 // Get screen mouse position. | 290 // Get screen mouse position. |
272 POINT screen_pt = { static_cast<LONG>(e.x), | 291 POINT screen_pt = { static_cast<LONG>(e.x), |
273 static_cast<LONG>(e.y) }; | 292 static_cast<LONG>(e.y) }; |
274 ClientToScreen(shell_->webViewWnd(), &screen_pt); | 293 ClientToScreen(shell_->webViewWnd(), &screen_pt); |
275 POINTL screen_ptl = { screen_pt.x, screen_pt.y }; | 294 POINTL screen_ptl = { screen_pt.x, screen_pt.y }; |
276 | 295 |
277 HRESULT hr = delegate->drag_delegate()->QueryContinueDrag(0, MK_LBUTTON); | 296 HRESULT hr = delegate->drag_delegate()->QueryContinueDrag(0, MK_LBUTTON); |
278 DWORD effect = 0; | 297 DWORD effect = 0; |
279 delegate->drop_delegate()->DragOver(MK_LBUTTON, screen_ptl, &effect); | 298 delegate->drop_delegate()->DragOver(MK_LBUTTON, screen_ptl, &effect); |
280 | 299 |
281 delegate->drag_delegate()->GiveFeedback(effect); | 300 delegate->drag_delegate()->GiveFeedback(effect); |
282 } | 301 } |
| 302 #endif |
283 } | 303 } |
284 | 304 |
285 void EventSendingController::keyDown( | 305 void EventSendingController::keyDown( |
286 const CppArgumentList& args, CppVariant* result) { | 306 const CppArgumentList& args, CppVariant* result) { |
287 result->SetNull(); | 307 result->SetNull(); |
288 | 308 |
289 static const int kPercentVirtualKeyCode = 0x25; | 309 static const int kPercentVirtualKeyCode = 0x25; |
290 static const int kAmpersandVirtualKeyCode = 0x26; | 310 static const int kAmpersandVirtualKeyCode = 0x26; |
291 | 311 |
292 static const int kLeftParenthesesVirtualKeyCode = 0x28; | 312 static const int kLeftParenthesesVirtualKeyCode = 0x28; |
293 static const int kRightParenthesesVirtualKeyCode = 0x29; | 313 static const int kRightParenthesesVirtualKeyCode = 0x29; |
294 | 314 |
| 315 #if defined(OS_WIN) |
295 static const int kLeftCurlyBracketVirtualKeyCode = 0x7B; | 316 static const int kLeftCurlyBracketVirtualKeyCode = 0x7B; |
296 static const int kRightCurlyBracketVirtualKeyCode = 0x7D; | 317 static const int kRightCurlyBracketVirtualKeyCode = 0x7D; |
| 318 #endif |
297 | 319 |
298 bool generate_char = false; | 320 bool generate_char = false; |
299 | 321 |
300 if (args.size() >= 1 && args[0].isString()) { | 322 if (args.size() >= 1 && args[0].isString()) { |
301 // TODO(mpcomplete): I'm not exactly sure how we should convert the string | 323 // TODO(mpcomplete): I'm not exactly sure how we should convert the string |
302 // to a key event. This seems to work in the cases I tested. | 324 // to a key event. This seems to work in the cases I tested. |
303 // TODO(mpcomplete): Should we also generate a KEY_UP? | 325 // TODO(mpcomplete): Should we also generate a KEY_UP? |
304 std::wstring code_str = UTF8ToWide(args[0].ToString()); | 326 std::wstring code_str = UTF8ToWide(args[0].ToString()); |
305 | 327 |
306 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when | 328 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when |
307 // Windows uses \r for "Enter". | 329 // Windows uses \r for "Enter". |
308 wchar_t code; | 330 wchar_t code; |
309 bool needs_shift_key_modifier = false; | 331 bool needs_shift_key_modifier = false; |
| 332 #if defined(OS_WIN) |
310 if (L"\n" == code_str) { | 333 if (L"\n" == code_str) { |
311 generate_char = true; | 334 generate_char = true; |
312 code = VK_RETURN; | 335 code = VK_RETURN; |
313 } else if (L"rightArrow" == code_str) { | 336 } else if (L"rightArrow" == code_str) { |
314 code = VK_RIGHT; | 337 code = VK_RIGHT; |
315 } else if (L"downArrow" == code_str) { | 338 } else if (L"downArrow" == code_str) { |
316 code = VK_DOWN; | 339 code = VK_DOWN; |
317 } else if (L"leftArrow" == code_str) { | 340 } else if (L"leftArrow" == code_str) { |
318 code = VK_LEFT; | 341 code = VK_LEFT; |
319 } else if (L"upArrow" == code_str) { | 342 } else if (L"upArrow" == code_str) { |
320 code = VK_UP; | 343 code = VK_UP; |
321 } else if (L"delete" == code_str) { | 344 } else if (L"delete" == code_str) { |
322 code = VK_BACK; | 345 code = VK_BACK; |
323 } else { | 346 } |
| 347 #elif defined(OS_MACOSX) |
| 348 // I don't quite understand this code enough to change the way it works. As |
| 349 // for the keycodes, they were documented once in Inside Macintosh and |
| 350 // haven't been documented since, either on paper or in a header. The |
| 351 // reference I'm going by is http://www.meandmark.com/keycodes.html . |
| 352 // TODO(avi): Find someone who knows keyboard handling in WebCore and have |
| 353 // them take a look at this. |
| 354 if (L"\n" == code_str) { |
| 355 generate_char = true; |
| 356 code = 0x24; |
| 357 } else if (L"rightArrow" == code_str) { |
| 358 code = 0x7C; |
| 359 } else if (L"downArrow" == code_str) { |
| 360 code = 0x7D; |
| 361 } else if (L"leftArrow" == code_str) { |
| 362 code = 0x7B; |
| 363 } else if (L"upArrow" == code_str) { |
| 364 code = 0x7E; |
| 365 } else if (L"delete" == code_str) { |
| 366 code = 0x33; |
| 367 } |
| 368 #endif |
| 369 else { |
324 DCHECK(code_str.length() == 1); | 370 DCHECK(code_str.length() == 1); |
325 code = code_str[0]; | 371 code = code_str[0]; |
326 needs_shift_key_modifier = NeedsShiftModifer(code); | 372 needs_shift_key_modifier = NeedsShiftModifer(code); |
327 generate_char = true; | 373 generate_char = true; |
328 } | 374 } |
329 | 375 |
330 // NOTE(jnd):For one keydown event, we need to generate | 376 // NOTE(jnd):For one keydown event, we need to generate |
331 // keyDown/keyUp pair, refer EventSender.cpp in | 377 // keyDown/keyUp pair, refer EventSender.cpp in |
332 // WebKit/WebKitTools/DumpRenderTree/win. We may also need | 378 // WebKit/WebKitTools/DumpRenderTree/win. We may also need |
333 // to generate a keyChar event in certain cases. | 379 // to generate a keyChar event in certain cases. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 event_char.key_data = kAmpersandVirtualKeyCode; | 417 event_char.key_data = kAmpersandVirtualKeyCode; |
372 break; | 418 break; |
373 case '9': | 419 case '9': |
374 event_char.key_code = kLeftParenthesesVirtualKeyCode; | 420 event_char.key_code = kLeftParenthesesVirtualKeyCode; |
375 event_char.key_data = kLeftParenthesesVirtualKeyCode; | 421 event_char.key_data = kLeftParenthesesVirtualKeyCode; |
376 break; | 422 break; |
377 case '0': | 423 case '0': |
378 event_char.key_code = kRightParenthesesVirtualKeyCode; | 424 event_char.key_code = kRightParenthesesVirtualKeyCode; |
379 event_char.key_data = kRightParenthesesVirtualKeyCode; | 425 event_char.key_data = kRightParenthesesVirtualKeyCode; |
380 break; | 426 break; |
| 427 #if defined(OS_WIN) |
381 // '[{' for US | 428 // '[{' for US |
382 case VK_OEM_4: | 429 case VK_OEM_4: |
383 event_char.key_code = kLeftCurlyBracketVirtualKeyCode; | 430 event_char.key_code = kLeftCurlyBracketVirtualKeyCode; |
384 event_char.key_data = kLeftCurlyBracketVirtualKeyCode; | 431 event_char.key_data = kLeftCurlyBracketVirtualKeyCode; |
385 break; | 432 break; |
386 // ']}' for US | 433 // ']}' for US |
387 case VK_OEM_6: | 434 case VK_OEM_6: |
388 event_char.key_code = kRightCurlyBracketVirtualKeyCode; | 435 event_char.key_code = kRightCurlyBracketVirtualKeyCode; |
389 event_char.key_data = kRightCurlyBracketVirtualKeyCode; | 436 event_char.key_data = kRightCurlyBracketVirtualKeyCode; |
390 break; | 437 break; |
| 438 #endif |
391 default: | 439 default: |
392 break; | 440 break; |
393 } | 441 } |
394 } | 442 } |
395 event_char.type = WebInputEvent::CHAR; | 443 event_char.type = WebInputEvent::CHAR; |
396 webview()->HandleInputEvent(&event_char); | 444 webview()->HandleInputEvent(&event_char); |
397 } | 445 } |
398 | 446 |
399 webview()->HandleInputEvent(&event_up); | 447 webview()->HandleInputEvent(&event_up); |
400 } | 448 } |
401 } | 449 } |
402 | 450 |
403 bool EventSendingController::NeedsShiftModifer(wchar_t key_code) { | 451 bool EventSendingController::NeedsShiftModifer(wchar_t key_code) { |
404 // If code is an uppercase letter, assign a SHIFT key to | 452 // If code is an uppercase letter, assign a SHIFT key to |
405 // event_down.modifier, this logic comes from | 453 // event_down.modifier, this logic comes from |
406 // WebKit/WebKitTools/DumpRenderTree/Win/EventSender.cpp | 454 // WebKit/WebKitTools/DumpRenderTree/Win/EventSender.cpp |
407 if ((LOBYTE(key_code)) >= 'A' && (LOBYTE(key_code)) <= 'Z') | 455 if ((key_code & 0xFF) >= 'A' && (key_code & 0xFF) <= 'Z') |
408 return true; | 456 return true; |
409 return false; | 457 return false; |
410 } | 458 } |
411 | 459 |
412 void EventSendingController::leapForward( | 460 void EventSendingController::leapForward( |
413 const CppArgumentList& args, CppVariant* result) { | 461 const CppArgumentList& args, CppVariant* result) { |
414 result->SetNull(); | 462 result->SetNull(); |
415 | 463 |
416 // TODO(mpcomplete): DumpRenderTree defers this under certain conditions. | 464 // TODO(mpcomplete): DumpRenderTree defers this under certain conditions. |
417 | 465 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 void EventSendingController::fireKeyboardEventsToElement( | 542 void EventSendingController::fireKeyboardEventsToElement( |
495 const CppArgumentList& args, CppVariant* result) { | 543 const CppArgumentList& args, CppVariant* result) { |
496 result->SetNull(); | 544 result->SetNull(); |
497 } | 545 } |
498 | 546 |
499 void EventSendingController::clearKillRing( | 547 void EventSendingController::clearKillRing( |
500 const CppArgumentList& args, CppVariant* result) { | 548 const CppArgumentList& args, CppVariant* result) { |
501 result->SetNull(); | 549 result->SetNull(); |
502 } | 550 } |
503 | 551 |
OLD | NEW |