Home | History | Annotate | Download | only in input
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/renderer_host/input/web_input_event_builders_android.h"
      6 
      7 #include "base/logging.h"
      8 #include "content/browser/renderer_host/input/motion_event_android.h"
      9 #include "content/browser/renderer_host/input/web_input_event_util.h"
     10 #include "content/browser/renderer_host/input/web_input_event_util_posix.h"
     11 #include "ui/events/keycodes/keyboard_code_conversion_android.h"
     12 #include "ui/events/keycodes/keyboard_codes_posix.h"
     13 
     14 using blink::WebInputEvent;
     15 using blink::WebKeyboardEvent;
     16 using blink::WebGestureEvent;
     17 using blink::WebMouseEvent;
     18 using blink::WebMouseWheelEvent;
     19 using blink::WebTouchEvent;
     20 using blink::WebTouchPoint;
     21 
     22 namespace content {
     23 
     24 WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type,
     25                                                 int modifiers,
     26                                                 double time_sec,
     27                                                 int keycode,
     28                                                 int unicode_character,
     29                                                 bool is_system_key) {
     30   DCHECK(WebInputEvent::isKeyboardEventType(type));
     31   WebKeyboardEvent result;
     32 
     33   result.type = type;
     34   result.modifiers = modifiers;
     35   result.timeStampSeconds = time_sec;
     36   ui::KeyboardCode windows_key_code =
     37       ui::KeyboardCodeFromAndroidKeyCode(keycode);
     38   UpdateWindowsKeyCodeAndKeyIdentifier(&result, windows_key_code);
     39   result.modifiers |= GetLocationModifiersFromWindowsKeyCode(windows_key_code);
     40   result.nativeKeyCode = keycode;
     41   result.unmodifiedText[0] = unicode_character;
     42   if (result.windowsKeyCode == ui::VKEY_RETURN) {
     43     // This is the same behavior as GTK:
     44     // We need to treat the enter key as a key press of character \r. This
     45     // is apparently just how webkit handles it and what it expects.
     46     result.unmodifiedText[0] = '\r';
     47   }
     48   result.text[0] = result.unmodifiedText[0];
     49   result.isSystemKey = is_system_key;
     50 
     51   return result;
     52 }
     53 
     54 WebMouseEvent WebMouseEventBuilder::Build(blink::WebInputEvent::Type type,
     55                                           WebMouseEvent::Button button,
     56                                           double time_sec,
     57                                           int window_x,
     58                                           int window_y,
     59                                           int modifiers,
     60                                           int click_count) {
     61   DCHECK(WebInputEvent::isMouseEventType(type));
     62   WebMouseEvent result;
     63 
     64   result.type = type;
     65   result.x = window_x;
     66   result.y = window_y;
     67   result.windowX = window_x;
     68   result.windowY = window_y;
     69   result.timeStampSeconds = time_sec;
     70   result.clickCount = click_count;
     71   result.modifiers = modifiers;
     72 
     73   if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp)
     74     result.button = button;
     75   else
     76     result.button = WebMouseEvent::ButtonNone;
     77 
     78   return result;
     79 }
     80 
     81 WebMouseWheelEvent WebMouseWheelEventBuilder::Build(Direction direction,
     82                                                     double time_sec,
     83                                                     int window_x,
     84                                                     int window_y) {
     85   WebMouseWheelEvent result;
     86 
     87   result.type = WebInputEvent::MouseWheel;
     88   result.x = window_x;
     89   result.y = window_y;
     90   result.windowX = window_x;
     91   result.windowY = window_y;
     92   result.timeStampSeconds = time_sec;
     93   result.button = WebMouseEvent::ButtonNone;
     94 
     95   // The below choices are matched from GTK.
     96   const float scrollbar_pixels_per_tick = 160.0f / 3.0f;
     97 
     98   switch (direction) {
     99     case DIRECTION_UP:
    100       result.deltaY = scrollbar_pixels_per_tick;
    101       result.wheelTicksY = 1;
    102       break;
    103     case DIRECTION_DOWN:
    104       result.deltaY = -scrollbar_pixels_per_tick;
    105       result.wheelTicksY = -1;
    106       break;
    107     case DIRECTION_LEFT:
    108       result.deltaX = scrollbar_pixels_per_tick;
    109       result.wheelTicksX = 1;
    110       break;
    111     case DIRECTION_RIGHT:
    112       result.deltaX = -scrollbar_pixels_per_tick;
    113       result.wheelTicksX = -1;
    114       break;
    115   }
    116 
    117   return result;
    118 }
    119 
    120 WebGestureEvent WebGestureEventBuilder::Build(WebInputEvent::Type type,
    121                                               double time_sec,
    122                                               int x,
    123                                               int y) {
    124   DCHECK(WebInputEvent::isGestureEventType(type));
    125   WebGestureEvent result;
    126 
    127   result.type = type;
    128   result.x = x;
    129   result.y = y;
    130   result.timeStampSeconds = time_sec;
    131   result.sourceDevice = blink::WebGestureDeviceTouchscreen;
    132 
    133   return result;
    134 }
    135 
    136 }  // namespace content
    137