Commit f169c3e5 authored by shuchen@chromium.org's avatar shuchen@chromium.org

Adds the legacy KeyboardEvent.keyCode attribute for extension IMEs.

    
The main usage of the keyCode attribute is to supports sending correct
soft key events. On the on-screen keyboard, each key should have the
keyCode attached, e.g. the key on the right side of TAB key, in US
keyboard layout, it has key:'q',code:'KeyQ',keyCode:0x51; while in FR
keyboard layout, it has key:'a',code:'KeyQ',keyCode:0x41.
Another example is for UK extended keyboard layout, the '#' key (at the
backslash key location), it has key:'#',code:'BackSlash',keyCode:0xDE;
while for US keyboard, it has key:'\\',code:'BackSlash',keyCode:0xDC.

A real case that this cl will fix is on FR on-screen keyboard, pressing
Ctrl+A will trigger Ctrl+Q shortcut.

BUG=355261
TEST=None

Review URL: https://codereview.chromium.org/346513003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278771 0039d316-1c4b-4281-b951-d872f2087c98
parent 3782a82b
......@@ -92,6 +92,23 @@ std::string GetKeyFromEvent(const ui::KeyEvent& event) {
return base::UTF16ToUTF8(base::string16(1, ch));
}
void GetExtensionKeyboardEventFromKeyEvent(
const ui::KeyEvent& event,
InputMethodEngine::KeyboardEvent* ext_event) {
DCHECK(event.type() == ui::ET_KEY_RELEASED ||
event.type() == ui::ET_KEY_PRESSED);
DCHECK(ext_event);
ext_event->type = (event.type() == ui::ET_KEY_RELEASED) ? "keyup" : "keydown";
ext_event->code = event.code();
ext_event->key_code = static_cast<int>(event.key_code());
ext_event->alt_key = event.IsAltDown();
ext_event->ctrl_key = event.IsControlDown();
ext_event->shift_key = event.IsShiftDown();
ext_event->caps_lock = event.IsCapsLockDown();
ext_event->key = GetKeyFromEvent(event);
}
} // namespace
InputMethodEngine::InputMethodEngine()
......@@ -287,6 +304,9 @@ bool InputMethodEngine::SendKeyEvents(
const KeyboardEvent& event = events[i];
const ui::EventType type =
(event.type == "keyup") ? ui::ET_KEY_RELEASED : ui::ET_KEY_PRESSED;
ui::KeyboardCode key_code = static_cast<ui::KeyboardCode>(event.key_code);
if (key_code == ui::VKEY_UNKNOWN)
key_code = ui::DomKeycodeToKeyboardCode(event.code);
int flags = ui::EF_NONE;
flags |= event.alt_key ? ui::EF_ALT_DOWN : ui::EF_NONE;
......@@ -295,7 +315,7 @@ bool InputMethodEngine::SendKeyEvents(
flags |= event.caps_lock ? ui::EF_CAPS_LOCK_DOWN : ui::EF_NONE;
ui::KeyEvent ui_event(type,
ui::DomKeycodeToKeyboardCode(event.code),
key_code,
event.code,
flags,
false /* is_char */);
......@@ -581,26 +601,6 @@ void InputMethodEngine::Reset() {
observer_->OnReset(engine_id_);
}
namespace {
void GetExtensionKeyboardEventFromKeyEvent(
const ui::KeyEvent& event,
InputMethodEngine::KeyboardEvent* ext_event) {
DCHECK(event.type() == ui::ET_KEY_RELEASED ||
event.type() == ui::ET_KEY_PRESSED);
DCHECK(ext_event);
ext_event->type = (event.type() == ui::ET_KEY_RELEASED) ? "keyup" : "keydown";
ext_event->code = event.code();
ext_event->alt_key = event.IsAltDown();
ext_event->ctrl_key = event.IsControlDown();
ext_event->shift_key = event.IsShiftDown();
ext_event->caps_lock = event.IsCapsLockDown();
ext_event->key = GetKeyFromEvent(event);
}
} // namespace
void InputMethodEngine::ProcessKeyEvent(
const ui::KeyEvent& key_event,
const KeyEventDoneCallback& callback) {
......
......@@ -444,6 +444,46 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineBrowserTest,
ASSERT_TRUE(keyevent_listener_up.WaitUntilSatisfied());
EXPECT_TRUE(keyevent_listener_up.was_satisfied());
}
{
SCOPED_TRACE("sendKeyEvents test with keyCode");
mock_input_context->Reset();
mock_candidate_window->Reset();
const char send_key_events_test_script[] =
"chrome.input.ime.sendKeyEvents({"
" contextID: engineBridge.getFocusedContextID().contextID,"
" keyData : [{"
" type : 'keydown',"
" requestId : '2',"
" key : 'a',"
" code : 'KeyQ',"
" keyCode : 0x41,"
" },{"
" type : 'keyup',"
" requestId : '3',"
" key : 'a',"
" code : 'KeyQ',"
" keyCode : 0x41,"
" }]"
"});";
ExtensionTestMessageListener keyevent_listener_down(
std::string("onKeyEvent:") + kExtensionID +
":keydown:a:KeyQ:false:false:false:false",
false);
ExtensionTestMessageListener keyevent_listener_up(
std::string("onKeyEvent:") + kExtensionID +
":keyup:a:KeyQ:false:false:false:false",
false);
ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
send_key_events_test_script));
ASSERT_TRUE(keyevent_listener_down.WaitUntilSatisfied());
EXPECT_TRUE(keyevent_listener_down.was_satisfied());
ASSERT_TRUE(keyevent_listener_up.WaitUntilSatisfied());
EXPECT_TRUE(keyevent_listener_up.was_satisfied());
}
{
SCOPED_TRACE("setComposition test");
mock_input_context->Reset();
......
......@@ -30,6 +30,7 @@ class InputMethodEngineInterface : public IMEEngineHandlerInterface {
std::string type;
std::string key;
std::string code;
int key_code; // only used by on-screen keyboards.
std::string extension_id;
bool alt_key;
bool ctrl_key;
......
......@@ -552,6 +552,7 @@ bool InputImeSendKeyEventsFunction::RunAsync() {
event.type = input_ime::KeyboardEvent::ToString(key_data[i]->type);
event.key = key_data[i]->key;
event.code = key_data[i]->code;
event.key_code = key_data[i]->key_code.get() ? *(key_data[i]->key_code) : 0;
if (key_data[i]->alt_key)
event.alt_key = *(key_data[i]->alt_key);
if (key_data[i]->ctrl_key)
......
......@@ -18,6 +18,7 @@
"extensionId": {"type": "string", "optional": true, "description": "The extension ID of the sender of this keyevent."},
"key": {"type": "string", "description": "Value of the key being pressed"},
"code": {"type": "string", "description": "Value of the physical key being pressed. The value is not affected by current keyboard layout or modifier state."},
"keyCode": {"type": "integer", "optional": true, "description": "The deprecated HTML keyCode, which is system- and implementation-dependent numerical code signifying the unmodified identifier associated with the key pressed."},
"altKey": {"type": "boolean", "optional": true, "description": "Whether or not the ALT key is pressed."},
"ctrlKey": {"type": "boolean", "optional": true, "description": "Whether or not the CTRL key is pressed."},
"shiftKey": {"type": "boolean", "optional": true, "description": "Whether or not the SHIFT key is pressed."},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment