Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/web_input_event_aura.h" | 5 #include "ui/events/blink/web_input_event.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | |
| 8 #include "content/browser/renderer_host/input/web_input_event_util.h" | |
| 9 #include "ui/aura/client/screen_position_client.h" | |
| 10 #include "ui/aura/window.h" | |
| 11 #include "ui/events/base_event_utils.h" | 7 #include "ui/events/base_event_utils.h" |
| 12 #include "ui/events/blink/blink_event_util.h" | 8 #include "ui/events/blink/blink_event_util.h" |
| 13 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
| 14 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
| 15 #include "ui/events/keycodes/dom/keycode_converter.h" | 11 #include "ui/events/keycodes/dom/keycode_converter.h" |
| 16 #include "ui/events/keycodes/keyboard_code_conversion.h" | 12 #include "ui/events/keycodes/keyboard_code_conversion.h" |
| 17 | 13 |
| 18 namespace content { | 14 #if defined(OS_WIN) |
| 15 #include "ui/events/blink/web_input_event_builders_win.h" | |
| 16 #endif | |
| 17 | |
| 18 namespace ui { | |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 // Used for scrolling. This matches Firefox behavior. | |
| 22 const int kPixelsPerTick = 53; | |
| 21 | 23 |
| 22 gfx::Point GetScreenLocationFromEvent(const ui::LocatedEvent& event) { | 24 gfx::Point GetScreenLocationFromEvent( |
| 23 if (!event.target()) | 25 const LocatedEvent& event, |
| 24 return event.root_location(); | 26 const base::Callback<gfx::Point(const LocatedEvent& event)>& |
| 25 | 27 screen_location_callback) { |
| 26 aura::Window* root = | 28 return event.target() ? screen_location_callback.Run(event) |
|
sadrul
2016/08/15 15:55:12
DCHECK that screen_location_callback is non-null
jonross
2016/08/16 15:25:16
Done.
| |
| 27 static_cast<aura::Window*>(event.target())->GetRootWindow(); | 29 : event.root_location(); |
| 28 aura::client::ScreenPositionClient* spc = | |
| 29 aura::client::GetScreenPositionClient(root); | |
| 30 if (!spc) | |
| 31 return event.root_location(); | |
| 32 | |
| 33 gfx::Point screen_location(event.root_location()); | |
| 34 spc->ConvertPointToScreen(root, &screen_location); | |
| 35 return screen_location; | |
| 36 } | 30 } |
| 37 | 31 |
| 38 blink::WebPointerProperties::PointerType EventPointerTypeToWebPointerType( | 32 blink::WebPointerProperties::PointerType EventPointerTypeToWebPointerType( |
| 39 ui::EventPointerType pointer_type) { | 33 EventPointerType pointer_type) { |
| 40 switch (pointer_type) { | 34 switch (pointer_type) { |
| 41 case ui::EventPointerType::POINTER_TYPE_UNKNOWN: | 35 case EventPointerType::POINTER_TYPE_UNKNOWN: |
| 42 return blink::WebPointerProperties::PointerType::Unknown; | 36 return blink::WebPointerProperties::PointerType::Unknown; |
| 43 case ui::EventPointerType::POINTER_TYPE_MOUSE: | 37 case EventPointerType::POINTER_TYPE_MOUSE: |
| 44 return blink::WebPointerProperties::PointerType::Mouse; | 38 return blink::WebPointerProperties::PointerType::Mouse; |
| 45 case ui::EventPointerType::POINTER_TYPE_PEN: | 39 case EventPointerType::POINTER_TYPE_PEN: |
| 46 return blink::WebPointerProperties::PointerType::Pen; | 40 return blink::WebPointerProperties::PointerType::Pen; |
| 47 case ui::EventPointerType::POINTER_TYPE_TOUCH: | 41 case EventPointerType::POINTER_TYPE_TOUCH: |
| 48 return blink::WebPointerProperties::PointerType::Touch; | 42 return blink::WebPointerProperties::PointerType::Touch; |
| 49 } | 43 } |
| 50 NOTREACHED() << "Unexpected EventPointerType"; | 44 NOTREACHED() << "Unexpected EventPointerType"; |
| 51 return blink::WebPointerProperties::PointerType::Unknown; | 45 return blink::WebPointerProperties::PointerType::Unknown; |
| 52 } | 46 } |
| 53 | 47 |
| 54 // Creates a WebGestureEvent from a ui::GestureEvent. Note that it does not | 48 // Creates a WebGestureEvent from a GestureEvent. Note that it does not |
| 55 // populate the event coordinates (i.e. |x|, |y|, |globalX|, and |globalY|). So | 49 // populate the event coordinates (i.e. |x|, |y|, |globalX|, and |globalY|). So |
| 56 // the caller must populate these fields. | 50 // the caller must populate these fields. |
| 57 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( | 51 blink::WebGestureEvent MakeWebGestureEventFromUIEvent( |
| 58 const ui::GestureEvent& event) { | 52 const GestureEvent& event) { |
| 59 return ui::CreateWebGestureEvent( | 53 return CreateWebGestureEvent(event.details(), event.time_stamp(), |
| 60 event.details(), event.time_stamp(), event.location_f(), | 54 event.location_f(), event.root_location_f(), |
| 61 event.root_location_f(), event.flags(), event.unique_touch_event_id()); | 55 event.flags(), event.unique_touch_event_id()); |
| 62 } | 56 } |
| 63 | 57 |
| 64 } // namespace | 58 } // namespace |
| 65 | 59 |
| 66 #if defined(OS_WIN) | 60 #if defined(OS_WIN) |
| 61 // On Windows, we can just use the builtin WebKit factory methods to fully | |
| 62 // construct our pre-translated events. | |
| 63 | |
| 67 blink::WebMouseEvent MakeUntranslatedWebMouseEventFromNativeEvent( | 64 blink::WebMouseEvent MakeUntranslatedWebMouseEventFromNativeEvent( |
| 68 const base::NativeEvent& native_event, | 65 const base::NativeEvent& native_event, |
| 69 const base::TimeTicks& time_stamp, | 66 const base::TimeTicks& time_stamp, |
| 70 blink::WebPointerProperties::PointerType pointer_type); | 67 blink::WebPointerProperties::PointerType pointer_type) { |
| 68 return WebMouseEventBuilder::Build(native_event.hwnd, native_event.message, | |
| 69 native_event.wParam, native_event.lParam, | |
| 70 ui::EventTimeStampToSeconds(time_stamp), | |
| 71 pointer_type); | |
| 72 } | |
| 73 | |
| 71 blink::WebMouseWheelEvent MakeUntranslatedWebMouseWheelEventFromNativeEvent( | 74 blink::WebMouseWheelEvent MakeUntranslatedWebMouseWheelEventFromNativeEvent( |
| 72 const base::NativeEvent& native_event, | 75 const base::NativeEvent& native_event, |
| 73 const base::TimeTicks& time_stamp, | 76 const base::TimeTicks& time_stamp, |
| 74 blink::WebPointerProperties::PointerType pointer_type); | 77 blink::WebPointerProperties::PointerType pointer_type) { |
| 78 return WebMouseWheelEventBuilder::Build( | |
| 79 native_event.hwnd, native_event.message, native_event.wParam, | |
| 80 native_event.lParam, ui::EventTimeStampToSeconds(time_stamp), | |
| 81 pointer_type); | |
| 82 } | |
| 83 | |
| 75 blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent( | 84 blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent( |
| 76 const base::NativeEvent& native_event, | 85 const base::NativeEvent& native_event, |
| 77 const base::TimeTicks& time_stamp); | 86 const base::TimeTicks& time_stamp) { |
| 87 return WebKeyboardEventBuilder::Build( | |
| 88 native_event.hwnd, native_event.message, native_event.wParam, | |
| 89 native_event.lParam, ui::EventTimeStampToSeconds(time_stamp)); | |
| 90 } | |
| 91 | |
| 78 blink::WebGestureEvent MakeWebGestureEventFromNativeEvent( | 92 blink::WebGestureEvent MakeWebGestureEventFromNativeEvent( |
|
sadrul
2016/08/15 15:55:12
We should just remove this (maybe in a follow up C
jonross
2016/08/16 15:25:16
I've noted this on the bug.
| |
| 79 const base::NativeEvent& native_event, | 93 const base::NativeEvent& native_event, |
| 80 const base::TimeTicks& time_stamp); | 94 const base::TimeTicks& time_stamp) { |
| 81 #endif | 95 // TODO: Create gestures from native event. |
| 96 NOTIMPLEMENTED(); | |
| 97 return blink::WebGestureEvent(); | |
| 98 } | |
| 82 | 99 |
| 83 blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( | 100 #endif // defined(OS_WIN) |
| 84 const ui::KeyEvent& event) { | 101 |
| 102 blink::WebKeyboardEvent MakeWebKeyboardEventFromUiEvent( | |
| 103 const KeyEvent& event) { | |
| 85 blink::WebKeyboardEvent webkit_event; | 104 blink::WebKeyboardEvent webkit_event; |
| 86 | 105 |
| 87 webkit_event.timeStampSeconds = | 106 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); |
| 88 ui::EventTimeStampToSeconds(event.time_stamp()); | 107 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()) | |
| 89 webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags()) | | |
| 90 DomCodeToWebInputEventModifiers(event.code()); | 108 DomCodeToWebInputEventModifiers(event.code()); |
| 91 | 109 |
| 92 switch (event.type()) { | 110 switch (event.type()) { |
| 93 case ui::ET_KEY_PRESSED: | 111 case ET_KEY_PRESSED: |
| 94 webkit_event.type = event.is_char() ? blink::WebInputEvent::Char : | 112 webkit_event.type = event.is_char() ? blink::WebInputEvent::Char |
| 95 blink::WebInputEvent::RawKeyDown; | 113 : blink::WebInputEvent::RawKeyDown; |
| 96 break; | 114 break; |
| 97 case ui::ET_KEY_RELEASED: | 115 case ET_KEY_RELEASED: |
| 98 webkit_event.type = blink::WebInputEvent::KeyUp; | 116 webkit_event.type = blink::WebInputEvent::KeyUp; |
| 99 break; | 117 break; |
| 100 default: | 118 default: |
| 101 NOTREACHED(); | 119 NOTREACHED(); |
| 102 } | 120 } |
| 103 | 121 |
| 104 if (webkit_event.modifiers & blink::WebInputEvent::AltKey) | 122 if (webkit_event.modifiers & blink::WebInputEvent::AltKey) |
| 105 webkit_event.isSystemKey = true; | 123 webkit_event.isSystemKey = true; |
| 106 | 124 |
| 107 // TODO(dtapuska): crbug.com/570388. Ozone appears to deliver | 125 // TODO(dtapuska): crbug.com/570388. Ozone appears to deliver |
| 108 // key_code events that aren't "located" for the keypad like | 126 // key_code events that aren't "located" for the keypad like |
| 109 // Windows and X11 do and blink expects. | 127 // Windows and X11 do and blink expects. |
| 110 webkit_event.windowsKeyCode = | 128 webkit_event.windowsKeyCode = |
| 111 ui::NonLocatedToLocatedKeypadKeyboardCode(event.key_code(), event.code()); | 129 NonLocatedToLocatedKeypadKeyboardCode(event.key_code(), event.code()); |
| 112 webkit_event.nativeKeyCode = | 130 webkit_event.nativeKeyCode = |
| 113 ui::KeycodeConverter::DomCodeToNativeKeycode(event.code()); | 131 KeycodeConverter::DomCodeToNativeKeycode(event.code()); |
| 114 webkit_event.domCode = static_cast<int>(event.code()); | 132 webkit_event.domCode = static_cast<int>(event.code()); |
| 115 webkit_event.domKey = static_cast<int>(event.GetDomKey()); | 133 webkit_event.domKey = static_cast<int>(event.GetDomKey()); |
| 116 webkit_event.unmodifiedText[0] = event.GetUnmodifiedText(); | 134 webkit_event.unmodifiedText[0] = event.GetUnmodifiedText(); |
| 117 webkit_event.text[0] = event.GetText(); | 135 webkit_event.text[0] = event.GetText(); |
| 118 | 136 |
| 119 return webkit_event; | 137 return webkit_event; |
| 120 } | 138 } |
| 121 | 139 |
| 122 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( | 140 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
| 123 const ui::ScrollEvent& event) { | 141 const ScrollEvent& event) { |
| 124 blink::WebMouseWheelEvent webkit_event; | 142 blink::WebMouseWheelEvent webkit_event; |
| 125 | 143 |
| 126 webkit_event.type = blink::WebInputEvent::MouseWheel; | 144 webkit_event.type = blink::WebInputEvent::MouseWheel; |
| 127 webkit_event.button = blink::WebMouseEvent::ButtonNone; | 145 webkit_event.button = blink::WebMouseEvent::ButtonNone; |
| 128 webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags()); | 146 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); |
| 129 webkit_event.timeStampSeconds = | 147 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); |
| 130 ui::EventTimeStampToSeconds(event.time_stamp()); | |
| 131 webkit_event.hasPreciseScrollingDeltas = true; | 148 webkit_event.hasPreciseScrollingDeltas = true; |
| 132 | 149 |
| 133 float offset_ordinal_x = 0.f; | 150 float offset_ordinal_x = 0.f; |
| 134 float offset_ordinal_y = 0.f; | 151 float offset_ordinal_y = 0.f; |
| 135 if ((event.flags() & ui::EF_SHIFT_DOWN) != 0 && event.x_offset() == 0) { | 152 if ((event.flags() & EF_SHIFT_DOWN) != 0 && event.x_offset() == 0) { |
| 136 webkit_event.deltaX = event.y_offset(); | 153 webkit_event.deltaX = event.y_offset(); |
| 137 webkit_event.deltaY = 0; | 154 webkit_event.deltaY = 0; |
| 138 offset_ordinal_x = event.y_offset_ordinal(); | 155 offset_ordinal_x = event.y_offset_ordinal(); |
| 139 offset_ordinal_y = event.x_offset_ordinal(); | 156 offset_ordinal_y = event.x_offset_ordinal(); |
| 140 } else { | 157 } else { |
| 141 webkit_event.deltaX = event.x_offset(); | 158 webkit_event.deltaX = event.x_offset(); |
| 142 webkit_event.deltaY = event.y_offset(); | 159 webkit_event.deltaY = event.y_offset(); |
| 143 offset_ordinal_x = event.x_offset_ordinal(); | 160 offset_ordinal_x = event.x_offset_ordinal(); |
| 144 offset_ordinal_y = event.y_offset_ordinal(); | 161 offset_ordinal_y = event.y_offset_ordinal(); |
| 145 } | 162 } |
| 146 | 163 |
| 147 if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f) | 164 if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f) |
| 148 webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX; | 165 webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX; |
| 149 webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; | 166 webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; |
| 150 webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; | 167 webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; |
| 151 if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f) | 168 if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f) |
| 152 webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY; | 169 webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY; |
| 153 | 170 |
| 154 webkit_event.pointerType = | 171 webkit_event.pointerType = |
| 155 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 172 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
| 156 return webkit_event; | 173 return webkit_event; |
| 157 } | 174 } |
| 158 | 175 |
| 159 blink::WebGestureEvent MakeWebGestureEventFromAuraEvent( | 176 blink::WebGestureEvent MakeWebGestureEventFromUiEvent( |
| 160 const ui::ScrollEvent& event) { | 177 const ScrollEvent& event) { |
| 161 blink::WebGestureEvent webkit_event; | 178 blink::WebGestureEvent webkit_event; |
| 162 | 179 |
| 163 switch (event.type()) { | 180 switch (event.type()) { |
| 164 case ui::ET_SCROLL_FLING_START: | 181 case ET_SCROLL_FLING_START: |
| 165 webkit_event.type = blink::WebInputEvent::GestureFlingStart; | 182 webkit_event.type = blink::WebInputEvent::GestureFlingStart; |
| 166 webkit_event.data.flingStart.velocityX = event.x_offset(); | 183 webkit_event.data.flingStart.velocityX = event.x_offset(); |
| 167 webkit_event.data.flingStart.velocityY = event.y_offset(); | 184 webkit_event.data.flingStart.velocityY = event.y_offset(); |
| 168 break; | 185 break; |
| 169 case ui::ET_SCROLL_FLING_CANCEL: | 186 case ET_SCROLL_FLING_CANCEL: |
| 170 webkit_event.type = blink::WebInputEvent::GestureFlingCancel; | 187 webkit_event.type = blink::WebInputEvent::GestureFlingCancel; |
| 171 break; | 188 break; |
| 172 case ui::ET_SCROLL: | 189 case ET_SCROLL: |
| 173 NOTREACHED() << "Invalid gesture type: " << event.type(); | 190 NOTREACHED() << "Invalid gesture type: " << event.type(); |
| 174 break; | 191 break; |
| 175 default: | 192 default: |
| 176 NOTREACHED() << "Unknown gesture type: " << event.type(); | 193 NOTREACHED() << "Unknown gesture type: " << event.type(); |
| 177 } | 194 } |
| 178 | 195 |
| 179 webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad; | 196 webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad; |
| 180 webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags()); | 197 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); |
| 181 webkit_event.timeStampSeconds = | 198 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); |
| 182 ui::EventTimeStampToSeconds(event.time_stamp()); | |
| 183 return webkit_event; | 199 return webkit_event; |
| 184 } | 200 } |
| 185 | 201 |
| 186 blink::WebMouseEvent MakeWebMouseEventFromAuraEvent( | 202 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event); |
| 187 const ui::MouseEvent& event); | 203 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
| 188 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( | 204 const MouseWheelEvent& event); |
| 189 const ui::MouseWheelEvent& event); | |
| 190 | 205 |
| 191 // General approach: | 206 // General approach: |
| 192 // | 207 // |
| 193 // ui::Event only carries a subset of possible event data provided to Aura by | 208 // Event only carries a subset of possible event data provided to UI by the host |
| 194 // the host platform. WebKit utilizes a larger subset of that information than | 209 // platform. WebKit utilizes a larger subset of that information, and includes |
| 195 // Aura itself. WebKit includes some built in cracking functionality that we | 210 // some built in cracking functionality that we rely on to obtain this |
| 196 // rely on to obtain this information cleanly and consistently. | 211 // information cleanly and consistently. |
| 197 // | 212 // |
| 198 // The only place where an ui::Event's data differs from what the underlying | 213 // The only place where an Event's data differs from what the underlying |
| 199 // base::NativeEvent would provide is position data, since we would like to | 214 // base::NativeEvent would provide is position data. We would like to provide |
| 200 // provide coordinates relative to the aura::Window that is hosting the | 215 // coordinates relative to its hosting window, rather than the top level |
| 201 // renderer, not the top level platform window. | 216 // platform window. To do this a callback is accepted to allow for clients to |
| 217 // map the coordinates. | |
| 202 // | 218 // |
| 203 // The approach is to fully construct a blink::WebInputEvent from the | 219 // The approach is to fully construct a blink::WebInputEvent from the |
| 204 // ui::Event's base::NativeEvent, and then replace the coordinate fields with | 220 // Event's base::NativeEvent, and then replace the coordinate fields with |
| 205 // the translated values from the ui::Event. | 221 // the translated values from the Event. |
| 206 // | 222 // |
| 207 // The exception is mouse events on linux. The ui::MouseEvent contains enough | 223 // The exception is mouse events on linux. The MouseEvent contains enough |
| 208 // necessary information to construct a WebMouseEvent. So instead of extracting | 224 // necessary information to construct a WebMouseEvent. So instead of extracting |
| 209 // the information from the XEvent, which can be tricky when supporting both | 225 // the information from the XEvent, which can be tricky when supporting both |
| 210 // XInput2 and XInput, the WebMouseEvent is constructed from the | 226 // XInput2 and XInput, the WebMouseEvent is constructed from the |
| 211 // ui::MouseEvent. This will not be necessary once only XInput2 is supported. | 227 // MouseEvent. This will not be necessary once only XInput2 is supported. |
| 212 // | 228 // |
| 213 | 229 |
| 214 blink::WebMouseEvent MakeWebMouseEvent(const ui::MouseEvent& event) { | 230 blink::WebMouseEvent MakeWebMouseEvent( |
| 231 const MouseEvent& event, | |
| 232 const base::Callback<gfx::Point(const ui::LocatedEvent& event)>& | |
| 233 screen_location_callback) { | |
| 215 // Construct an untranslated event from the platform event data. | 234 // Construct an untranslated event from the platform event data. |
| 216 blink::WebMouseEvent webkit_event = | 235 blink::WebMouseEvent webkit_event = |
| 217 #if defined(OS_WIN) | 236 #if defined(OS_WIN) |
| 218 // On Windows we have WM_ events comming from desktop and pure aura | 237 // On Windows we have WM_ events comming from desktop and pure ui::Events |
| 219 // events comming from metro mode. | 238 // comming from metro mode. |
| 220 event.native_event().message && (event.type() != ui::ET_MOUSE_EXITED) | 239 event.native_event().message && (event.type() != ET_MOUSE_EXITED) |
| 221 ? MakeUntranslatedWebMouseEventFromNativeEvent( | 240 ? MakeUntranslatedWebMouseEventFromNativeEvent( |
| 222 event.native_event(), event.time_stamp(), | 241 event.native_event(), event.time_stamp(), |
| 223 EventPointerTypeToWebPointerType( | 242 EventPointerTypeToWebPointerType( |
| 224 event.pointer_details().pointer_type)) | 243 event.pointer_details().pointer_type)) |
| 225 : MakeWebMouseEventFromAuraEvent(event); | 244 : MakeWebMouseEventFromUiEvent(event); |
| 226 #else | 245 #else |
| 227 MakeWebMouseEventFromAuraEvent(event); | 246 MakeWebMouseEventFromUiEvent(event); |
| 228 #endif | 247 #endif |
| 229 // Replace the event's coordinate fields with translated position data from | 248 // Replace the event's coordinate fields with translated position data from |
| 230 // |event|. | 249 // |event|. |
| 231 webkit_event.windowX = webkit_event.x = event.x(); | 250 webkit_event.windowX = webkit_event.x = event.x(); |
| 232 webkit_event.windowY = webkit_event.y = event.y(); | 251 webkit_event.windowY = webkit_event.y = event.y(); |
| 233 | 252 |
| 234 #if defined(OS_WIN) | 253 #if defined(OS_WIN) |
| 235 if (event.native_event().message) | 254 if (event.native_event().message) |
| 236 return webkit_event; | 255 return webkit_event; |
| 237 #endif | 256 #endif |
| 238 const gfx::Point screen_point = GetScreenLocationFromEvent(event); | 257 |
| 258 const gfx::Point screen_point = | |
| 259 GetScreenLocationFromEvent(event, screen_location_callback); | |
| 239 webkit_event.globalX = screen_point.x(); | 260 webkit_event.globalX = screen_point.x(); |
| 240 webkit_event.globalY = screen_point.y(); | 261 webkit_event.globalY = screen_point.y(); |
| 241 | 262 |
| 242 return webkit_event; | 263 return webkit_event; |
| 243 } | 264 } |
| 244 | 265 |
| 245 blink::WebMouseWheelEvent MakeWebMouseWheelEvent( | 266 blink::WebMouseWheelEvent MakeWebMouseWheelEvent( |
| 246 const ui::MouseWheelEvent& event) { | 267 const MouseWheelEvent& event, |
| 268 const base::Callback<gfx::Point(const ui::LocatedEvent& event)>& | |
| 269 screen_location_callback) { | |
| 247 #if defined(OS_WIN) | 270 #if defined(OS_WIN) |
| 248 // Construct an untranslated event from the platform event data. | 271 // Construct an untranslated event from the platform event data. |
| 249 blink::WebMouseWheelEvent webkit_event = | 272 blink::WebMouseWheelEvent webkit_event = |
| 250 event.native_event().message | 273 event.native_event().message |
| 251 ? MakeUntranslatedWebMouseWheelEventFromNativeEvent( | 274 ? MakeUntranslatedWebMouseWheelEventFromNativeEvent( |
| 252 event.native_event(), event.time_stamp(), | 275 event.native_event(), event.time_stamp(), |
| 253 EventPointerTypeToWebPointerType( | 276 EventPointerTypeToWebPointerType( |
| 254 event.pointer_details().pointer_type)) | 277 event.pointer_details().pointer_type)) |
| 255 : MakeWebMouseWheelEventFromAuraEvent(event); | 278 : MakeWebMouseWheelEventFromUiEvent(event); |
| 256 #else | 279 #else |
| 257 blink::WebMouseWheelEvent webkit_event = | 280 blink::WebMouseWheelEvent webkit_event = |
| 258 MakeWebMouseWheelEventFromAuraEvent(event); | 281 MakeWebMouseWheelEventFromUiEvent(event); |
| 259 #endif | 282 #endif |
| 260 | 283 |
| 261 // Replace the event's coordinate fields with translated position data from | 284 // Replace the event's coordinate fields with translated position data from |
| 262 // |event|. | 285 // |event|. |
| 263 webkit_event.windowX = webkit_event.x = event.x(); | 286 webkit_event.windowX = webkit_event.x = event.x(); |
| 264 webkit_event.windowY = webkit_event.y = event.y(); | 287 webkit_event.windowY = webkit_event.y = event.y(); |
| 265 | 288 |
| 266 const gfx::Point screen_point = GetScreenLocationFromEvent(event); | 289 const gfx::Point screen_point = |
| 290 GetScreenLocationFromEvent(event, screen_location_callback); | |
| 267 webkit_event.globalX = screen_point.x(); | 291 webkit_event.globalX = screen_point.x(); |
| 268 webkit_event.globalY = screen_point.y(); | 292 webkit_event.globalY = screen_point.y(); |
| 269 | 293 |
| 270 return webkit_event; | 294 return webkit_event; |
| 271 } | 295 } |
| 272 | 296 |
| 273 blink::WebMouseWheelEvent MakeWebMouseWheelEvent(const ui::ScrollEvent& event) { | 297 blink::WebMouseWheelEvent MakeWebMouseWheelEvent( |
| 298 const ScrollEvent& event, | |
| 299 const base::Callback<gfx::Point(const ui::LocatedEvent& event)>& | |
| 300 screen_location_callback) { | |
| 274 #if defined(OS_WIN) | 301 #if defined(OS_WIN) |
| 275 // Construct an untranslated event from the platform event data. | 302 // Construct an untranslated event from the platform event data. |
| 276 blink::WebMouseWheelEvent webkit_event = | 303 blink::WebMouseWheelEvent webkit_event = |
| 277 event.native_event().message | 304 event.native_event().message |
| 278 ? MakeUntranslatedWebMouseWheelEventFromNativeEvent( | 305 ? MakeUntranslatedWebMouseWheelEventFromNativeEvent( |
| 279 event.native_event(), event.time_stamp(), | 306 event.native_event(), event.time_stamp(), |
| 280 EventPointerTypeToWebPointerType( | 307 EventPointerTypeToWebPointerType( |
| 281 event.pointer_details().pointer_type)) | 308 event.pointer_details().pointer_type)) |
| 282 : MakeWebMouseWheelEventFromAuraEvent(event); | 309 : MakeWebMouseWheelEventFromUiEvent(event); |
| 283 #else | 310 #else |
| 284 blink::WebMouseWheelEvent webkit_event = | 311 blink::WebMouseWheelEvent webkit_event = |
| 285 MakeWebMouseWheelEventFromAuraEvent(event); | 312 MakeWebMouseWheelEventFromUiEvent(event); |
| 286 #endif | 313 #endif |
| 287 | 314 |
| 288 // Replace the event's coordinate fields with translated position data from | 315 // Replace the event's coordinate fields with translated position data from |
| 289 // |event|. | 316 // |event|. |
| 290 webkit_event.windowX = webkit_event.x = event.x(); | 317 webkit_event.windowX = webkit_event.x = event.x(); |
| 291 webkit_event.windowY = webkit_event.y = event.y(); | 318 webkit_event.windowY = webkit_event.y = event.y(); |
| 292 | 319 |
| 293 const gfx::Point screen_point = GetScreenLocationFromEvent(event); | 320 const gfx::Point screen_point = |
| 321 GetScreenLocationFromEvent(event, screen_location_callback); | |
| 294 webkit_event.globalX = screen_point.x(); | 322 webkit_event.globalX = screen_point.x(); |
| 295 webkit_event.globalY = screen_point.y(); | 323 webkit_event.globalY = screen_point.y(); |
| 296 | 324 |
| 297 return webkit_event; | 325 return webkit_event; |
| 298 } | 326 } |
| 299 | 327 |
| 300 blink::WebKeyboardEvent MakeWebKeyboardEvent(const ui::KeyEvent& event) { | 328 blink::WebKeyboardEvent MakeWebKeyboardEvent(const KeyEvent& event) { |
| 301 // Windows can figure out whether or not to construct a RawKeyDown or a Char | 329 // Windows can figure out whether or not to construct a RawKeyDown or a Char |
| 302 // WebInputEvent based on the type of message carried in | 330 // WebInputEvent based on the type of message carried in |
| 303 // event.native_event(). X11 is not so fortunate, there is no separate | 331 // event.native_event(). X11 is not so fortunate, there is no separate |
| 304 // translated event type, so DesktopHostLinux sends an extra KeyEvent with | 332 // translated event type, so DesktopHostLinux sends an extra KeyEvent with |
| 305 // is_char() == true. We need to pass the ui::KeyEvent to the X11 function | 333 // is_char() == true. We need to pass the KeyEvent to the X11 function |
| 306 // to detect this case so the right event type can be constructed. | 334 // to detect this case so the right event type can be constructed. |
| 307 #if defined(OS_WIN) | 335 #if defined(OS_WIN) |
| 308 if (event.HasNativeEvent()) { | 336 if (event.HasNativeEvent()) { |
| 309 // Key events require no translation by the aura system. | 337 // Key events require no translation. |
| 310 blink::WebKeyboardEvent webkit_event(MakeWebKeyboardEventFromNativeEvent( | 338 blink::WebKeyboardEvent webkit_event(MakeWebKeyboardEventFromNativeEvent( |
| 311 event.native_event(), event.time_stamp())); | 339 event.native_event(), event.time_stamp())); |
| 312 webkit_event.modifiers |= DomCodeToWebInputEventModifiers(event.code()); | 340 webkit_event.modifiers |= DomCodeToWebInputEventModifiers(event.code()); |
| 313 webkit_event.domCode = static_cast<int>(event.code()); | 341 webkit_event.domCode = static_cast<int>(event.code()); |
| 314 webkit_event.domKey = static_cast<int>(event.GetDomKey()); | 342 webkit_event.domKey = static_cast<int>(event.GetDomKey()); |
| 315 return webkit_event; | 343 return webkit_event; |
| 316 } | 344 } |
| 317 #endif | 345 #endif |
| 318 return MakeWebKeyboardEventFromAuraEvent(event); | 346 return MakeWebKeyboardEventFromUiEvent(event); |
| 319 } | 347 } |
| 320 | 348 |
| 321 blink::WebGestureEvent MakeWebGestureEvent(const ui::GestureEvent& event) { | 349 blink::WebGestureEvent MakeWebGestureEvent( |
| 350 const GestureEvent& event, | |
| 351 const base::Callback<gfx::Point(const ui::LocatedEvent& event)>& | |
| 352 screen_location_callback) { | |
| 322 blink::WebGestureEvent gesture_event; | 353 blink::WebGestureEvent gesture_event; |
| 323 #if defined(OS_WIN) | 354 #if defined(OS_WIN) |
| 324 if (event.HasNativeEvent()) | 355 if (event.HasNativeEvent()) |
| 325 gesture_event = MakeWebGestureEventFromNativeEvent(event.native_event(), | 356 gesture_event = MakeWebGestureEventFromNativeEvent(event.native_event(), |
| 326 event.time_stamp()); | 357 event.time_stamp()); |
| 327 else | 358 else |
| 328 gesture_event = MakeWebGestureEventFromUIEvent(event); | 359 gesture_event = MakeWebGestureEventFromUIEvent(event); |
| 329 #else | 360 #else |
| 330 gesture_event = MakeWebGestureEventFromUIEvent(event); | 361 gesture_event = MakeWebGestureEventFromUIEvent(event); |
| 331 #endif | 362 #endif |
| 332 | 363 |
| 333 gesture_event.x = event.x(); | 364 gesture_event.x = event.x(); |
| 334 gesture_event.y = event.y(); | 365 gesture_event.y = event.y(); |
| 335 | 366 |
| 336 const gfx::Point screen_point = GetScreenLocationFromEvent(event); | 367 const gfx::Point screen_point = |
| 368 GetScreenLocationFromEvent(event, screen_location_callback); | |
| 337 gesture_event.globalX = screen_point.x(); | 369 gesture_event.globalX = screen_point.x(); |
| 338 gesture_event.globalY = screen_point.y(); | 370 gesture_event.globalY = screen_point.y(); |
| 339 | 371 |
| 340 return gesture_event; | 372 return gesture_event; |
| 341 } | 373 } |
| 342 | 374 |
| 343 blink::WebGestureEvent MakeWebGestureEvent(const ui::ScrollEvent& event) { | 375 blink::WebGestureEvent MakeWebGestureEvent( |
| 376 const ScrollEvent& event, | |
| 377 const base::Callback<gfx::Point(const ui::LocatedEvent& event)>& | |
| 378 screen_location_callback) { | |
| 344 blink::WebGestureEvent gesture_event; | 379 blink::WebGestureEvent gesture_event; |
| 345 | 380 |
| 346 #if defined(OS_WIN) | 381 #if defined(OS_WIN) |
| 347 gesture_event = MakeWebGestureEventFromNativeEvent(event.native_event(), | 382 gesture_event = MakeWebGestureEventFromNativeEvent(event.native_event(), |
| 348 event.time_stamp()); | 383 event.time_stamp()); |
| 349 #else | 384 #else |
| 350 gesture_event = MakeWebGestureEventFromAuraEvent(event); | 385 gesture_event = MakeWebGestureEventFromUiEvent(event); |
| 351 #endif | 386 #endif |
| 352 | 387 |
| 353 gesture_event.x = event.x(); | 388 gesture_event.x = event.x(); |
| 354 gesture_event.y = event.y(); | 389 gesture_event.y = event.y(); |
| 355 | 390 |
| 356 const gfx::Point screen_point = GetScreenLocationFromEvent(event); | 391 const gfx::Point screen_point = |
| 392 GetScreenLocationFromEvent(event, screen_location_callback); | |
| 357 gesture_event.globalX = screen_point.x(); | 393 gesture_event.globalX = screen_point.x(); |
| 358 gesture_event.globalY = screen_point.y(); | 394 gesture_event.globalY = screen_point.y(); |
| 359 | 395 |
| 360 return gesture_event; | 396 return gesture_event; |
| 361 } | 397 } |
| 362 | 398 |
| 363 blink::WebGestureEvent MakeWebGestureEventFlingCancel() { | 399 blink::WebGestureEvent MakeWebGestureEventFlingCancel() { |
| 364 blink::WebGestureEvent gesture_event; | 400 blink::WebGestureEvent gesture_event; |
| 365 | 401 |
| 366 // All other fields are ignored on a GestureFlingCancel event. | 402 // All other fields are ignored on a GestureFlingCancel event. |
| 367 gesture_event.type = blink::WebInputEvent::GestureFlingCancel; | 403 gesture_event.type = blink::WebInputEvent::GestureFlingCancel; |
| 368 gesture_event.timeStampSeconds = | 404 gesture_event.timeStampSeconds = EventTimeStampToSeconds(EventTimeForNow()); |
| 369 ui::EventTimeStampToSeconds(ui::EventTimeForNow()); | |
| 370 gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad; | 405 gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad; |
| 371 return gesture_event; | 406 return gesture_event; |
| 372 } | 407 } |
| 373 | 408 |
| 374 blink::WebMouseEvent MakeWebMouseEventFromAuraEvent( | 409 blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event) { |
| 375 const ui::MouseEvent& event) { | |
| 376 blink::WebMouseEvent webkit_event; | 410 blink::WebMouseEvent webkit_event; |
| 377 | 411 |
| 378 webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags()); | 412 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); |
| 379 webkit_event.timeStampSeconds = | 413 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); |
| 380 ui::EventTimeStampToSeconds(event.time_stamp()); | |
| 381 webkit_event.button = blink::WebMouseEvent::ButtonNone; | 414 webkit_event.button = blink::WebMouseEvent::ButtonNone; |
| 382 int button_flags = event.flags(); | 415 int button_flags = event.flags(); |
| 383 if (event.type() == ui::ET_MOUSE_PRESSED || | 416 if (event.type() == ET_MOUSE_PRESSED || event.type() == ET_MOUSE_RELEASED) { |
| 384 event.type() == ui::ET_MOUSE_RELEASED) { | |
| 385 // We want to use changed_button_flags() for mouse pressed & released. | 417 // We want to use changed_button_flags() for mouse pressed & released. |
| 386 // These flags can be used only if they are set which is not always the case | 418 // These flags can be used only if they are set which is not always the case |
| 387 // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc). | 419 // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc). |
| 388 if (event.changed_button_flags()) | 420 if (event.changed_button_flags()) |
| 389 button_flags = event.changed_button_flags(); | 421 button_flags = event.changed_button_flags(); |
| 390 } | 422 } |
| 391 if (button_flags & ui::EF_LEFT_MOUSE_BUTTON) | 423 if (button_flags & EF_LEFT_MOUSE_BUTTON) |
| 392 webkit_event.button = blink::WebMouseEvent::ButtonLeft; | 424 webkit_event.button = blink::WebMouseEvent::ButtonLeft; |
| 393 if (button_flags & ui::EF_MIDDLE_MOUSE_BUTTON) | 425 if (button_flags & EF_MIDDLE_MOUSE_BUTTON) |
| 394 webkit_event.button = blink::WebMouseEvent::ButtonMiddle; | 426 webkit_event.button = blink::WebMouseEvent::ButtonMiddle; |
| 395 if (button_flags & ui::EF_RIGHT_MOUSE_BUTTON) | 427 if (button_flags & EF_RIGHT_MOUSE_BUTTON) |
| 396 webkit_event.button = blink::WebMouseEvent::ButtonRight; | 428 webkit_event.button = blink::WebMouseEvent::ButtonRight; |
| 397 | 429 |
| 398 switch (event.type()) { | 430 switch (event.type()) { |
| 399 case ui::ET_MOUSE_PRESSED: | 431 case ET_MOUSE_PRESSED: |
| 400 webkit_event.type = blink::WebInputEvent::MouseDown; | 432 webkit_event.type = blink::WebInputEvent::MouseDown; |
| 401 webkit_event.clickCount = event.GetClickCount(); | 433 webkit_event.clickCount = event.GetClickCount(); |
| 402 break; | 434 break; |
| 403 case ui::ET_MOUSE_RELEASED: | 435 case ET_MOUSE_RELEASED: |
| 404 webkit_event.type = blink::WebInputEvent::MouseUp; | 436 webkit_event.type = blink::WebInputEvent::MouseUp; |
| 405 webkit_event.clickCount = event.GetClickCount(); | 437 webkit_event.clickCount = event.GetClickCount(); |
| 406 break; | 438 break; |
| 407 case ui::ET_MOUSE_ENTERED: | 439 case ET_MOUSE_ENTERED: |
| 408 case ui::ET_MOUSE_EXITED: | 440 case ET_MOUSE_EXITED: |
| 409 case ui::ET_MOUSE_MOVED: | 441 case ET_MOUSE_MOVED: |
| 410 case ui::ET_MOUSE_DRAGGED: | 442 case ET_MOUSE_DRAGGED: |
| 411 webkit_event.type = blink::WebInputEvent::MouseMove; | 443 webkit_event.type = blink::WebInputEvent::MouseMove; |
| 412 break; | 444 break; |
| 413 default: | 445 default: |
| 414 NOTIMPLEMENTED() << "Received unexpected event: " << event.type(); | 446 NOTIMPLEMENTED() << "Received unexpected event: " << event.type(); |
| 415 break; | 447 break; |
| 416 } | 448 } |
| 417 | 449 |
| 418 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); | 450 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); |
| 419 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); | 451 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); |
| 420 webkit_event.force = event.pointer_details().force; | 452 webkit_event.force = event.pointer_details().force; |
| 421 webkit_event.pointerType = | 453 webkit_event.pointerType = |
| 422 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 454 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
| 423 | 455 |
| 424 return webkit_event; | 456 return webkit_event; |
| 425 } | 457 } |
| 426 | 458 |
| 427 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( | 459 blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent( |
| 428 const ui::MouseWheelEvent& event) { | 460 const MouseWheelEvent& event) { |
| 429 blink::WebMouseWheelEvent webkit_event; | 461 blink::WebMouseWheelEvent webkit_event; |
| 430 | 462 |
| 431 webkit_event.type = blink::WebInputEvent::MouseWheel; | 463 webkit_event.type = blink::WebInputEvent::MouseWheel; |
| 432 webkit_event.button = blink::WebMouseEvent::ButtonNone; | 464 webkit_event.button = blink::WebMouseEvent::ButtonNone; |
| 433 webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags()); | 465 webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); |
| 434 webkit_event.timeStampSeconds = | 466 webkit_event.timeStampSeconds = EventTimeStampToSeconds(event.time_stamp()); |
| 435 ui::EventTimeStampToSeconds(event.time_stamp()); | |
| 436 | 467 |
| 437 if ((event.flags() & ui::EF_SHIFT_DOWN) != 0 && event.x_offset() == 0) { | 468 if ((event.flags() & EF_SHIFT_DOWN) != 0 && event.x_offset() == 0) { |
| 438 webkit_event.deltaX = event.y_offset(); | 469 webkit_event.deltaX = event.y_offset(); |
| 439 webkit_event.deltaY = 0; | 470 webkit_event.deltaY = 0; |
| 440 } else { | 471 } else { |
| 441 webkit_event.deltaX = event.x_offset(); | 472 webkit_event.deltaX = event.x_offset(); |
| 442 webkit_event.deltaY = event.y_offset(); | 473 webkit_event.deltaY = event.y_offset(); |
| 443 } | 474 } |
| 444 | 475 |
| 445 webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; | 476 webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; |
| 446 webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; | 477 webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; |
| 447 | 478 |
| 448 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); | 479 webkit_event.tiltX = roundf(event.pointer_details().tilt_x); |
| 449 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); | 480 webkit_event.tiltY = roundf(event.pointer_details().tilt_y); |
| 450 webkit_event.force = event.pointer_details().force; | 481 webkit_event.force = event.pointer_details().force; |
| 451 webkit_event.pointerType = | 482 webkit_event.pointerType = |
| 452 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); | 483 EventPointerTypeToWebPointerType(event.pointer_details().pointer_type); |
| 453 | 484 |
| 454 return webkit_event; | 485 return webkit_event; |
| 455 } | 486 } |
| 456 | 487 |
| 457 } // namespace content | 488 } // namespace ui |
| OLD | NEW |