blink_input_events_type_converters.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/blink_input_events_type_converters.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/web/WebInputEvent.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/event_constants.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo { 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Used for scrolling. This matches Firefox behavior. 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kPixelsPerTick = 53; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint EventFlagsToWebEventModifiers(int flags) { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int modifiers = 0; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_SHIFT_DOWN) 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::ShiftKey; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_CONTROL_DOWN) 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::ControlKey; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_ALT_DOWN) 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::AltKey; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(beng): MetaKey/META_MASK 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_LEFT_MOUSE_BUTTON) 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::LeftButtonDown; 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::MiddleButtonDown; 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_RIGHT_MOUSE_BUTTON) 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::RightButtonDown; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_CAPS_LOCK_DOWN) 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch modifiers |= blink::WebInputEvent::CapsLockOn; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return modifiers; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint EventFlagsToWebInputEventModifiers(int flags) { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (flags & ui::EF_SHIFT_DOWN ? blink::WebInputEvent::ShiftKey : 0) | 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (flags & ui::EF_CONTROL_DOWN ? blink::WebInputEvent::ControlKey : 0) | 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (flags & ui::EF_CAPS_LOCK_DOWN ? blink::WebInputEvent::CapsLockOn : 0) | 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (flags & ui::EF_ALT_DOWN ? blink::WebInputEvent::AltKey : 0); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(erg): This function is extremely hacky and should only be accepted 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// since this is demo code which won't live very long. Actually calculating 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// this accurately would require the native X11 event so we could get accurate 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// key codes via XKeyEventToWindowsKeyCode() and ui::GetCharacterFromXEvent(). 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// That option is closed to us, and thus, hack. 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint32_t MakeHackyText(int32_t key_code, int flags) { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!(flags & ui::EF_SHIFT_DOWN) && key_code >= 'A' && key_code <= 'Z') 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_code = key_code + ('a' - 'A'); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return key_code; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint GetClickCount(int flags) { 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flags & ui::EF_IS_TRIPLE_CLICK) 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 3; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (flags & ui::EF_IS_DOUBLE_CLICK) 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 2; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 1; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<blink::WebInputEvent> 71116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTypeConverter<EventPtr, scoped_ptr<blink::WebInputEvent> >::ConvertTo( 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const EventPtr& event) { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event->action == ui::ET_MOUSE_PRESSED || 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_MOUSE_RELEASED || 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_MOUSE_ENTERED || 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_MOUSE_EXITED || 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_MOUSE_MOVED || 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_MOUSE_DRAGGED) { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<blink::WebMouseEvent> web_event(new blink::WebMouseEvent); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->x = event->location->x; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->y = event->location->y; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->modifiers = EventFlagsToWebEventModifiers(event->flags); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->timeStampSeconds = 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF(); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->button = blink::WebMouseEvent::ButtonNone; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event->flags & ui::EF_LEFT_MOUSE_BUTTON) 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->button = blink::WebMouseEvent::ButtonLeft; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event->flags & ui::EF_MIDDLE_MOUSE_BUTTON) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->button = blink::WebMouseEvent::ButtonMiddle; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (event->flags & ui::EF_RIGHT_MOUSE_BUTTON) 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->button = blink::WebMouseEvent::ButtonRight; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (event->action) { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_PRESSED: 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = blink::WebInputEvent::MouseDown; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->clickCount = GetClickCount(event->flags); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_RELEASED: 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = blink::WebInputEvent::MouseUp; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->clickCount = GetClickCount(event->flags); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_ENTERED: 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_EXITED: 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_MOVED: 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_MOUSE_DRAGGED: 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = blink::WebInputEvent::MouseMove; 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTIMPLEMENTED() << "Received unexpected event: " << event->action; 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_event.PassAs<blink::WebInputEvent>(); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if ((event->action == ui::ET_KEY_PRESSED || 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->action == ui::ET_KEY_RELEASED) && 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->key_data) { 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<blink::WebKeyboardEvent> web_event(new blink::WebKeyboardEvent); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(erg): This derivation of is_char is a bad hack, along with our key 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // code and text calculations. Normally, key code calculations need the 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // gfx::NativeEvent, which we don't have access to here. Likewise, the 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // calculation of the |text| is overly simplified for similar 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // reasons. (Contrast with web_input_event_aurax11.cc in content/.) 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_char = 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->key_data->is_char || 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (event->key_data->key_code >= 32 && event->key_data->key_code < 127); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (event->action) { 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_KEY_PRESSED: 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = is_char ? blink::WebInputEvent::Char : 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebInputEvent::RawKeyDown; 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_KEY_RELEASED: 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = blink::WebInputEvent::KeyUp; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->modifiers = EventFlagsToWebInputEventModifiers(event->flags); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->timeStampSeconds = 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF(); 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_event->modifiers & blink::WebInputEvent::AltKey) 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->isSystemKey = true; 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->windowsKeyCode = event->key_data->key_code; 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->nativeKeyCode = event->key_data->key_code; 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->text[0] = MakeHackyText(event->key_data->key_code, event->flags); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->unmodifiedText[0] = event->key_data->key_code; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->setKeyIdentifierFromWindowsKeyCode(); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_event.PassAs<blink::WebInputEvent>(); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (event->action == ui::ET_MOUSEWHEEL) { 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<blink::WebMouseWheelEvent> web_event( 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new blink::WebMouseWheelEvent); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->type = blink::WebInputEvent::MouseWheel; 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->button = blink::WebMouseEvent::ButtonNone; 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->modifiers = EventFlagsToWebEventModifiers(event->flags); 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->timeStampSeconds = 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta::FromInternalValue(event->time_stamp).InSecondsF(); 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->x = event->location->x; 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->y = event->location->y; 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if ((event->flags & ui::EF_SHIFT_DOWN) != 0 && 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event->wheel_data->x_offset == 0) { 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->deltaX = event->wheel_data->y_offset; 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->deltaY = 0; 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->deltaX = event->wheel_data->x_offset; 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->deltaY = event->wheel_data->y_offset; 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->wheelTicksX = web_event->deltaX / kPixelsPerTick; 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_event->wheelTicksY = web_event->deltaY / kPixelsPerTick; 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_event.PassAs<blink::WebInputEvent>(); 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return scoped_ptr<blink::WebInputEvent>(); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace mojo 188