OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "ui/events/blink/web_input_event.h" | 5 #include "ui/events/blink/web_input_event.h" |
6 | 6 |
7 #include "ui/events/base_event_utils.h" | 7 #include "ui/events/base_event_utils.h" |
8 #include "ui/events/blink/blink_event_util.h" | 8 #include "ui/events/blink/blink_event_util.h" |
9 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
10 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent( | 83 blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent( |
84 const base::NativeEvent& native_event, | 84 const base::NativeEvent& native_event, |
85 const base::TimeTicks& time_stamp) { | 85 const base::TimeTicks& time_stamp) { |
86 return WebKeyboardEventBuilder::Build( | 86 return WebKeyboardEventBuilder::Build( |
87 native_event.hwnd, native_event.message, native_event.wParam, | 87 native_event.hwnd, native_event.message, native_event.wParam, |
88 native_event.lParam, EventTimeStampToSeconds(time_stamp)); | 88 native_event.lParam, EventTimeStampToSeconds(time_stamp)); |
89 } | 89 } |
90 #endif // defined(OS_WIN) | 90 #endif // defined(OS_WIN) |
91 | 91 |
92 blink::WebKeyboardEvent MakeWebKeyboardEventFromUiEvent(const KeyEvent& event) { | 92 blink::WebKeyboardEvent MakeWebKeyboardEventFromUiEvent(const KeyEvent& event) { |
93 blink::WebKeyboardEvent webkit_event; | 93 blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined; |
94 | |
95 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); | |
96 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()) | | |
97 DomCodeToWebInputEventModifiers(event.code()); | |
98 | |
99 switch (event.type()) { | 94 switch (event.type()) { |
100 case ET_KEY_PRESSED: | 95 case ET_KEY_PRESSED: |
101 webkit_event.type = event.is_char() ? blink::WebInputEvent::Char | 96 type = event.is_char() ? blink::WebInputEvent::Char |
102 : blink::WebInputEvent::RawKeyDown; | 97 : blink::WebInputEvent::RawKeyDown; |
103 break; | 98 break; |
104 case ET_KEY_RELEASED: | 99 case ET_KEY_RELEASED: |
105 webkit_event.type = blink::WebInputEvent::KeyUp; | 100 type = blink::WebInputEvent::KeyUp; |
106 break; | 101 break; |
107 default: | 102 default: |
108 NOTREACHED(); | 103 NOTREACHED(); |
109 } | 104 } |
110 | 105 |
| 106 blink::WebKeyboardEvent webkit_event( |
| 107 type, EventFlagsToWebEventModifiers(event.flags()) | |
| 108 DomCodeToWebInputEventModifiers(event.code()), |
| 109 EventTimeStampToSeconds(event.time_stamp())); |
| 110 |
111 if (webkit_event.modifiers & blink::WebInputEvent::AltKey) | 111 if (webkit_event.modifiers & blink::WebInputEvent::AltKey) |
112 webkit_event.isSystemKey = true; | 112 webkit_event.isSystemKey = true; |
113 | 113 |
114 // TODO(dtapuska): crbug.com/570388. Ozone appears to deliver | 114 // TODO(dtapuska): crbug.com/570388. Ozone appears to deliver |
115 // key_code events that aren't "located" for the keypad like | 115 // key_code events that aren't "located" for the keypad like |
116 // Windows and X11 do and blink expects. | 116 // Windows and X11 do and blink expects. |
117 webkit_event.windowsKeyCode = | 117 webkit_event.windowsKeyCode = |
118 NonLocatedToLocatedKeypadKeyboardCode(event.key_code(), event.code()); | 118 NonLocatedToLocatedKeypadKeyboardCode(event.key_code(), event.code()); |
119 webkit_event.nativeKeyCode = | 119 webkit_event.nativeKeyCode = |
120 KeycodeConverter::DomCodeToNativeKeycode(event.code()); | 120 KeycodeConverter::DomCodeToNativeKeycode(event.code()); |
121 webkit_event.domCode = static_cast<int>(event.code()); | 121 webkit_event.domCode = static_cast<int>(event.code()); |
122 webkit_event.domKey = static_cast<int>(event.GetDomKey()); | 122 webkit_event.domKey = static_cast<int>(event.GetDomKey()); |
123 webkit_event.unmodifiedText[0] = event.GetUnmodifiedText(); | 123 webkit_event.unmodifiedText[0] = event.GetUnmodifiedText(); |
124 webkit_event.text[0] = event.GetText(); | 124 webkit_event.text[0] = event.GetText(); |
125 | 125 |
126 return webkit_event; | 126 return webkit_event; |
127 } | 127 } |
128 | 128 |
129 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( | 129 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
130 const ScrollEvent& event) { | 130 const ScrollEvent& event) { |
131 blink::WebMouseWheelEvent webkit_event; | 131 blink::WebMouseWheelEvent webkit_event( |
| 132 blink::WebInputEvent::MouseWheel, |
| 133 EventFlagsToWebEventModifiers(event.flags()), |
| 134 EventTimeStampToSeconds(event.time_stamp())); |
132 | 135 |
133 webkit_event.type = blink::WebInputEvent::MouseWheel; | |
134 webkit_event.button = blink::WebMouseEvent::Button::NoButton; | 136 webkit_event.button = blink::WebMouseEvent::Button::NoButton; |
135 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); | |
136 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); | |
137 webkit_event.hasPreciseScrollingDeltas = true; | 137 webkit_event.hasPreciseScrollingDeltas = true; |
138 | 138 |
139 float offset_ordinal_x = event.x_offset_ordinal(); | 139 float offset_ordinal_x = event.x_offset_ordinal(); |
140 float offset_ordinal_y = event.y_offset_ordinal(); | 140 float offset_ordinal_y = event.y_offset_ordinal(); |
141 webkit_event.deltaX = event.x_offset(); | 141 webkit_event.deltaX = event.x_offset(); |
142 webkit_event.deltaY = event.y_offset(); | 142 webkit_event.deltaY = event.y_offset(); |
143 | 143 |
144 if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f) | 144 if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f) |
145 webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX; | 145 webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX; |
146 webkit_event.wheelTicksX = webkit_event.deltaX / MouseWheelEvent::kWheelDelta; | 146 webkit_event.wheelTicksX = webkit_event.deltaX / MouseWheelEvent::kWheelDelta; |
147 webkit_event.wheelTicksY = webkit_event.deltaY / MouseWheelEvent::kWheelDelta; | 147 webkit_event.wheelTicksY = webkit_event.deltaY / MouseWheelEvent::kWheelDelta; |
148 if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f) | 148 if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f) |
149 webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY; | 149 webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY; |
150 | 150 |
151 webkit_event.pointerType = | 151 webkit_event.pointerType = |
152 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 152 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
153 return webkit_event; | 153 return webkit_event; |
154 } | 154 } |
155 | 155 |
156 blink::WebGestureEvent MakeWebGestureEventFromUiEvent( | 156 blink::WebGestureEvent MakeWebGestureEventFromUiEvent( |
157 const ScrollEvent& event) { | 157 const ScrollEvent& event) { |
158 blink::WebGestureEvent webkit_event; | 158 blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined; |
159 | |
160 switch (event.type()) { | 159 switch (event.type()) { |
161 case ET_SCROLL_FLING_START: | 160 case ET_SCROLL_FLING_START: |
162 webkit_event.type = blink::WebInputEvent::GestureFlingStart; | 161 type = blink::WebInputEvent::GestureFlingStart; |
163 webkit_event.data.flingStart.velocityX = event.x_offset(); | |
164 webkit_event.data.flingStart.velocityY = event.y_offset(); | |
165 break; | 162 break; |
166 case ET_SCROLL_FLING_CANCEL: | 163 case ET_SCROLL_FLING_CANCEL: |
167 webkit_event.type = blink::WebInputEvent::GestureFlingCancel; | 164 type = blink::WebInputEvent::GestureFlingCancel; |
168 break; | 165 break; |
169 case ET_SCROLL: | 166 case ET_SCROLL: |
170 NOTREACHED() << "Invalid gesture type: " << event.type(); | 167 NOTREACHED() << "Invalid gesture type: " << event.type(); |
171 break; | 168 break; |
172 default: | 169 default: |
173 NOTREACHED() << "Unknown gesture type: " << event.type(); | 170 NOTREACHED() << "Unknown gesture type: " << event.type(); |
174 } | 171 } |
175 | 172 |
| 173 blink::WebGestureEvent webkit_event( |
| 174 type, EventFlagsToWebEventModifiers(event.flags()), |
| 175 EventTimeStampToSeconds(event.time_stamp())); |
176 webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad; | 176 webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad; |
177 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); | 177 if (event.type() == ET_SCROLL_FLING_START) { |
178 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); | 178 webkit_event.data.flingStart.velocityX = event.x_offset(); |
| 179 webkit_event.data.flingStart.velocityY = event.y_offset(); |
| 180 } |
| 181 |
179 return webkit_event; | 182 return webkit_event; |
180 } | 183 } |
181 | 184 |
182 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event); | 185 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event); |
183 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( | 186 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
184 const MouseWheelEvent& event); | 187 const MouseWheelEvent& event); |
185 | 188 |
186 // General approach: | 189 // General approach: |
187 // | 190 // |
188 // Event only carries a subset of possible event data provided to UI by the host | 191 // Event only carries a subset of possible event data provided to UI by the host |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 | 356 |
354 const gfx::Point screen_point = | 357 const gfx::Point screen_point = |
355 GetScreenLocationFromEvent(event, screen_location_callback); | 358 GetScreenLocationFromEvent(event, screen_location_callback); |
356 gesture_event.globalX = screen_point.x(); | 359 gesture_event.globalX = screen_point.x(); |
357 gesture_event.globalY = screen_point.y(); | 360 gesture_event.globalY = screen_point.y(); |
358 | 361 |
359 return gesture_event; | 362 return gesture_event; |
360 } | 363 } |
361 | 364 |
362 blink::WebGestureEvent MakeWebGestureEventFlingCancel() { | 365 blink::WebGestureEvent MakeWebGestureEventFlingCancel() { |
363 blink::WebGestureEvent gesture_event; | 366 blink::WebGestureEvent gesture_event( |
| 367 blink::WebInputEvent::GestureFlingCancel, |
| 368 blink::WebInputEvent::NoModifiers, |
| 369 EventTimeStampToSeconds(EventTimeForNow())); |
364 | 370 |
365 // All other fields are ignored on a GestureFlingCancel event. | 371 // All other fields are ignored on a GestureFlingCancel event. |
366 gesture_event.type = blink::WebInputEvent::GestureFlingCancel; | |
367 gesture_event.timeStampSeconds = EventTimeStampToSeconds(EventTimeForNow()); | |
368 gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad; | 372 gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad; |
369 return gesture_event; | 373 return gesture_event; |
370 } | 374 } |
371 | 375 |
372 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event) { | 376 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event) { |
373 blink::WebMouseEvent webkit_event; | 377 blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined; |
| 378 int click_count = 0; |
| 379 switch (event.type()) { |
| 380 case ET_MOUSE_PRESSED: |
| 381 type = blink::WebInputEvent::MouseDown; |
| 382 click_count = event.GetClickCount(); |
| 383 break; |
| 384 case ET_MOUSE_RELEASED: |
| 385 type = blink::WebInputEvent::MouseUp; |
| 386 click_count = event.GetClickCount(); |
| 387 break; |
| 388 case ET_MOUSE_EXITED: |
| 389 // TODO(chaopeng) this fix only for chromeos now, should convert ET_MOUSE_EXITED |
| 390 // to MouseLeave when crbug.com/450631 fixed. |
| 391 #if defined(OS_CHROMEOS) |
| 392 type = blink::WebInputEvent::MouseLeave; |
| 393 break; |
| 394 #endif |
| 395 case ET_MOUSE_ENTERED: |
| 396 case ET_MOUSE_MOVED: |
| 397 case ET_MOUSE_DRAGGED: |
| 398 type = blink::WebInputEvent::MouseMove; |
| 399 break; |
| 400 default: |
| 401 NOTIMPLEMENTED() << "Received unexpected event: " << event.type(); |
| 402 break; |
| 403 } |
374 | 404 |
375 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); | 405 blink::WebMouseEvent webkit_event( |
376 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); | 406 type, EventFlagsToWebEventModifiers(event.flags()), |
| 407 EventTimeStampToSeconds(event.time_stamp())); |
377 webkit_event.button = blink::WebMouseEvent::Button::NoButton; | 408 webkit_event.button = blink::WebMouseEvent::Button::NoButton; |
378 int button_flags = event.flags(); | 409 int button_flags = event.flags(); |
379 if (event.type() == ET_MOUSE_PRESSED || event.type() == ET_MOUSE_RELEASED) { | 410 if (event.type() == ET_MOUSE_PRESSED || event.type() == ET_MOUSE_RELEASED) { |
380 // We want to use changed_button_flags() for mouse pressed & released. | 411 // We want to use changed_button_flags() for mouse pressed & released. |
381 // These flags can be used only if they are set which is not always the case | 412 // These flags can be used only if they are set which is not always the case |
382 // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc). | 413 // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc). |
383 if (event.changed_button_flags()) | 414 if (event.changed_button_flags()) |
384 button_flags = event.changed_button_flags(); | 415 button_flags = event.changed_button_flags(); |
385 } | 416 } |
386 if (button_flags & EF_LEFT_MOUSE_BUTTON) | 417 if (button_flags & EF_LEFT_MOUSE_BUTTON) |
387 webkit_event.button = blink::WebMouseEvent::Button::Left; | 418 webkit_event.button = blink::WebMouseEvent::Button::Left; |
388 if (button_flags & EF_MIDDLE_MOUSE_BUTTON) | 419 if (button_flags & EF_MIDDLE_MOUSE_BUTTON) |
389 webkit_event.button = blink::WebMouseEvent::Button::Middle; | 420 webkit_event.button = blink::WebMouseEvent::Button::Middle; |
390 if (button_flags & EF_RIGHT_MOUSE_BUTTON) | 421 if (button_flags & EF_RIGHT_MOUSE_BUTTON) |
391 webkit_event.button = blink::WebMouseEvent::Button::Right; | 422 webkit_event.button = blink::WebMouseEvent::Button::Right; |
392 | 423 |
393 switch (event.type()) { | 424 webkit_event.clickCount = click_count; |
394 case ET_MOUSE_PRESSED: | |
395 webkit_event.type = blink::WebInputEvent::MouseDown; | |
396 webkit_event.clickCount = event.GetClickCount(); | |
397 break; | |
398 case ET_MOUSE_RELEASED: | |
399 webkit_event.type = blink::WebInputEvent::MouseUp; | |
400 webkit_event.clickCount = event.GetClickCount(); | |
401 break; | |
402 case ET_MOUSE_EXITED: | |
403 // TODO(chaopeng) this fix only for chromeos now, should convert ET_MOUSE_EXITED | |
404 // to MouseLeave when crbug.com/450631 fixed. | |
405 #if defined(OS_CHROMEOS) | |
406 webkit_event.type = blink::WebInputEvent::MouseLeave; | |
407 break; | |
408 #endif | |
409 case ET_MOUSE_ENTERED: | |
410 case ET_MOUSE_MOVED: | |
411 case ET_MOUSE_DRAGGED: | |
412 webkit_event.type = blink::WebInputEvent::MouseMove; | |
413 break; | |
414 default: | |
415 NOTIMPLEMENTED() << "Received unexpected event: " << event.type(); | |
416 break; | |
417 } | |
418 | |
419 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); | 425 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); |
420 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); | 426 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); |
421 webkit_event.force = event.pointer_details().force; | 427 webkit_event.force = event.pointer_details().force; |
422 webkit_event.pointerType = | 428 webkit_event.pointerType = |
423 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 429 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
424 | 430 |
425 return webkit_event; | 431 return webkit_event; |
426 } | 432 } |
427 | 433 |
428 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( | 434 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
429 const MouseWheelEvent& event) { | 435 const MouseWheelEvent& event) { |
430 blink::WebMouseWheelEvent webkit_event; | 436 blink::WebMouseWheelEvent webkit_event( |
| 437 blink::WebInputEvent::MouseWheel, |
| 438 EventFlagsToWebEventModifiers(event.flags()), |
| 439 EventTimeStampToSeconds(event.time_stamp())); |
431 | 440 |
432 webkit_event.type = blink::WebInputEvent::MouseWheel; | |
433 webkit_event.button = blink::WebMouseEvent::Button::NoButton; | 441 webkit_event.button = blink::WebMouseEvent::Button::NoButton; |
434 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); | |
435 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); | |
436 | 442 |
437 webkit_event.deltaX = event.x_offset(); | 443 webkit_event.deltaX = event.x_offset(); |
438 webkit_event.deltaY = event.y_offset(); | 444 webkit_event.deltaY = event.y_offset(); |
439 | 445 |
440 webkit_event.wheelTicksX = webkit_event.deltaX / MouseWheelEvent::kWheelDelta; | 446 webkit_event.wheelTicksX = webkit_event.deltaX / MouseWheelEvent::kWheelDelta; |
441 webkit_event.wheelTicksY = webkit_event.deltaY / MouseWheelEvent::kWheelDelta; | 447 webkit_event.wheelTicksY = webkit_event.deltaY / MouseWheelEvent::kWheelDelta; |
442 | 448 |
443 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); | 449 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); |
444 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); | 450 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); |
445 webkit_event.force = event.pointer_details().force; | 451 webkit_event.force = event.pointer_details().force; |
446 webkit_event.pointerType = | 452 webkit_event.pointerType = |
447 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 453 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
448 | 454 |
449 return webkit_event; | 455 return webkit_event; |
450 } | 456 } |
451 | 457 |
452 } // namespace ui | 458 } // namespace ui |
OLD | NEW |