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_util.h"
6
7#include "base/strings/string_util.h"
8#include "third_party/WebKit/public/web/WebInputEvent.h"
9
10namespace {
11
12const char* GetKeyIdentifier(ui::KeyboardCode key_code) {
13  switch (key_code) {
14    case ui::VKEY_MENU:
15      return "Alt";
16    case ui::VKEY_CONTROL:
17      return "Control";
18    case ui::VKEY_SHIFT:
19      return "Shift";
20    case ui::VKEY_CAPITAL:
21      return "CapsLock";
22    case ui::VKEY_LWIN:
23    case ui::VKEY_RWIN:
24      return "Win";
25    case ui::VKEY_CLEAR:
26      return "Clear";
27    case ui::VKEY_DOWN:
28      return "Down";
29    case ui::VKEY_END:
30      return "End";
31    case ui::VKEY_RETURN:
32      return "Enter";
33    case ui::VKEY_EXECUTE:
34      return "Execute";
35    case ui::VKEY_F1:
36      return "F1";
37    case ui::VKEY_F2:
38      return "F2";
39    case ui::VKEY_F3:
40      return "F3";
41    case ui::VKEY_F4:
42      return "F4";
43    case ui::VKEY_F5:
44      return "F5";
45    case ui::VKEY_F6:
46      return "F6";
47    case ui::VKEY_F7:
48      return "F7";
49    case ui::VKEY_F8:
50      return "F8";
51    case ui::VKEY_F9:
52      return "F9";
53    case ui::VKEY_F10:
54      return "F10";
55    case ui::VKEY_F11:
56      return "F11";
57    case ui::VKEY_F12:
58      return "F12";
59    case ui::VKEY_F13:
60      return "F13";
61    case ui::VKEY_F14:
62      return "F14";
63    case ui::VKEY_F15:
64      return "F15";
65    case ui::VKEY_F16:
66      return "F16";
67    case ui::VKEY_F17:
68      return "F17";
69    case ui::VKEY_F18:
70      return "F18";
71    case ui::VKEY_F19:
72      return "F19";
73    case ui::VKEY_F20:
74      return "F20";
75    case ui::VKEY_F21:
76      return "F21";
77    case ui::VKEY_F22:
78      return "F22";
79    case ui::VKEY_F23:
80      return "F23";
81    case ui::VKEY_F24:
82      return "F24";
83    case ui::VKEY_HELP:
84      return "Help";
85    case ui::VKEY_HOME:
86      return "Home";
87    case ui::VKEY_INSERT:
88      return "Insert";
89    case ui::VKEY_LEFT:
90      return "Left";
91    case ui::VKEY_NEXT:
92      return "PageDown";
93    case ui::VKEY_PRIOR:
94      return "PageUp";
95    case ui::VKEY_PAUSE:
96      return "Pause";
97    case ui::VKEY_SNAPSHOT:
98      return "PrintScreen";
99    case ui::VKEY_RIGHT:
100      return "Right";
101    case ui::VKEY_SCROLL:
102      return "Scroll";
103    case ui::VKEY_SELECT:
104      return "Select";
105    case ui::VKEY_UP:
106      return "Up";
107    case ui::VKEY_DELETE:
108      return "U+007F"; // Standard says that DEL becomes U+007F.
109    case ui::VKEY_MEDIA_NEXT_TRACK:
110      return "MediaNextTrack";
111    case ui::VKEY_MEDIA_PREV_TRACK:
112      return "MediaPreviousTrack";
113    case ui::VKEY_MEDIA_STOP:
114      return "MediaStop";
115    case ui::VKEY_MEDIA_PLAY_PAUSE:
116      return "MediaPlayPause";
117    case ui::VKEY_VOLUME_MUTE:
118      return "VolumeMute";
119    case ui::VKEY_VOLUME_DOWN:
120      return "VolumeDown";
121    case ui::VKEY_VOLUME_UP:
122      return "VolumeUp";
123    default:
124      return NULL;
125  };
126}
127
128}  // namespace
129
130namespace content {
131
132void UpdateWindowsKeyCodeAndKeyIdentifier(WebKit::WebKeyboardEvent* event,
133                                          ui::KeyboardCode windows_key_code) {
134  event->windowsKeyCode = windows_key_code;
135
136  const char* id = GetKeyIdentifier(windows_key_code);
137  if (id) {
138    base::strlcpy(event->keyIdentifier, id, sizeof(event->keyIdentifier) - 1);
139  } else {
140    base::snprintf(event->keyIdentifier, sizeof(event->keyIdentifier), "U+%04X",
141                   base::ToUpperASCII(static_cast<int>(windows_key_code)));
142  }
143}
144
145}  // namespace content
146