Fix key identifier conversion.
Key identifiers are more expressive than simple key codes. This patch
expands the target of the mapping to include modifier keys.
This also moves the key identifier conversion into the only directory from
which it is used.
BUG=none
TEST=unit test updated
Review URL: http://codereview.chromium.org/6264020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74227 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/app/app_base.gypi b/app/app_base.gypi
index 53d67c2..8c248d8b 100644
--- a/app/app_base.gypi
+++ b/app/app_base.gypi
@@ -130,14 +130,12 @@
'../ui/base/dragdrop/os_exchange_data_provider_win.cc',
'../ui/base/dragdrop/os_exchange_data_provider_win.h',
'../ui/base/dragdrop/os_exchange_data.cc',
- '../ui/base/dragdrop/os_exchange_data.h',
+ '../ui/base/dragdrop/os_exchange_data.h',
'../ui/base/gtk/event_synthesis_gtk.cc',
'../ui/base/gtk/event_synthesis_gtk.h',
'../ui/base/gtk/gtk_signal.h',
'../ui/base/gtk/gtk_signal_registrar.cc',
'../ui/base/gtk/gtk_signal_registrar.h',
- '../ui/base/keycodes/keyboard_code_conversion.cc',
- '../ui/base/keycodes/keyboard_code_conversion.h',
'../ui/base/keycodes/keyboard_code_conversion_gtk.cc',
'../ui/base/keycodes/keyboard_code_conversion_gtk.h',
'../ui/base/keycodes/keyboard_code_conversion_mac.mm',
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index 08625d8..9d36e168 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -28,7 +28,7 @@
#include "chrome/test/in_process_browser_test.h"
#include "chrome/test/ui_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/keycodes/keyboard_code_conversion.h"
+#include "ui/base/keycodes/keyboard_codes.h"
static const char* kDataURIPrefix = "data:text/html;charset=utf-8,";
static const char* kTestFormString =
diff --git a/chrome/browser/extensions/extension_input_api.cc b/chrome/browser/extensions/extension_input_api.cc
index eca09668..349e20e 100644
--- a/chrome/browser/extensions/extension_input_api.cc
+++ b/chrome/browser/extensions/extension_input_api.cc
@@ -10,12 +10,12 @@
#include "base/values.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/key_identifier_conversion_views.h"
#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/common/native_web_keyboard_event.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
-#include "ui/base/keycodes/keyboard_code_conversion.h"
#include "views/event.h"
#include "views/widget/root_view.h"
@@ -35,6 +35,7 @@
const char kUnknownEventTypeError[] = "Unknown event type.";
const char kUnknownOrUnsupportedKeyIdentiferError[] = "Unknown or unsupported "
"key identifier.";
+const char kUnsupportedModifier[] = "Unsupported modifier.";
const char kNoValidRecipientError[] = "No valid recipient for event.";
const char kKeyEventUnprocessedError[] = "Event was not handled.";
@@ -86,25 +87,31 @@
EXTENSION_FUNCTION_VALIDATE(args->GetString(kKeyIdentifier, &identifier));
TrimWhitespaceASCII(identifier, TRIM_ALL, &identifier);
- ui::KeyboardCode code = ui::KeyCodeFromKeyIdentifier(identifier);
- if (code == ui::VKEY_UNKNOWN) {
+ const views::KeyEvent& prototype_event =
+ KeyEventFromKeyIdentifier(identifier);
+ if (prototype_event.GetKeyCode() == ui::VKEY_UNKNOWN) {
error_ = kUnknownOrUnsupportedKeyIdentiferError;
return false;
}
- int flags = 0;
+ int flags = prototype_event.GetFlags();
bool alt = false;
if (args->GetBoolean(kAlt, &alt))
- flags |= alt ? WebKit::WebInputEvent::AltKey : 0;
+ flags |= alt ? views::Event::EF_ALT_DOWN : 0;
bool ctrl = false;
if (args->GetBoolean(kCtrl, &ctrl))
- flags |= ctrl ? WebKit::WebInputEvent::ControlKey : 0;
- bool meta = false;
- if (args->GetBoolean(kMeta, &meta))
- flags |= meta ? WebKit::WebInputEvent::MetaKey : 0;
+ flags |= ctrl ? views::Event::EF_CONTROL_DOWN : 0;
bool shift = false;
if (args->GetBoolean(kShift, &shift))
- flags |= shift ? WebKit::WebInputEvent::ShiftKey : 0;
+ flags |= shift ? views::Event::EF_SHIFT_DOWN : 0;
+ bool meta = false;
+ if (args->GetBoolean(kMeta, &meta)) {
+ // Views does not have a Meta event flag, so return an error for now.
+ if (meta) {
+ error_ = kUnsupportedModifier;
+ return false;
+ }
+ }
views::RootView* root_view = GetRootView();
if (!root_view) {
@@ -112,7 +119,7 @@
return false;
}
- views::KeyEvent event(type, code, flags, 0, 0);
+ views::KeyEvent event(type, prototype_event.GetKeyCode(), flags, 0, 0);
if (!root_view->ProcessKeyEvent(event)) {
error_ = kKeyEventUnprocessedError;
return false;
diff --git a/chrome/browser/extensions/key_identifier_conversion_views.cc b/chrome/browser/extensions/key_identifier_conversion_views.cc
new file mode 100644
index 0000000..a4ded20
--- /dev/null
+++ b/chrome/browser/extensions/key_identifier_conversion_views.cc
@@ -0,0 +1,336 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/key_identifier_conversion_views.h"
+
+#include <string.h>
+
+#include "base/basictypes.h"
+#include "base/hash_tables.h"
+#include "chrome/browser/browser_thread.h"
+#include "ui/base/keycodes/keyboard_codes.h"
+#include "views/event.h"
+
+namespace {
+
+static const int kNumIdentifierTypes = 3;
+
+typedef struct KeyIdentifier {
+ // In order: key identifier, character and unicode codepoint. They are
+ // searched in that order as well.
+ // These are all placed into a single array as they are treated uniformly and
+ // we never refer to a specific type of identifier. This reduces code
+ // duplication below.
+ const char* identifiers[kNumIdentifierTypes];
+ const ui::KeyboardCode key_code;
+ const int event_flags;
+} KeyIdentifier;
+
+// Taken from Section 6.3.3 here:
+// http://www.w3.org/TR/DOM-Level-3-Events/#keyset-keyidentifiers
+// TODO(bryeung): keycodes could be wrong: I took the keydown code only
+static const KeyIdentifier kKeyIdentifiers[] = {
+ { {"Accept", "", ""}, ui::VKEY_ACCEPT, 0 },
+ { {"Add", "", ""}, ui::VKEY_ADD, 0 },
+ { {"Again", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"AllCandidates", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Alphanumeric", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Alt", "", ""}, ui::VKEY_MENU, 0 },
+ { {"AltGraph", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Apps", "", ""}, ui::VKEY_APPS, 0 },
+ { {"Attn", "", ""}, ui::VKEY_ATTN, 0 },
+ { {"BrowserBack", "", ""}, ui::VKEY_BROWSER_BACK, 0 },
+ { {"BrowserFavorites", "", ""}, ui::VKEY_BROWSER_FAVORITES, 0 },
+ { {"BrowserForward", "", ""}, ui::VKEY_BROWSER_FAVORITES, 0 },
+ { {"BrowserHome", "", ""}, ui::VKEY_BROWSER_HOME, 0 },
+ { {"BrowserRefresh", "", ""}, ui::VKEY_BROWSER_REFRESH, 0 },
+ { {"BrowserSearch", "", ""}, ui::VKEY_BROWSER_SEARCH, 0 },
+ { {"BrowserStop", "", ""}, ui::VKEY_BROWSER_STOP, 0 },
+ { {"CapsLock", "", ""}, ui::VKEY_CAPITAL, 0 },
+ { {"Clear", "", ""}, ui::VKEY_OEM_CLEAR, 0 },
+ { {"CodeInput", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Compose", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Control", "", ""}, ui::VKEY_CONTROL, 0 },
+ { {"Crsel", "", ""}, ui::VKEY_CRSEL, 0 },
+ { {"Convert", "", ""}, ui::VKEY_CONVERT, 0 },
+ { {"Copy", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Cut", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Decimal", "", ""}, ui::VKEY_DECIMAL, 0 },
+ { {"Divide", "", ""}, ui::VKEY_DIVIDE, 0 },
+ { {"Down", "", ""}, ui::VKEY_DOWN, 0 },
+ { {"DownLeft", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"DownRight", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"End", "", ""}, ui::VKEY_END, 0 },
+ { {"Enter", "", ""}, ui::VKEY_RETURN, 0 },
+ { {"EraseEof", "", ""}, ui::VKEY_EREOF, 0 },
+ { {"Execute", "", ""}, ui::VKEY_EXECUTE, 0 },
+ { {"Exsel", "", ""}, ui::VKEY_EXSEL, 0 },
+ { {"Fn", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"F1", "", ""}, ui::VKEY_F1, 0 },
+ { {"F2", "", ""}, ui::VKEY_F2, 0 },
+ { {"F3", "", ""}, ui::VKEY_F3, 0 },
+ { {"F4", "", ""}, ui::VKEY_F4, 0 },
+ { {"F5", "", ""}, ui::VKEY_F5, 0 },
+ { {"F6", "", ""}, ui::VKEY_F6, 0 },
+ { {"F7", "", ""}, ui::VKEY_F7, 0 },
+ { {"F8", "", ""}, ui::VKEY_F8, 0 },
+ { {"F9", "", ""}, ui::VKEY_F9, 0 },
+ { {"F10", "", ""}, ui::VKEY_F10, 0 },
+ { {"F11", "", ""}, ui::VKEY_F11, 0 },
+ { {"F12", "", ""}, ui::VKEY_F12, 0 },
+ { {"F13", "", ""}, ui::VKEY_F13, 0 },
+ { {"F14", "", ""}, ui::VKEY_F14, 0 },
+ { {"F15", "", ""}, ui::VKEY_F15, 0 },
+ { {"F16", "", ""}, ui::VKEY_F16, 0 },
+ { {"F17", "", ""}, ui::VKEY_F17, 0 },
+ { {"F18", "", ""}, ui::VKEY_F18, 0 },
+ { {"F19", "", ""}, ui::VKEY_F19, 0 },
+ { {"F20", "", ""}, ui::VKEY_F20, 0 },
+ { {"F21", "", ""}, ui::VKEY_F21, 0 },
+ { {"F22", "", ""}, ui::VKEY_F22, 0 },
+ { {"F23", "", ""}, ui::VKEY_F23, 0 },
+ { {"F24", "", ""}, ui::VKEY_F24, 0 },
+ { {"FinalMode", "", ""}, ui::VKEY_FINAL, 0 },
+ { {"Find", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"FullWidth", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"HalfWidth", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"HangulMode", "", ""}, ui::VKEY_HANGUL, 0 },
+ { {"HanjaMode", "", ""}, ui::VKEY_HANJA, 0 },
+ { {"Help", "", ""}, ui::VKEY_HELP, 0 },
+ { {"Hiragana", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Home", "", ""}, ui::VKEY_HOME, 0 },
+ { {"Insert", "", ""}, ui::VKEY_INSERT, 0 },
+ { {"JapaneseHiragana", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"JapaneseKatakana", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"JapaneseRomaji", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"JunjaMode", "", ""}, ui::VKEY_JUNJA, 0 },
+ { {"KanaMode", "", ""}, ui::VKEY_KANA, 0 },
+ { {"KanjiMode", "", ""}, ui::VKEY_KANJI, 0 },
+ { {"Katakana", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"LaunchApplication1", "", ""}, ui::VKEY_MEDIA_LAUNCH_APP1, 0 },
+ { {"LaunchApplication2", "", ""}, ui::VKEY_MEDIA_LAUNCH_APP2, 0 },
+ { {"LaunchMail", "", ""}, ui::VKEY_MEDIA_LAUNCH_MAIL, 0 },
+ { {"Left", "", ""}, ui::VKEY_LEFT, 0 },
+ { {"Menu", "", ""}, ui::VKEY_MENU, 0 },
+ { {"Meta", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"MediaNextTrack", "", ""}, ui::VKEY_MEDIA_NEXT_TRACK, 0 },
+ { {"MediaPlayPause", "", ""}, ui::VKEY_MEDIA_PLAY_PAUSE, 0 },
+ { {"MediaPreviousTrack", "", ""}, ui::VKEY_MEDIA_PREV_TRACK, 0 },
+ { {"MediaStop", "", ""}, ui::VKEY_MEDIA_STOP, 0 },
+ { {"ModeChange", "", ""}, ui::VKEY_MODECHANGE, 0 },
+ { {"Multiply", "", ""}, ui::VKEY_MULTIPLY, 0 },
+ { {"NextCandidate", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Nonconvert", "", ""}, ui::VKEY_NONCONVERT, 0 },
+ { {"NumLock", "", ""}, ui::VKEY_NUMLOCK, 0 },
+ { {"PageDown", "", ""}, ui::VKEY_NEXT, 0 },
+ { {"PageUp", "", ""}, ui::VKEY_PRIOR, 0 },
+ { {"Paste", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Pause", "", ""}, ui::VKEY_PAUSE, 0 },
+ { {"Play", "", ""}, ui::VKEY_PLAY, 0 },
+ { {"PreviousCandidate", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"PrintScreen", "", ""}, ui::VKEY_SNAPSHOT, 0 },
+ { {"Process", "", ""}, ui::VKEY_PROCESSKEY, 0 },
+ { {"Props", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Right", "", ""}, ui::VKEY_RIGHT, 0 },
+ { {"RomanCharacters", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Scroll", "", ""}, ui::VKEY_SCROLL, 0 },
+ { {"Select", "", ""}, ui::VKEY_SELECT, 0 },
+ { {"SelectMedia", "", ""}, ui::VKEY_MEDIA_LAUNCH_MEDIA_SELECT, 0 },
+ { {"Separator", "", ""}, ui::VKEY_SEPARATOR, 0 },
+ { {"Shift", "", ""}, ui::VKEY_SHIFT, 0 },
+ { {"Soft1", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Soft2", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Soft3", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Soft4", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Stop", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Subtract", "", ""}, ui::VKEY_SUBTRACT, 0 },
+ { {"Up", "", ""}, ui::VKEY_UP, 0 },
+ { {"UpLeft", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"UpRight", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"Undo", "", ""}, ui::VKEY_UNKNOWN, 0 },
+ { {"VolumeDown", "", ""}, ui::VKEY_VOLUME_DOWN, 0 },
+ { {"VolumeMute", "", ""}, ui::VKEY_VOLUME_MUTE, 0 },
+ { {"VolumeUp", "", ""}, ui::VKEY_VOLUME_UP, 0 },
+ { {"Win", "", ""}, ui::VKEY_LWIN, 0 },
+ { {"Zoom", "", ""}, ui::VKEY_ZOOM, 0 },
+ { {"Backspace", "", "U+0008"}, ui::VKEY_BACK, 0 },
+ { {"Tab", "", "U+0009"}, ui::VKEY_TAB, 0 },
+ { {"Cancel", "", "U+0018"}, ui::VKEY_UNKNOWN, 0 },
+ { {"Esc", "", "U+001B"}, ui::VKEY_ESCAPE, 0 },
+ { {"Spacebar", " ", "U+0020"}, ui::VKEY_SPACE, 0 },
+ { {"Exclamation", "!", "U+0021"}, ui::VKEY_1, views::Event::EF_SHIFT_DOWN },
+ { {"DoubleQuote", "\"", "U+0022"},
+ ui::VKEY_OEM_7, views::Event::EF_SHIFT_DOWN },
+ { {"Hash", "#", "U+0023"}, ui::VKEY_3, views::Event::EF_SHIFT_DOWN },
+ { {"Dollar", "$", "U+0024"}, ui::VKEY_4, views::Event::EF_SHIFT_DOWN },
+ { {"Ampersand", "&", "U+0026"}, ui::VKEY_7, views::Event::EF_SHIFT_DOWN },
+ { {"Apostrophe", "\'", "U+0027"}, ui::VKEY_OEM_7, 0 },
+ { {"LeftParen", "(", "U+0028"}, ui::VKEY_9, views::Event::EF_SHIFT_DOWN },
+ { {"RightParen", ")", "U+0029"}, ui::VKEY_0, views::Event::EF_SHIFT_DOWN },
+ { {"Asterisk", "*", "U+002A"}, ui::VKEY_8, views::Event::EF_SHIFT_DOWN },
+ { {"Plus", "+", "U+002B"}, ui::VKEY_OEM_PLUS, views::Event::EF_SHIFT_DOWN },
+ { {"Percent", "%", "U+0025"}, ui::VKEY_5, views::Event::EF_SHIFT_DOWN },
+ { {"Comma", ",", "U+002C"}, ui::VKEY_OEM_COMMA, 0 },
+ { {"HyphenMinus", "-", "U+002D"}, ui::VKEY_OEM_MINUS, 0 },
+ { {"Period", ".", "U+002E"}, ui::VKEY_OEM_PERIOD, 0 },
+ { {"Solidus", "/", "U+002F"}, ui::VKEY_OEM_2, 0 },
+ { {"", "0", "U+0030"}, ui::VKEY_0, 0 },
+ { {"", "1", "U+0031"}, ui::VKEY_1, 0 },
+ { {"", "2", "U+0032"}, ui::VKEY_2, 0 },
+ { {"", "3", "U+0033"}, ui::VKEY_3, 0 },
+ { {"", "4", "U+0034"}, ui::VKEY_4, 0 },
+ { {"", "5", "U+0035"}, ui::VKEY_5, 0 },
+ { {"", "6", "U+0036"}, ui::VKEY_6, 0 },
+ { {"", "7", "U+0037"}, ui::VKEY_7, 0 },
+ { {"", "8", "U+0038"}, ui::VKEY_8, 0 },
+ { {"", "9", "U+0039"}, ui::VKEY_9, 0 },
+ { {"Colon", ":", "U+003A"}, ui::VKEY_OEM_1, views::Event::EF_SHIFT_DOWN },
+ { {"Semicolon", ";", "U+003B"}, ui::VKEY_OEM_1, 0 },
+ { {"LessThan", "<", "U+003C"},
+ ui::VKEY_OEM_COMMA, views::Event::EF_SHIFT_DOWN },
+ { {"Equals", "=", "U+003D"}, ui::VKEY_OEM_PLUS, 0 },
+ { {"GreaterThan", ">", "U+003E"},
+ ui::VKEY_OEM_PERIOD, views::Event::EF_SHIFT_DOWN },
+ { {"QuestionMark", "?", "U+003F"},
+ ui::VKEY_OEM_2, views::Event::EF_SHIFT_DOWN },
+ { {"At", "@", "U+0040"}, ui::VKEY_2, views::Event::EF_SHIFT_DOWN },
+ { {"", "A", "U+0041"}, ui::VKEY_A, 0 },
+ { {"", "B", "U+0042"}, ui::VKEY_B, 0 },
+ { {"", "C", "U+0043"}, ui::VKEY_C, 0 },
+ { {"", "D", "U+0044"}, ui::VKEY_D, 0 },
+ { {"", "E", "U+0045"}, ui::VKEY_E, 0 },
+ { {"", "F", "U+0046"}, ui::VKEY_F, 0 },
+ { {"", "G", "U+0047"}, ui::VKEY_G, 0 },
+ { {"", "H", "U+0048"}, ui::VKEY_H, 0 },
+ { {"", "I", "U+0049"}, ui::VKEY_I, 0 },
+ { {"", "J", "U+004A"}, ui::VKEY_J, 0 },
+ { {"", "K", "U+004B"}, ui::VKEY_K, 0 },
+ { {"", "L", "U+004C"}, ui::VKEY_L, 0 },
+ { {"", "M", "U+004D"}, ui::VKEY_M, 0 },
+ { {"", "N", "U+004E"}, ui::VKEY_N, 0 },
+ { {"", "O", "U+004F"}, ui::VKEY_O, 0 },
+ { {"", "P", "U+0050"}, ui::VKEY_P, 0 },
+ { {"", "Q", "U+0051"}, ui::VKEY_Q, 0 },
+ { {"", "R", "U+0052"}, ui::VKEY_R, 0 },
+ { {"", "S", "U+0053"}, ui::VKEY_S, 0 },
+ { {"", "T", "U+0054"}, ui::VKEY_T, 0 },
+ { {"", "U", "U+0055"}, ui::VKEY_U, 0 },
+ { {"", "V", "U+0056"}, ui::VKEY_V, 0 },
+ { {"", "W", "U+0057"}, ui::VKEY_W, 0 },
+ { {"", "X", "U+0058"}, ui::VKEY_X, 0 },
+ { {"", "Y", "U+0059"}, ui::VKEY_Y, 0 },
+ { {"", "Z", "U+005A"}, ui::VKEY_Z, 0 },
+ { {"", "a", "U+0061"}, ui::VKEY_A, 0 },
+ { {"", "b", "U+0062"}, ui::VKEY_B, 0 },
+ { {"", "c", "U+0063"}, ui::VKEY_C, 0 },
+ { {"", "d", "U+0064"}, ui::VKEY_D, 0 },
+ { {"", "e", "U+0065"}, ui::VKEY_E, 0 },
+ { {"", "f", "U+0066"}, ui::VKEY_F, 0 },
+ { {"", "g", "U+0067"}, ui::VKEY_G, 0 },
+ { {"", "h", "U+0068"}, ui::VKEY_H, 0 },
+ { {"", "i", "U+0069"}, ui::VKEY_I, 0 },
+ { {"", "j", "U+006A"}, ui::VKEY_J, 0 },
+ { {"", "k", "U+006B"}, ui::VKEY_K, 0 },
+ { {"", "l", "U+006C"}, ui::VKEY_L, 0 },
+ { {"", "m", "U+006D"}, ui::VKEY_M, 0 },
+ { {"", "n", "U+006E"}, ui::VKEY_N, 0 },
+ { {"", "o", "U+006F"}, ui::VKEY_O, 0 },
+ { {"", "p", "U+0070"}, ui::VKEY_P, 0 },
+ { {"", "q", "U+0071"}, ui::VKEY_Q, 0 },
+ { {"", "r", "U+0072"}, ui::VKEY_R, 0 },
+ { {"", "s", "U+0073"}, ui::VKEY_S, 0 },
+ { {"", "t", "U+0074"}, ui::VKEY_T, 0 },
+ { {"", "u", "U+0075"}, ui::VKEY_U, 0 },
+ { {"", "v", "U+0076"}, ui::VKEY_V, 0 },
+ { {"", "w", "U+0077"}, ui::VKEY_W, 0 },
+ { {"", "x", "U+0078"}, ui::VKEY_X, 0 },
+ { {"", "y", "U+0079"}, ui::VKEY_Y, 0 },
+ { {"", "z", "U+007A"}, ui::VKEY_Z, 0 },
+ { {"LeftSquareBracket", "[", "U+005B"}, ui::VKEY_OEM_4, 0 },
+ { {"Backslash", "\\", "U+005C"}, ui::VKEY_OEM_5, 0 },
+ { {"RightSquareBracket", "]", "U+005D"}, ui::VKEY_OEM_6, 0 },
+ { {"Circumflex", "^", "U+005E"}, ui::VKEY_6, views::Event::EF_SHIFT_DOWN },
+ { {"Underscore", "_", "U+005F"},
+ ui::VKEY_OEM_MINUS, views::Event::EF_SHIFT_DOWN },
+ { {"Grave", "`", "U+0060"}, ui::VKEY_OEM_3, 0 },
+ { {"Tilde", "~", "U+007E"}, ui::VKEY_OEM_3, views::Event::EF_SHIFT_DOWN },
+ { {"LeftCurlyBracket", "{", "U+007B"},
+ ui::VKEY_OEM_4, views::Event::EF_SHIFT_DOWN },
+ { {"Pipe", "|", "U+007C"}, ui::VKEY_OEM_5, views::Event::EF_SHIFT_DOWN },
+ { {"RightCurlyBracket", "}", "U+007D"},
+ ui::VKEY_OEM_6, views::Event::EF_SHIFT_DOWN },
+ { {"Del", "", "U+007F"}, ui::VKEY_DELETE, 0 },
+ { {"InvertedExclamation", "", "U+00A1"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadGrave", "", "U+0300"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadEacute", "", "U+0301"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadCircumflex", "", "U+0302"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadTilde", "", "U+0303"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadMacron", "", "U+0304"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadBreve", "", "U+0306"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadAboveDot", "", "U+0307"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadUmlaut", "", "U+0308"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadAboveRing", "", "U+030A"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadDoubleacute", "", "U+030B"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadCaron", "", "U+030C"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadCedilla", "", "U+0327"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadOgonek", "", "U+0328"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadIota", "", "U+0345"}, ui::VKEY_UNKNOWN, 0 },
+ { {"Euro", "", "U+20AC"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadVoicedSound", "", "U+3099"}, ui::VKEY_UNKNOWN, 0 },
+ { {"DeadSemivoicedSound", "", "U+309A"}, ui::VKEY_UNKNOWN, 0 }
+};
+
+static const int kNumKeyIdentifiers = arraysize(kKeyIdentifiers);
+
+typedef base::hash_map<std::string, const views::KeyEvent*> IdentifierMap;
+typedef std::pair<std::string, const views::KeyEvent*> IdentifierPair;
+static IdentifierMap* identifierMaps[kNumIdentifierTypes] = { NULL };
+
+static views::KeyEvent* kUnknownKeyEvent = NULL;
+
+static void InitializeMaps() {
+ if (identifierMaps[0])
+ return;
+
+ kUnknownKeyEvent = new views::KeyEvent(
+ views::Event::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 0, 0, 0);
+
+ for (int i = 0; i < kNumIdentifierTypes; ++i)
+ identifierMaps[i] = new IdentifierMap;
+
+ for (int i = 0; i < kNumKeyIdentifiers; ++i) {
+ const KeyIdentifier& key = kKeyIdentifiers[i];
+
+ views::KeyEvent* event = new views::KeyEvent(
+ views::Event::ET_KEY_PRESSED, key.key_code, key.event_flags, 0, 0);
+
+ for (int j = 0; j < kNumIdentifierTypes; ++j) {
+ if (key.identifiers[j][0] != '\0') {
+ std::pair<IdentifierMap::iterator, bool> result =
+ identifierMaps[j]->insert(
+ IdentifierPair(key.identifiers[j], event));
+ DCHECK(result.second);
+ }
+ }
+ }
+}
+
+} // namespace
+
+
+const views::KeyEvent& KeyEventFromKeyIdentifier(
+ const std::string& key_identifier) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ InitializeMaps();
+
+ for (int i = 0; i < kNumIdentifierTypes; ++i) {
+ const IdentifierMap& map = *identifierMaps[i];
+
+ IdentifierMap::const_iterator iter = map.find(key_identifier);
+ if (iter != map.end())
+ return *iter->second;
+ }
+
+ return *kUnknownKeyEvent;
+}
diff --git a/chrome/browser/extensions/key_identifier_conversion_views.h b/chrome/browser/extensions/key_identifier_conversion_views.h
new file mode 100644
index 0000000..29a1f16
--- /dev/null
+++ b/chrome/browser/extensions/key_identifier_conversion_views.h
@@ -0,0 +1,20 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_KEY_IDENTIFIER_CONVERSION_VIEWS_H_
+#define CHROME_BROWSER_EXTENSIONS_KEY_IDENTIFIER_CONVERSION_VIEWS_H_
+#pragma once
+
+#include "ui/base/keycodes/keyboard_codes.h"
+#include "views/event.h"
+
+#include <string>
+
+// Convert a KeyIdentifer (see Section 6.3.3 here:
+// http://www.w3.org/TR/DOM-Level-3-Events/#keyset-keyidentifiers)
+// to a views::KeyEvent.
+const views::KeyEvent& KeyEventFromKeyIdentifier(
+ const std::string& key_identifier);
+
+#endif // CHROME_BROWSER_EXTENSIONS_KEY_IDENTIFIER_CONVERSION_VIEWS_H_
diff --git a/chrome/browser/extensions/key_identifier_conversion_views_unittest.cc b/chrome/browser/extensions/key_identifier_conversion_views_unittest.cc
new file mode 100644
index 0000000..79ce56e
--- /dev/null
+++ b/chrome/browser/extensions/key_identifier_conversion_views_unittest.cc
@@ -0,0 +1,73 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/key_identifier_conversion_views.h"
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "chrome/browser/browser_thread.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/keycodes/keyboard_codes.h"
+
+namespace {
+
+class KeyEventFromKeyIdentifierTest : public testing::Test {
+ protected:
+ KeyEventFromKeyIdentifierTest()
+ : ui_thread_(BrowserThread::UI, &message_loop_) {}
+
+ MessageLoopForUI message_loop_;
+ BrowserThread ui_thread_;
+};
+
+TEST_F(KeyEventFromKeyIdentifierTest, MatchOnIdentifier) {
+ EXPECT_EQ(ui::VKEY_APPS, KeyEventFromKeyIdentifier("Apps").GetKeyCode());
+ EXPECT_EQ(ui::VKEY_UNKNOWN,
+ KeyEventFromKeyIdentifier("Nonsense").GetKeyCode());
+}
+
+TEST_F(KeyEventFromKeyIdentifierTest, MatchOnCharacter) {
+ EXPECT_EQ(ui::VKEY_A, KeyEventFromKeyIdentifier("a").GetKeyCode());
+ EXPECT_EQ(ui::VKEY_A, KeyEventFromKeyIdentifier("A").GetKeyCode());
+ EXPECT_EQ(ui::VKEY_OEM_PERIOD, KeyEventFromKeyIdentifier(">").GetKeyCode());
+
+ std::string non_printing_char(" ");
+ non_printing_char[0] = static_cast<char>(1);
+ EXPECT_EQ(ui::VKEY_UNKNOWN,
+ KeyEventFromKeyIdentifier(non_printing_char).GetKeyCode());
+}
+
+TEST_F(KeyEventFromKeyIdentifierTest, MatchOnUnicodeCodepoint) {
+ EXPECT_EQ(ui::VKEY_A, KeyEventFromKeyIdentifier("U+0041").GetKeyCode());
+ EXPECT_EQ(ui::VKEY_A, KeyEventFromKeyIdentifier("U+0061").GetKeyCode());
+ EXPECT_EQ(ui::VKEY_DELETE, KeyEventFromKeyIdentifier("U+007F").GetKeyCode());
+
+ // this one exists in the map, but has no valid ui::VKEY
+ EXPECT_EQ(ui::VKEY_UNKNOWN, KeyEventFromKeyIdentifier("U+030A").GetKeyCode());
+
+ // this one is not in the map
+ EXPECT_EQ(ui::VKEY_UNKNOWN, KeyEventFromKeyIdentifier("U+0001").GetKeyCode());
+}
+
+TEST_F(KeyEventFromKeyIdentifierTest, DoesNotMatchEmptyString) {
+ EXPECT_EQ(ui::VKEY_UNKNOWN, KeyEventFromKeyIdentifier("").GetKeyCode());
+}
+
+TEST_F(KeyEventFromKeyIdentifierTest, ShiftModifiersAreSet) {
+ EXPECT_EQ(0, KeyEventFromKeyIdentifier("1").GetFlags());
+
+ const char* keys_with_shift[] = {
+ "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+",
+ "{", "}", "|", ":", "<", ">", "?", "\""
+ };
+ int kNumKeysWithShift = arraysize(keys_with_shift);
+
+ for (int i = 0; i < kNumKeysWithShift; ++i) {
+ EXPECT_EQ(views::Event::EF_SHIFT_DOWN,
+ KeyEventFromKeyIdentifier(keys_with_shift[i]).GetFlags());
+ }
+}
+
+} // namespace
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 81dceb6f..6c5f61c 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1224,6 +1224,8 @@
'browser/extensions/gtk_theme_installed_infobar_delegate.h',
'browser/extensions/image_loading_tracker.cc',
'browser/extensions/image_loading_tracker.h',
+ 'browser/extensions/key_identifier_conversion_views.cc',
+ 'browser/extensions/key_identifier_conversion_views.h',
'browser/extensions/pack_extension_job.cc',
'browser/extensions/pack_extension_job.h',
'browser/extensions/sandboxed_extension_unpacker.cc',
@@ -4313,6 +4315,8 @@
'sources/': [
['exclude', '^browser/extensions/extension_input_api.cc'],
['exclude', '^browser/extensions/extension_input_api.h'],
+ ['exclude', '^browser/extensions/key_identifier_conversion_views.cc'],
+ ['exclude', '^browser/extensions/key_identifier_conversion_views.h'],
],
}],
# These GTK files haven't been ported to views, while ChromeOS has
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 1a27f21..d09fd65 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1215,6 +1215,7 @@
'browser/extensions/external_policy_extension_loader_unittest.cc',
'browser/extensions/file_reader_unittest.cc',
'browser/extensions/image_loading_tracker_unittest.cc',
+ 'browser/extensions/key_identifier_conversion_views_unittest.cc',
'browser/extensions/sandboxed_extension_unpacker_unittest.cc',
'browser/extensions/user_script_listener_unittest.cc',
'browser/extensions/user_script_master_unittest.cc',
@@ -1981,6 +1982,7 @@
'sources/': [
['exclude', '^browser/ui/views/'],
['exclude', '^../views/'],
+ ['exclude', '^browser/extensions/key_identifier_conversion_views_unittest.cc'],
],
}],
['use_openssl==1', {
diff --git a/ui/base/keycodes/keyboard_code_conversion.cc b/ui/base/keycodes/keyboard_code_conversion.cc
deleted file mode 100644
index fe4db85..0000000
--- a/ui/base/keycodes/keyboard_code_conversion.cc
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/keycodes/keyboard_code_conversion.h"
-
-#include <string.h>
-
-#include "ui/base/keycodes/keyboard_codes.h"
-
-namespace ui {
-
-namespace {
-
-typedef struct KeyIdentifier {
- const char* key_name;
- const char character;
- const char* unicode_codepoint;
- const KeyboardCode key_code;
-} KeyIdentifier;
-
-// Taken from Section 6.3.3 here:
-// http://www.w3.org/TR/DOM-Level-3-Events/#keyset-keyidentifiers
-// TODO(bryeung): keycodes could be wrong: I took the keydown code only
-static const KeyIdentifier kKeyIdentifiers[] = {
- { "Accept", '\0', "", VKEY_ACCEPT },
- { "Add", '\0', "", VKEY_ADD },
- { "Again", '\0', "", VKEY_UNKNOWN },
- { "AllCandidates", '\0', "", VKEY_UNKNOWN },
- { "Alphanumeric", '\0', "", VKEY_UNKNOWN },
- { "Alt", '\0', "", VKEY_MENU },
- { "AltGraph", '\0', "", VKEY_UNKNOWN },
- { "Apps", '\0', "", VKEY_APPS },
- { "Attn", '\0', "", VKEY_ATTN },
- { "BrowserBack", '\0', "", VKEY_BROWSER_BACK },
- { "BrowserFavorites", '\0', "", VKEY_BROWSER_FAVORITES },
- { "BrowserForward", '\0', "", VKEY_BROWSER_FAVORITES },
- { "BrowserHome", '\0', "", VKEY_BROWSER_HOME },
- { "BrowserRefresh", '\0', "", VKEY_BROWSER_REFRESH },
- { "BrowserSearch", '\0', "", VKEY_BROWSER_SEARCH },
- { "BrowserStop", '\0', "", VKEY_BROWSER_STOP },
- { "CapsLock", '\0', "", VKEY_CAPITAL },
- { "Clear", '\0', "", VKEY_OEM_CLEAR },
- { "CodeInput", '\0', "", VKEY_UNKNOWN },
- { "Compose", '\0', "", VKEY_UNKNOWN },
- { "Control", '\0', "", VKEY_CONTROL },
- { "Crsel", '\0', "", VKEY_CRSEL },
- { "Convert", '\0', "", VKEY_CONVERT },
- { "Copy", '\0', "", VKEY_UNKNOWN },
- { "Cut", '\0', "", VKEY_UNKNOWN },
- { "Decimal", '\0', "", VKEY_DECIMAL },
- { "Divide", '\0', "", VKEY_DIVIDE },
- { "Down", '\0', "", VKEY_DOWN },
- { "DownLeft", '\0', "", VKEY_UNKNOWN },
- { "DownRight", '\0', "", VKEY_UNKNOWN },
- { "End", '\0', "", VKEY_END },
- { "Enter", '\0', "", VKEY_RETURN },
- { "EraseEof", '\0', "", VKEY_EREOF },
- { "Execute", '\0', "", VKEY_EXECUTE },
- { "Exsel", '\0', "", VKEY_EXSEL },
- { "Fn", '\0', "", VKEY_UNKNOWN },
- { "F1", '\0', "", VKEY_F1 },
- { "F2", '\0', "", VKEY_F2 },
- { "F3", '\0', "", VKEY_F3 },
- { "F4", '\0', "", VKEY_F4 },
- { "F5", '\0', "", VKEY_F5 },
- { "F6", '\0', "", VKEY_F6 },
- { "F7", '\0', "", VKEY_F7 },
- { "F8", '\0', "", VKEY_F8 },
- { "F9", '\0', "", VKEY_F9 },
- { "F10", '\0', "", VKEY_F10 },
- { "F11", '\0', "", VKEY_F11 },
- { "F12", '\0', "", VKEY_F12 },
- { "F13", '\0', "", VKEY_F13 },
- { "F14", '\0', "", VKEY_F14 },
- { "F15", '\0', "", VKEY_F15 },
- { "F16", '\0', "", VKEY_F16 },
- { "F17", '\0', "", VKEY_F17 },
- { "F18", '\0', "", VKEY_F18 },
- { "F19", '\0', "", VKEY_F19 },
- { "F20", '\0', "", VKEY_F20 },
- { "F21", '\0', "", VKEY_F21 },
- { "F22", '\0', "", VKEY_F22 },
- { "F23", '\0', "", VKEY_F23 },
- { "F24", '\0', "", VKEY_F24 },
- { "FinalMode", '\0', "", VKEY_FINAL },
- { "Find", '\0', "", VKEY_UNKNOWN },
- { "FullWidth", '\0', "", VKEY_UNKNOWN },
- { "HalfWidth", '\0', "", VKEY_UNKNOWN },
- { "HangulMode", '\0', "", VKEY_HANGUL },
- { "HanjaMode", '\0', "", VKEY_HANJA },
- { "Help", '\0', "", VKEY_HELP },
- { "Hiragana", '\0', "", VKEY_UNKNOWN },
- { "Home", '\0', "", VKEY_HOME },
- { "Insert", '\0', "", VKEY_INSERT },
- { "JapaneseHiragana", '\0', "", VKEY_UNKNOWN },
- { "JapaneseKatakana", '\0', "", VKEY_UNKNOWN },
- { "JapaneseRomaji", '\0', "", VKEY_UNKNOWN },
- { "JunjaMode", '\0', "", VKEY_JUNJA },
- { "KanaMode", '\0', "", VKEY_KANA },
- { "KanjiMode", '\0', "", VKEY_KANJI },
- { "Katakana", '\0', "", VKEY_UNKNOWN },
- { "LaunchApplication1", '\0', "", VKEY_MEDIA_LAUNCH_APP1 },
- { "LaunchApplication2", '\0', "", VKEY_MEDIA_LAUNCH_APP2 },
- { "LaunchMail", '\0', "", VKEY_MEDIA_LAUNCH_MAIL },
- { "Left", '\0', "", VKEY_LEFT },
- { "Menu", '\0', "", VKEY_MENU },
- { "Meta", '\0', "", VKEY_UNKNOWN },
- { "MediaNextTrack", '\0', "", VKEY_MEDIA_NEXT_TRACK },
- { "MediaPlayPause", '\0', "", VKEY_MEDIA_PLAY_PAUSE },
- { "MediaPreviousTrack", '\0', "", VKEY_MEDIA_PREV_TRACK },
- { "MediaStop", '\0', "", VKEY_MEDIA_STOP },
- { "ModeChange", '\0', "", VKEY_MODECHANGE },
- { "Multiply", '\0', "", VKEY_MULTIPLY },
- { "NextCandidate", '\0', "", VKEY_UNKNOWN },
- { "Nonconvert", '\0', "", VKEY_NONCONVERT },
- { "NumLock", '\0', "", VKEY_NUMLOCK },
- { "PageDown", '\0', "", VKEY_NEXT },
- { "PageUp", '\0', "", VKEY_PRIOR },
- { "Paste", '\0', "", VKEY_UNKNOWN },
- { "Pause", '\0', "", VKEY_PAUSE },
- { "Play", '\0', "", VKEY_PLAY },
- { "PreviousCandidate", '\0', "", VKEY_UNKNOWN },
- { "PrintScreen", '\0', "", VKEY_SNAPSHOT },
- { "Process", '\0', "", VKEY_PROCESSKEY },
- { "Props", '\0', "", VKEY_UNKNOWN },
- { "Right", '\0', "", VKEY_RIGHT },
- { "RomanCharacters", '\0', "", VKEY_UNKNOWN },
- { "Scroll", '\0', "", VKEY_SCROLL },
- { "Select", '\0', "", VKEY_SELECT },
- { "SelectMedia", '\0', "", VKEY_MEDIA_LAUNCH_MEDIA_SELECT },
- { "Separator", '\0', "", VKEY_SEPARATOR },
- { "Shift", '\0', "", VKEY_SHIFT },
- { "Soft1", '\0', "", VKEY_UNKNOWN },
- { "Soft2", '\0', "", VKEY_UNKNOWN },
- { "Soft3", '\0', "", VKEY_UNKNOWN },
- { "Soft4", '\0', "", VKEY_UNKNOWN },
- { "Stop", '\0', "", VKEY_UNKNOWN },
- { "Subtract", '\0', "", VKEY_SUBTRACT },
- { "Up", '\0', "", VKEY_UP },
- { "UpLeft", '\0', "", VKEY_UNKNOWN },
- { "UpRight", '\0', "", VKEY_UNKNOWN },
- { "Undo", '\0', "", VKEY_UNKNOWN },
- { "VolumeDown", '\0', "", VKEY_VOLUME_DOWN },
- { "VolumeMute", '\0', "", VKEY_VOLUME_MUTE },
- { "VolumeUp", '\0', "", VKEY_VOLUME_UP },
- { "Win", '\0', "", VKEY_LWIN },
- { "Zoom", '\0', "", VKEY_ZOOM },
- { "Backspace", '\0', "U+0008", VKEY_BACK },
- { "Tab", '\0', "U+0009", VKEY_TAB },
- { "Cancel", '\0', "U+0018", VKEY_UNKNOWN },
- { "Esc", '\0', "U+001B", VKEY_ESCAPE },
- { "Spacebar", ' ', "U+0020", VKEY_SPACE },
- { "Exclamation", '!', "U+0021", VKEY_1 },
- { "DoubleQuote", '\"', "U+0022", VKEY_OEM_7 },
- { "Hash", '\0', "U+0023", VKEY_3 },
- { "Dollar", '$', "U+0024", VKEY_4 },
- { "Ampersand", '&', "U+0026", VKEY_5 },
- { "Apostrophe", '\'', "U+0027", VKEY_OEM_7 },
- { "LeftParen", '(', "U+0028", VKEY_9 },
- { "RightParen", ')', "U+0029", VKEY_0 },
- { "Asterisk", '*', "U+002A", VKEY_8 },
- { "Plus", '+', "U+002B", VKEY_OEM_PLUS },
- { "Percent", '+', "U+0025", VKEY_5 },
- { "Comma", ',', "U+002C", VKEY_OEM_COMMA },
- { "HyphenMinus", '-', "U+002D", VKEY_OEM_MINUS },
- { "Period", '.', "U+002E", VKEY_OEM_PERIOD },
- { "Solidus", '/', "U+002F", VKEY_OEM_2 },
- { "", '0', "U+0030", VKEY_0 },
- { "", '1', "U+0031", VKEY_1 },
- { "", '2', "U+0032", VKEY_2 },
- { "", '3', "U+0033", VKEY_3 },
- { "", '4', "U+0034", VKEY_4 },
- { "", '5', "U+0035", VKEY_5 },
- { "", '6', "U+0036", VKEY_6 },
- { "", '7', "U+0037", VKEY_7 },
- { "", '8', "U+0038", VKEY_8 },
- { "", '9', "U+0039", VKEY_9 },
- { "Colon", ':', "U+003A", VKEY_OEM_1 },
- { "Semicolon", ';', "U+003B", VKEY_OEM_1 },
- { "LessThan", '<', "U+003C", VKEY_OEM_COMMA },
- { "Equals", '=', "U+003D", VKEY_OEM_PLUS },
- { "GreaterThan", '>', "U+003E", VKEY_OEM_PERIOD },
- { "QuestionMark", '?', "U+003F", VKEY_OEM_2 },
- { "At", '@', "U+0040", VKEY_2 },
- { "", 'A', "U+0041", VKEY_A },
- { "", 'B', "U+0042", VKEY_B },
- { "", 'C', "U+0043", VKEY_C },
- { "", 'D', "U+0044", VKEY_D },
- { "", 'E', "U+0045", VKEY_E },
- { "", 'F', "U+0046", VKEY_F },
- { "", 'G', "U+0047", VKEY_G },
- { "", 'H', "U+0048", VKEY_H },
- { "", 'I', "U+0049", VKEY_I },
- { "", 'J', "U+004A", VKEY_J },
- { "", 'K', "U+004B", VKEY_K },
- { "", 'L', "U+004C", VKEY_L },
- { "", 'M', "U+004D", VKEY_M },
- { "", 'N', "U+004E", VKEY_N },
- { "", 'O', "U+004F", VKEY_O },
- { "", 'P', "U+0050", VKEY_P },
- { "", 'Q', "U+0051", VKEY_Q },
- { "", 'R', "U+0052", VKEY_R },
- { "", 'S', "U+0053", VKEY_S },
- { "", 'T', "U+0054", VKEY_T },
- { "", 'U', "U+0055", VKEY_U },
- { "", 'V', "U+0056", VKEY_V },
- { "", 'W', "U+0057", VKEY_W },
- { "", 'X', "U+0058", VKEY_X },
- { "", 'Y', "U+0059", VKEY_Y },
- { "", 'Z', "U+005A", VKEY_Z },
- { "", 'a', "U+0061", VKEY_A },
- { "", 'b', "U+0062", VKEY_B },
- { "", 'c', "U+0063", VKEY_C },
- { "", 'd', "U+0064", VKEY_D },
- { "", 'e', "U+0065", VKEY_E },
- { "", 'f', "U+0066", VKEY_F },
- { "", 'g', "U+0067", VKEY_G },
- { "", 'h', "U+0068", VKEY_H },
- { "", 'i', "U+0069", VKEY_I },
- { "", 'j', "U+006A", VKEY_J },
- { "", 'k', "U+006B", VKEY_K },
- { "", 'l', "U+006C", VKEY_L },
- { "", 'm', "U+006D", VKEY_M },
- { "", 'n', "U+006E", VKEY_N },
- { "", 'o', "U+006F", VKEY_O },
- { "", 'p', "U+0070", VKEY_P },
- { "", 'q', "U+0071", VKEY_Q },
- { "", 'r', "U+0072", VKEY_R },
- { "", 's', "U+0073", VKEY_S },
- { "", 't', "U+0074", VKEY_T },
- { "", 'u', "U+0075", VKEY_U },
- { "", 'v', "U+0076", VKEY_V },
- { "", 'w', "U+0077", VKEY_W },
- { "", 'x', "U+0078", VKEY_X },
- { "", 'y', "U+0079", VKEY_Y },
- { "", 'z', "U+007A", VKEY_Z },
- { "LeftSquareBracket", '[', "U+005B", VKEY_OEM_4 },
- { "Backslash", '\\', "U+005C", VKEY_OEM_5 },
- { "RightSquareBracket", ']', "U+005D", VKEY_OEM_6 },
- { "Circumflex", '^', "U+005E", VKEY_OEM_6 },
- { "Underscore", '_', "U+005F", VKEY_OEM_MINUS },
- { "Grave", '`', "U+0060", VKEY_OEM_3 },
- { "LeftCurlyBracket", '{', "U+007B", VKEY_OEM_4 },
- { "Pipe", '|', "U+007C", VKEY_OEM_5 },
- { "RightCurlyBracket", '}', "U+007D", VKEY_OEM_6 },
- { "Del", '\0', "U+007F", VKEY_DELETE },
- { "InvertedExclamation", '\0', "U+00A1", VKEY_UNKNOWN },
- { "DeadGrave", '\0', "U+0300", VKEY_UNKNOWN },
- { "DeadEacute", '\0', "U+0301", VKEY_UNKNOWN },
- { "DeadCircumflex", '\0', "U+0302", VKEY_UNKNOWN },
- { "DeadTilde", '\0', "U+0303", VKEY_UNKNOWN },
- { "DeadMacron", '\0', "U+0304", VKEY_UNKNOWN },
- { "DeadBreve", '\0', "U+0306", VKEY_UNKNOWN },
- { "DeadAboveDot", '\0', "U+0307", VKEY_UNKNOWN },
- { "DeadUmlaut", '\0', "U+0308", VKEY_UNKNOWN },
- { "DeadAboveRing", '\0', "U+030A", VKEY_UNKNOWN },
- { "DeadDoubleacute", '\0', "U+030B", VKEY_UNKNOWN },
- { "DeadCaron", '\0', "U+030C", VKEY_UNKNOWN },
- { "DeadCedilla", '\0', "U+0327", VKEY_UNKNOWN },
- { "DeadOgonek", '\0', "U+0328", VKEY_UNKNOWN },
- { "DeadIota", '\0', "U+0345", VKEY_UNKNOWN },
- { "Euro", '\0', "U+20AC", VKEY_UNKNOWN },
- { "DeadVoicedSound", '\0', "U+3099", VKEY_UNKNOWN },
- { "DeadSemivoicedSound", '\0', "U+309A", VKEY_UNKNOWN }
-};
-
-static const int kNumKeyIdentifiers =
- sizeof(kKeyIdentifiers)/sizeof(KeyIdentifier);
-
-static const KeyIdentifier* GetKeyIdentifierData(const std::string& id) {
- for (int i = 0; i < kNumKeyIdentifiers; ++i) {
- const KeyIdentifier& key = kKeyIdentifiers[i];
- if ((key.key_name[0] != '\0' && strcmp(id.c_str(), key.key_name) == 0) ||
- (id.length() == 1 && id[0] == key.character) ||
- (key.unicode_codepoint[0] != '\0' &&
- strcmp(id.c_str(), key.unicode_codepoint) == 0)) {
- return &key;
- }
- }
-
- return NULL;
-}
-
-} // namespace
-
-
-KeyboardCode KeyCodeFromKeyIdentifier(const std::string& key_identifier) {
- const KeyIdentifier* id = GetKeyIdentifierData(key_identifier);
- if (!id) {
- return VKEY_UNKNOWN;
- }
- return id->key_code;
-}
-
-} // namespace ui
diff --git a/ui/base/keycodes/keyboard_code_conversion.h b/ui/base/keycodes/keyboard_code_conversion.h
deleted file mode 100644
index a7a8331..0000000
--- a/ui/base/keycodes/keyboard_code_conversion.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_KEYCODES_KEYBOARD_CODE_CONVERSION_H_
-#define UI_BASE_KEYCODES_KEYBOARD_CODE_CONVERSION_H_
-#pragma once
-
-#include "ui/base/keycodes/keyboard_codes.h"
-
-#include <string>
-
-namespace ui {
-
-// Convert a KeyIdentifer (see Section 6.3.3 here:
-// http://www.w3.org/TR/DOM-Level-3-Events/#keyset-keyidentifiers)
-// to a ui::KeyboardCode.
-KeyboardCode KeyCodeFromKeyIdentifier(const std::string& key_identifier);
-
-} // namespace ui
-
-#endif // UI_BASE_KEYCODES_KEYBOARD_CODE_CONVERSION_H_
diff --git a/ui/base/keycodes/keyboard_code_conversion_unittest.cc b/ui/base/keycodes/keyboard_code_conversion_unittest.cc
deleted file mode 100644
index 689145a5..0000000
--- a/ui/base/keycodes/keyboard_code_conversion_unittest.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/keycodes/keyboard_code_conversion.h"
-#include "ui/base/keycodes/keyboard_codes.h"
-#include "base/logging.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ui {
-
-TEST(KeyCodeFromKeyIdentifierTest, MatchOnIdentifier) {
- EXPECT_EQ(VKEY_APPS, KeyCodeFromKeyIdentifier("Apps"));
- EXPECT_EQ(VKEY_UNKNOWN, KeyCodeFromKeyIdentifier("Nonsense"));
-}
-
-TEST(KeyCodeFromKeyIdentifierTest, MatchOnCharacter) {
- EXPECT_EQ(VKEY_A, KeyCodeFromKeyIdentifier("a"));
- EXPECT_EQ(VKEY_A, KeyCodeFromKeyIdentifier("A"));
- EXPECT_EQ(VKEY_OEM_PERIOD, KeyCodeFromKeyIdentifier(">"));
-
- std::string non_printing_char(" ");
- non_printing_char[0] = static_cast<char>(1);
- EXPECT_EQ(VKEY_UNKNOWN, KeyCodeFromKeyIdentifier(non_printing_char));
-}
-
-TEST(KeyCodeFromKeyIdentifierTest, MatchOnUnicodeCodepoint) {
- EXPECT_EQ(VKEY_A, KeyCodeFromKeyIdentifier("U+0041"));
- EXPECT_EQ(VKEY_A, KeyCodeFromKeyIdentifier("U+0061"));
- EXPECT_EQ(VKEY_DELETE, KeyCodeFromKeyIdentifier("U+007F"));
-
- // this one exists in the map, but has no valid VKEY
- EXPECT_EQ(VKEY_UNKNOWN, KeyCodeFromKeyIdentifier("U+030A"));
-
- // this one is not in the map
- EXPECT_EQ(VKEY_UNKNOWN, KeyCodeFromKeyIdentifier("U+0001"));
-}
-
-TEST(KeyCodeFromKeyIdentifierTest, DoesNotMatchEmptyString) {
- EXPECT_EQ(VKEY_UNKNOWN, KeyCodeFromKeyIdentifier(""));
-}
-
-} // namespace ui