| Index: chrome/test/webdriver/webdriver_key_converter.cc
|
| diff --git a/chrome/test/webdriver/webdriver_key_converter.cc b/chrome/test/webdriver/webdriver_key_converter.cc
|
| deleted file mode 100644
|
| index 57a45991d9a7fae6248fc83c2b8143d6afa6778d..0000000000000000000000000000000000000000
|
| --- a/chrome/test/webdriver/webdriver_key_converter.cc
|
| +++ /dev/null
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (c) 2012 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/test/webdriver/webdriver_key_converter.h"
|
| -
|
| -#include "base/format_macros.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/common/automation_constants.h"
|
| -#include "chrome/test/automation/automation_json_requests.h"
|
| -#include "chrome/test/webdriver/keycode_text_conversion.h"
|
| -#include "chrome/test/webdriver/webdriver_logging.h"
|
| -
|
| -namespace {
|
| -
|
| -struct ModifierMaskAndKeyCode {
|
| - int mask;
|
| - ui::KeyboardCode key_code;
|
| -};
|
| -
|
| -const ModifierMaskAndKeyCode kModifiers[] = {
|
| - { automation::kShiftKeyMask, ui::VKEY_SHIFT },
|
| - { automation::kControlKeyMask, ui::VKEY_CONTROL },
|
| - { automation::kAltKeyMask, ui::VKEY_MENU }
|
| -};
|
| -
|
| -// TODO(kkania): Use this in KeyMap.
|
| -// Ordered list of all the key codes corresponding to special WebDriver keys.
|
| -// These WebDriver keys are defined in the Unicode Private Use Area.
|
| -// http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/value
|
| -const ui::KeyboardCode kSpecialWebDriverKeys[] = {
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_HELP,
|
| - ui::VKEY_BACK,
|
| - ui::VKEY_TAB,
|
| - ui::VKEY_CLEAR,
|
| - ui::VKEY_RETURN,
|
| - ui::VKEY_RETURN,
|
| - ui::VKEY_SHIFT,
|
| - ui::VKEY_CONTROL,
|
| - ui::VKEY_MENU,
|
| - ui::VKEY_PAUSE,
|
| - ui::VKEY_ESCAPE,
|
| - ui::VKEY_SPACE,
|
| - ui::VKEY_PRIOR, // page up
|
| - ui::VKEY_NEXT, // page down
|
| - ui::VKEY_END,
|
| - ui::VKEY_HOME,
|
| - ui::VKEY_LEFT,
|
| - ui::VKEY_UP,
|
| - ui::VKEY_RIGHT,
|
| - ui::VKEY_DOWN,
|
| - ui::VKEY_INSERT,
|
| - ui::VKEY_DELETE,
|
| - ui::VKEY_OEM_1, // semicolon
|
| - ui::VKEY_OEM_PLUS, // equals
|
| - ui::VKEY_NUMPAD0,
|
| - ui::VKEY_NUMPAD1,
|
| - ui::VKEY_NUMPAD2,
|
| - ui::VKEY_NUMPAD3,
|
| - ui::VKEY_NUMPAD4,
|
| - ui::VKEY_NUMPAD5,
|
| - ui::VKEY_NUMPAD6,
|
| - ui::VKEY_NUMPAD7,
|
| - ui::VKEY_NUMPAD8,
|
| - ui::VKEY_NUMPAD9,
|
| - ui::VKEY_MULTIPLY,
|
| - ui::VKEY_ADD,
|
| - ui::VKEY_OEM_COMMA,
|
| - ui::VKEY_SUBTRACT,
|
| - ui::VKEY_DECIMAL,
|
| - ui::VKEY_DIVIDE,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_UNKNOWN,
|
| - ui::VKEY_F1,
|
| - ui::VKEY_F2,
|
| - ui::VKEY_F3,
|
| - ui::VKEY_F4,
|
| - ui::VKEY_F5,
|
| - ui::VKEY_F6,
|
| - ui::VKEY_F7,
|
| - ui::VKEY_F8,
|
| - ui::VKEY_F9,
|
| - ui::VKEY_F10,
|
| - ui::VKEY_F11,
|
| - ui::VKEY_F12};
|
| -
|
| -const char16 kWebDriverNullKey = 0xE000U;
|
| -const char16 kWebDriverShiftKey = 0xE008U;
|
| -const char16 kWebDriverControlKey = 0xE009U;
|
| -const char16 kWebDriverAltKey = 0xE00AU;
|
| -const char16 kWebDriverCommandKey = 0xE03DU;
|
| -
|
| -// Returns whether the given key is a WebDriver key modifier.
|
| -bool IsModifierKey(char16 key) {
|
| - switch (key) {
|
| - case kWebDriverShiftKey:
|
| - case kWebDriverControlKey:
|
| - case kWebDriverAltKey:
|
| - case kWebDriverCommandKey:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -// Gets the key code associated with |key|, if it is a special WebDriver key.
|
| -// Returns whether |key| is a special WebDriver key. If true, |key_code| will
|
| -// be set.
|
| -bool KeyCodeFromSpecialWebDriverKey(char16 key, ui::KeyboardCode* key_code) {
|
| - int index = static_cast<int>(key) - 0xE000U;
|
| - bool is_special_key = index >= 0 &&
|
| - index < static_cast<int>(arraysize(kSpecialWebDriverKeys));
|
| - if (is_special_key)
|
| - *key_code = kSpecialWebDriverKeys[index];
|
| - return is_special_key;
|
| -}
|
| -
|
| -// Gets the key code associated with |key|, if it is a special shorthand key.
|
| -// Shorthand keys are common text equivalents for keys, such as the newline
|
| -// character, which is shorthand for the return key. Returns whether |key| is
|
| -// a shorthand key. If true, |key_code| will be set and |client_should_skip|
|
| -// will be set to whether the key should be skipped.
|
| -bool KeyCodeFromShorthandKey(char16 key_utf16,
|
| - ui::KeyboardCode* key_code,
|
| - bool* client_should_skip) {
|
| - string16 key_str_utf16;
|
| - key_str_utf16.push_back(key_utf16);
|
| - std::string key_str_utf8 = UTF16ToUTF8(key_str_utf16);
|
| - if (key_str_utf8.length() != 1)
|
| - return false;
|
| - bool should_skip = false;
|
| - char key = key_str_utf8[0];
|
| - if (key == '\n') {
|
| - *key_code = ui::VKEY_RETURN;
|
| - } else if (key == '\t') {
|
| - *key_code = ui::VKEY_TAB;
|
| - } else if (key == '\b') {
|
| - *key_code = ui::VKEY_BACK;
|
| - } else if (key == ' ') {
|
| - *key_code = ui::VKEY_SPACE;
|
| - } else if (key == '\r') {
|
| - *key_code = ui::VKEY_UNKNOWN;
|
| - should_skip = true;
|
| - } else {
|
| - return false;
|
| - }
|
| - *client_should_skip = should_skip;
|
| - return true;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace webdriver {
|
| -
|
| -WebKeyEvent CreateKeyDownEvent(ui::KeyboardCode key_code, int modifiers) {
|
| - return WebKeyEvent(automation::kRawKeyDownType,
|
| - key_code,
|
| - std::string(),
|
| - std::string(),
|
| - modifiers);
|
| -}
|
| -
|
| -WebKeyEvent CreateKeyUpEvent(ui::KeyboardCode key_code, int modifiers) {
|
| - return WebKeyEvent(automation::kKeyUpType,
|
| - key_code,
|
| - std::string(),
|
| - std::string(),
|
| - modifiers);
|
| -}
|
| -
|
| -WebKeyEvent CreateCharEvent(const std::string& unmodified_text,
|
| - const std::string& modified_text,
|
| - int modifiers) {
|
| - return WebKeyEvent(automation::kCharType,
|
| - ui::VKEY_UNKNOWN,
|
| - unmodified_text,
|
| - modified_text,
|
| - modifiers);
|
| -}
|
| -
|
| -bool ConvertKeysToWebKeyEvents(const string16& client_keys,
|
| - const Logger& logger,
|
| - bool release_modifiers,
|
| - int* modifiers,
|
| - std::vector<WebKeyEvent>* client_key_events,
|
| - std::string* error_msg) {
|
| - std::vector<WebKeyEvent> key_events;
|
| -
|
| - string16 keys = client_keys;
|
| - // Add an implicit NULL character to the end of the input to depress all
|
| - // modifiers.
|
| - if (release_modifiers)
|
| - keys.push_back(kWebDriverNullKey);
|
| -
|
| - int sticky_modifiers = *modifiers;
|
| - for (size_t i = 0; i < keys.size(); ++i) {
|
| - char16 key = keys[i];
|
| -
|
| - if (key == kWebDriverNullKey) {
|
| - // Release all modifier keys and clear |stick_modifiers|.
|
| - if (sticky_modifiers & automation::kShiftKeyMask)
|
| - key_events.push_back(CreateKeyUpEvent(ui::VKEY_SHIFT, 0));
|
| - if (sticky_modifiers & automation::kControlKeyMask)
|
| - key_events.push_back(CreateKeyUpEvent(ui::VKEY_CONTROL, 0));
|
| - if (sticky_modifiers & automation::kAltKeyMask)
|
| - key_events.push_back(CreateKeyUpEvent(ui::VKEY_MENU, 0));
|
| - if (sticky_modifiers & automation::kMetaKeyMask)
|
| - key_events.push_back(CreateKeyUpEvent(ui::VKEY_COMMAND, 0));
|
| - sticky_modifiers = 0;
|
| - continue;
|
| - }
|
| - if (IsModifierKey(key)) {
|
| - // Press or release the modifier, and adjust |sticky_modifiers|.
|
| - bool modifier_down = false;
|
| - ui::KeyboardCode key_code = ui::VKEY_UNKNOWN;
|
| - if (key == kWebDriverShiftKey) {
|
| - sticky_modifiers ^= automation::kShiftKeyMask;
|
| - modifier_down = sticky_modifiers & automation::kShiftKeyMask;
|
| - key_code = ui::VKEY_SHIFT;
|
| - } else if (key == kWebDriverControlKey) {
|
| - sticky_modifiers ^= automation::kControlKeyMask;
|
| - modifier_down = sticky_modifiers & automation::kControlKeyMask;
|
| - key_code = ui::VKEY_CONTROL;
|
| - } else if (key == kWebDriverAltKey) {
|
| - sticky_modifiers ^= automation::kAltKeyMask;
|
| - modifier_down = sticky_modifiers & automation::kAltKeyMask;
|
| - key_code = ui::VKEY_MENU;
|
| - } else if (key == kWebDriverCommandKey) {
|
| - sticky_modifiers ^= automation::kMetaKeyMask;
|
| - modifier_down = sticky_modifiers & automation::kMetaKeyMask;
|
| - key_code = ui::VKEY_COMMAND;
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| - if (modifier_down)
|
| - key_events.push_back(CreateKeyDownEvent(key_code, sticky_modifiers));
|
| - else
|
| - key_events.push_back(CreateKeyUpEvent(key_code, sticky_modifiers));
|
| - continue;
|
| - }
|
| -
|
| - ui::KeyboardCode key_code = ui::VKEY_UNKNOWN;
|
| - std::string unmodified_text, modified_text;
|
| - int all_modifiers = sticky_modifiers;
|
| -
|
| - // Get the key code, text, and modifiers for the given key.
|
| - bool should_skip = false;
|
| - if (KeyCodeFromSpecialWebDriverKey(key, &key_code) ||
|
| - KeyCodeFromShorthandKey(key, &key_code, &should_skip)) {
|
| - if (should_skip)
|
| - continue;
|
| - if (key_code == ui::VKEY_UNKNOWN) {
|
| - *error_msg = base::StringPrintf(
|
| - "Unknown WebDriver key(%d) at string index (%" PRIuS ")",
|
| - static_cast<int>(key),
|
| - i);
|
| - return false;
|
| - }
|
| - if (key_code == ui::VKEY_RETURN) {
|
| - // For some reason Chrome expects a carriage return for the return key.
|
| - modified_text = unmodified_text = "\r";
|
| - } else {
|
| - // WebDriver assumes a numpad key should translate to the number,
|
| - // which requires NumLock to be on with some platforms. This isn't
|
| - // formally in the spec, but is expected by their tests.
|
| - int webdriver_modifiers = 0;
|
| - if (key_code >= ui::VKEY_NUMPAD0 && key_code <= ui::VKEY_NUMPAD9)
|
| - webdriver_modifiers = automation::kNumLockKeyMask;
|
| - unmodified_text = ConvertKeyCodeToText(key_code, webdriver_modifiers);
|
| - modified_text = ConvertKeyCodeToText(
|
| - key_code,
|
| - all_modifiers | webdriver_modifiers);
|
| - }
|
| - } else {
|
| - int necessary_modifiers = 0;
|
| - ConvertCharToKeyCode(key, &key_code, &necessary_modifiers);
|
| - all_modifiers |= necessary_modifiers;
|
| - if (key_code != ui::VKEY_UNKNOWN) {
|
| - unmodified_text = ConvertKeyCodeToText(key_code, 0);
|
| - modified_text = ConvertKeyCodeToText(key_code, all_modifiers);
|
| - }
|
| - if (unmodified_text.empty() || modified_text.empty()) {
|
| - // Do a best effort and use the raw key we were given.
|
| - logger.Log(
|
| - kWarningLogLevel,
|
| - base::StringPrintf("No translation for key code. Code point: %d",
|
| - static_cast<int>(key)));
|
| - if (unmodified_text.empty())
|
| - unmodified_text = UTF16ToUTF8(keys.substr(i, 1));
|
| - if (modified_text.empty())
|
| - modified_text = UTF16ToUTF8(keys.substr(i, 1));
|
| - }
|
| - }
|
| -
|
| - // Create the key events.
|
| - bool necessary_modifiers[3];
|
| - for (int i = 0; i < 3; ++i) {
|
| - necessary_modifiers[i] =
|
| - all_modifiers & kModifiers[i].mask &&
|
| - !(sticky_modifiers & kModifiers[i].mask);
|
| - if (necessary_modifiers[i]) {
|
| - key_events.push_back(
|
| - CreateKeyDownEvent(kModifiers[i].key_code, sticky_modifiers));
|
| - }
|
| - }
|
| -
|
| - key_events.push_back(CreateKeyDownEvent(key_code, all_modifiers));
|
| - if (unmodified_text.length() || modified_text.length()) {
|
| - key_events.push_back(
|
| - CreateCharEvent(unmodified_text, modified_text, all_modifiers));
|
| - }
|
| - key_events.push_back(CreateKeyUpEvent(key_code, all_modifiers));
|
| -
|
| - for (int i = 2; i > -1; --i) {
|
| - if (necessary_modifiers[i]) {
|
| - key_events.push_back(
|
| - CreateKeyUpEvent(kModifiers[i].key_code, sticky_modifiers));
|
| - }
|
| - }
|
| - }
|
| - client_key_events->swap(key_events);
|
| - *modifiers = sticky_modifiers;
|
| - return true;
|
| -}
|
| -
|
| -} // namespace webdriver
|
|
|