15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/web_input_event_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/renderer_host/input/web_input_event_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if defined(USE_X11) || defined(USE_OZONE) 1434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "ui/events/keycodes/dom4/keycode_converter.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeUntranslatedWebMouseEventFromNativeEvent( 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::NativeEvent& native_event); 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeUntranslatedWebMouseWheelEventFromNativeEvent( 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::NativeEvent& native_event); 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromNativeEvent( 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::NativeEvent& native_event); 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromNativeEvent( 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::NativeEvent& native_event); 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_X11) || defined(USE_OZONE) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::KeyEvent* event) { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent webkit_event; 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (event->type()) { 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case ui::ET_KEY_PRESSED: 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = event->is_char() ? blink::WebInputEvent::Char : 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::RawKeyDown; 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case ui::ET_KEY_RELEASED: 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::KeyUp; 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) default: 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NOTREACHED(); 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (webkit_event.modifiers & blink::WebInputEvent::AltKey) 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.isSystemKey = true; 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webkit_event.windowsKeyCode = event->GetLocatedWindowsKeyboardCode(); 5334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) webkit_event.nativeKeyCode = 5434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) ui::KeycodeConverter::CodeToNativeKeycode(event->code().c_str()); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webkit_event.unmodifiedText[0] = event->GetUnmodifiedText(); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webkit_event.text[0] = event->GetText(); 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.setKeyIdentifierFromWindowsKeyCode(); 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return webkit_event; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::ScrollEvent* event) { 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::MouseWheel; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonNone; 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.hasPreciseScrollingDeltas = true; 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float offset_ordinal_x = 0.f; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float offset_ordinal_y = 0.f; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) { 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaX = event->y_offset(); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaY = 0; 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) offset_ordinal_x = event->y_offset_ordinal(); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) offset_ordinal_y = event->x_offset_ordinal(); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaX = event->x_offset(); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaY = event->y_offset(); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) offset_ordinal_x = event->x_offset_ordinal(); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) offset_ordinal_y = event->y_offset_ordinal(); 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (offset_ordinal_x != 0.f && webkit_event.deltaX != 0.f) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.accelerationRatioX = offset_ordinal_x / webkit_event.deltaX; 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (offset_ordinal_y != 0.f && webkit_event.deltaY != 0.f) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.accelerationRatioY = offset_ordinal_y / webkit_event.deltaY; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return webkit_event; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFromAuraEvent( 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::ScrollEvent* event) { 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGestureEvent webkit_event; 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) switch (event->type()) { 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case ui::ET_SCROLL_FLING_START: 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::GestureFlingStart; 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.data.flingStart.velocityX = event->x_offset(); 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.data.flingStart.velocityY = event->y_offset(); 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case ui::ET_SCROLL_FLING_CANCEL: 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::GestureFlingCancel; 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case ui::ET_SCROLL: 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NOTREACHED() << "Invalid gesture type: " << event->type(); 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) default: 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NOTREACHED() << "Unknown gesture type: " << event->type(); 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad; 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return webkit_event; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent( 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent* event); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseWheelEvent* event); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// General approach: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event only carries a subset of possible event data provided to Aura by 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the host platform. WebKit utilizes a larger subset of that information than 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura itself. WebKit includes some built in cracking functionality that we 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rely on to obtain this information cleanly and consistently. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The only place where an ui::Event's data differs from what the underlying 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::NativeEvent would provide is position data, since we would like to 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provide coordinates relative to the aura::Window that is hosting the 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer, not the top level platform window. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The approach is to fully construct a blink::WebInputEvent from the 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::Event's base::NativeEvent, and then replace the coordinate fields with 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the translated values from the ui::Event. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The exception is mouse events on linux. The ui::MouseEvent contains enough 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// necessary information to construct a WebMouseEvent. So instead of extracting 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the information from the XEvent, which can be tricky when supporting both 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XInput2 and XInput, the WebMouseEvent is constructed from the 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::MouseEvent. This will not be necessary once only XInput2 is supported. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEvent(ui::MouseEvent* event) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct an untranslated event from the platform event data. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseEvent webkit_event = 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows we have WM_ events comming from desktop and pure aura 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events comming from metro mode. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->native_event().message ? 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeUntranslatedWebMouseEventFromNativeEvent(event->native_event()) : 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWebMouseEventFromAuraEvent(event); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWebMouseEventFromAuraEvent(event); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the event's coordinate fields with translated position data from 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |event|. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowX = webkit_event.x = event->x(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowY = webkit_event.y = event->y(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_WIN) 170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (event->native_event().message) 171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return webkit_event; 172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point root_point = event->root_location(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalX = root_point.x(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalY = root_point.y(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_event; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::MouseWheelEvent* event) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct an untranslated event from the platform event data. 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event = event->native_event().message ? 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event()) : 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWebMouseWheelEventFromAuraEvent(event); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event = 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWebMouseWheelEventFromAuraEvent(event); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the event's coordinate fields with translated position data from 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |event|. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowX = webkit_event.x = event->x(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowY = webkit_event.y = event->y(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point root_point = event->root_location(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalX = root_point.x(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalY = root_point.y(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_event; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEvent(ui::ScrollEvent* event) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct an untranslated event from the platform event data. 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event = 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeUntranslatedWebMouseWheelEventFromNativeEvent(event->native_event()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event = 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeWebMouseWheelEventFromAuraEvent(event); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the event's coordinate fields with translated position data from 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |event|. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowX = webkit_event.x = event->x(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.windowY = webkit_event.y = event->y(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point root_point = event->root_location(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalX = root_point.x(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.globalY = root_point.y(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_event; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebKeyboardEvent MakeWebKeyboardEvent(ui::KeyEvent* event) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows can figure out whether or not to construct a RawKeyDown or a Char 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebInputEvent based on the type of message carried in 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event->native_event(). X11 is not so fortunate, there is no separate 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // translated event type, so DesktopHostLinux sends an extra KeyEvent with 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is_char() == true. We need to pass the ui::KeyEvent to the X11 function 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to detect this case so the right event type can be constructed. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!event->HasNativeEvent()) 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return blink::WebKeyboardEvent(); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Key events require no translation by the aura system. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MakeWebKeyboardEventFromNativeEvent(event->native_event()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MakeWebKeyboardEventFromAuraEvent(event); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::GestureEvent* event) { 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGestureEvent gesture_event; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event->HasNativeEvent()) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event()); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_event = MakeWebGestureEventFromUIEvent(*event); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event = MakeWebGestureEventFromUIEvent(*event); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.x = event->x(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.y = event->y(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point root_point = event->root_location(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.globalX = root_point.x(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.globalY = root_point.y(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gesture_event; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEvent(ui::ScrollEvent* event) { 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGestureEvent gesture_event; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event = MakeWebGestureEventFromNativeEvent(event->native_event()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event = MakeWebGestureEventFromAuraEvent(event); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.x = event->x(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.y = event->y(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point root_point = event->root_location(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.globalX = root_point.x(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gesture_event.globalY = root_point.y(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gesture_event; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebGestureEvent MakeWebGestureEventFlingCancel() { 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGestureEvent gesture_event; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All other fields are ignored on a GestureFlingCancel event. 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gesture_event.type = blink::WebInputEvent::GestureFlingCancel; 28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gesture_event; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(ui::MouseEvent* event) { 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseEvent webkit_event; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonNone; 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int button_flags = event->flags(); 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->type() == ui::ET_MOUSE_PRESSED || 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event->type() == ui::ET_MOUSE_RELEASED) { 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We want to use changed_button_flags() for mouse pressed & released. 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // These flags can be used only if they are set which is not always the case 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // (see e.g. GetChangedMouseButtonFlagsFromNative() in events_win.cc). 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event->changed_button_flags()) 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci button_flags = event->changed_button_flags(); 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (button_flags & ui::EF_LEFT_MOUSE_BUTTON) 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonLeft; 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (button_flags & ui::EF_MIDDLE_MOUSE_BUTTON) 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonMiddle; 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (button_flags & ui::EF_RIGHT_MOUSE_BUTTON) 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonRight; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::MouseDown; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.clickCount = event->GetClickCount(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_RELEASED: 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::MouseUp; 322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webkit_event.clickCount = event->GetClickCount(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_ENTERED: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_EXITED: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_DRAGGED: 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::MouseMove; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED() << "Received unexpected event: " << event->type(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_event; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseWheelEvent* event) { 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMouseWheelEvent webkit_event; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.type = blink::WebInputEvent::MouseWheel; 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webkit_event.button = blink::WebMouseEvent::ButtonNone; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.modifiers = EventFlagsToWebEventModifiers(event->flags()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((event->flags() & ui::EF_SHIFT_DOWN) != 0 && event->x_offset() == 0) { 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaX = event->y_offset(); 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaY = 0; 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaX = event->x_offset(); 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) webkit_event.deltaY = event->y_offset(); 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 355ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return webkit_event; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 362