Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: ui/keyboard/keyboard_util.cc

Issue 14161009: WebUIHandler for chrome://keyboard (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix license headers Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/keyboard/keyboard_util.h ('k') | ui/keyboard/resources/common.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/keyboard/keyboard_util.cc
diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc
index 8ccb44138291f4aa55de80a93cb846cfc5112f12..62195b249dc3c170491e789330651769b32435d8 100644
--- a/ui/keyboard/keyboard_util.cc
+++ b/ui/keyboard/keyboard_util.cc
@@ -4,9 +4,69 @@
#include "ui/keyboard/keyboard_util.h"
+#include <string>
+
#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "ui/base/events/event.h"
+#include "ui/base/events/event_constants.h"
+#include "ui/base/events/key_identifier_conversion.h"
#include "ui/keyboard/keyboard_switches.h"
+namespace {
+
+// KeyEvent dictionary keys
+const char kType[] = "type";
+const char kKeyIdentifier[] = "keyIdentifier";
+const char kAlt[] = "altKey";
+const char kCtrl[] = "ctrlKey";
+const char kMeta[] = "metaKey";
+const char kShift[] = "shiftKey";
+const char kKeyDown[] = "keydown";
+const char kKeyUp[] = "keyup";
+
+// Errors.
+const char kInvalidArgumentsListError[] =
+ "Argument list does not contain a dictionary.";
+const char kInvalidKeyEventMissingKeyIdentifierError[] =
+ "KeyEvent object is missing the keyIdentifier field";
+const char kInvalidKeyEventMissingTypeError[] =
+ "KeyEvent object is missing the type field";
+const char kUnknownKeyEventTypeError[] =
+ "Unknown event type in KeyEvent.";
+const char kUnknownOrUnsupportedKeyIdentiferError[] =
+ "Unknown or unsupported key identifier.";
+const char kUnsupportedModifierError[] =
+ "Unsupported modifier (meta).";
+
+ui::EventType GetTypeFromString(const std::string& type) {
+ if (type == kKeyDown) {
+ return ui::ET_KEY_PRESSED;
+ } else if (type == kKeyUp) {
+ return ui::ET_KEY_RELEASED;
+ }
+ return ui::ET_UNKNOWN;
+}
+
+// Converts a hex string "U+NNNN" to uint16. Returns 0 on error.
+uint16 UnicodeIdentifierStringToInt(const std::string& key_identifier) {
+ int character = 0;
+ if ((key_identifier.length() == 6) &&
+ (key_identifier.substr(0, 2) == "U+") &&
+ (key_identifier.substr(2).find_first_not_of("0123456789abcdefABCDEF") ==
+ std::string::npos)) {
+ const bool result =
+ base::HexStringToInt(key_identifier.substr(2), &character);
+ DCHECK(result) << key_identifier;
+ }
+ return character;
+}
+
+} // namespace
+
namespace keyboard {
bool IsKeyboardEnabled() {
@@ -14,4 +74,69 @@ bool IsKeyboardEnabled() {
switches::kEnableVirtualKeyboard);
}
+ui::KeyEvent* KeyEventFromArgs(const base::ListValue* args,
+ std::string* error) {
+ const DictionaryValue* key_event;
+ if (!args->GetDictionary(0, &key_event)) {
+ *error = kInvalidArgumentsListError;
+ return NULL;
+ }
+
+ std::string type_name;
+ if (!key_event->GetString(kType, &type_name)) {
+ *error = kInvalidKeyEventMissingTypeError;
+ return NULL;
+ }
+
+ ui::EventType type = GetTypeFromString(type_name);
+ if (type == ui::ET_UNKNOWN) {
+ *error = kUnknownKeyEventTypeError;
+ return NULL;
+ }
+
+ std::string identifier;
+ if (!key_event->GetString(kKeyIdentifier, &identifier)) {
+ *error = kInvalidKeyEventMissingKeyIdentifierError;
+ return NULL;
+ }
+ TrimWhitespaceASCII(identifier, TRIM_ALL, &identifier);
+
+ const ui::KeyEvent& prototype_event =
+ ui::KeyEventFromKeyIdentifier(identifier);
+ uint16 character = 0;
+ if (prototype_event.key_code() == ui::VKEY_UNKNOWN) {
+ character = UnicodeIdentifierStringToInt(identifier);
+ if (!character) {
+ *error = kUnknownOrUnsupportedKeyIdentiferError;
+ return NULL;
+ }
+ }
+
+ int flags = 0;
+ if (prototype_event.key_code() != ui::VKEY_UNKNOWN)
+ flags = prototype_event.flags();
+
+ bool flag = false;
+ if (key_event->GetBoolean(kAlt, &flag) && flag)
+ flags |= ui::EF_ALT_DOWN;
+ if (key_event->GetBoolean(kCtrl, &flag) && flag)
+ flags |= ui::EF_CONTROL_DOWN;
+ if (key_event->GetBoolean(kShift, &flag) && flag)
+ flags |= ui::EF_SHIFT_DOWN;
+ if (key_event->GetBoolean(kMeta, &flag) && flag) {
+ // ui::KeyEvent does not have a Meta flag, so return an error for now.
+ *error = kUnsupportedModifierError;
+ return NULL;
+ }
+
+ ui::KeyEvent* event = new ui::KeyEvent(
+ type, prototype_event.key_code(), flags, prototype_event.is_char());
+ if (character) {
+ event->set_character(character);
+ event->set_unmodified_character(character);
+ }
+
+ return event;
+}
+
} // namespace keyboard
« no previous file with comments | « ui/keyboard/keyboard_util.h ('k') | ui/keyboard/resources/common.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698