diff options
7 files changed, 39 insertions, 10 deletions
diff --git a/chrome/browser/chromeos/input_method/input_method_engine.cc b/chrome/browser/chromeos/input_method/input_method_engine.cc index e0a9597..b32a8a8 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine.cc @@ -64,7 +64,8 @@ InputMethodEngine::InputMethodEngine() composition_text_(new CompositionText()), composition_cursor_(0), candidate_window_(new ui::CandidateWindow()), - window_visible_(false) {} + window_visible_(false), + sent_key_event_(NULL) {} InputMethodEngine::~InputMethodEngine() { input_method::InputMethodManager::Get()->RemoveInputMethodExtension(imm_id_); @@ -84,6 +85,7 @@ void InputMethodEngine::Initialize( // TODO(komatsu): It is probably better to set observer out of Initialize. observer_ = observer; engine_id_ = engine_id; + extension_id_ = extension_id; input_method::InputMethodManager* manager = input_method::InputMethodManager::Get(); @@ -244,6 +246,8 @@ bool InputMethodEngine::SendKeyEvents( flags |= event.caps_lock ? ui::EF_CAPS_LOCK_DOWN : ui::EF_NONE; ui::KeyEvent ui_event(type, key_code, code, flags, false /* is_char */); + base::AutoReset<const ui::KeyEvent*> reset_sent_key(&sent_key_event_, + &ui_event); ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&ui_event); if (details.dispatcher_destroyed) break; @@ -558,6 +562,14 @@ void InputMethodEngine::ProcessKeyEvent( KeyboardEvent ext_event; GetExtensionKeyboardEventFromKeyEvent(key_event, &ext_event); + + // If the given key event is equal to the key event sent by + // SendKeyEvents, this engine ID is propagated to the extension IME. + // Note, this check relies on that ui::KeyEvent is propagated as + // reference without copying. + if (&key_event == sent_key_event_) + ext_event.extension_id = extension_id_; + observer_->OnKeyEvent( engine_id_, ext_event, diff --git a/chrome/browser/chromeos/input_method/input_method_engine.h b/chrome/browser/chromeos/input_method/input_method_engine.h index 64dd8e2..e365228 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine.h +++ b/chrome/browser/chromeos/input_method/input_method_engine.h @@ -122,6 +122,9 @@ class InputMethodEngine : public InputMethodEngineInterface { // This IME ID in Chrome Extension. std::string engine_id_; + // This IME's Chrome Extension ID. + std::string extension_id_; + // This IME ID in InputMethodManager. std::string imm_id_; @@ -149,6 +152,10 @@ class InputMethodEngine : public InputMethodEngineInterface { // Used for input view window. GURL input_view_url_; + + // Used with SendKeyEvents and ProcessKeyEvent to check if the key event + // sent to ProcessKeyEvent is sent by SendKeyEvents. + const ui::KeyEvent* sent_key_event_; }; } // namespace chromeos diff --git a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc index 6156872..83c681be 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc @@ -30,6 +30,7 @@ const char kToUpperIMEID[] = "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME"; const char kAPIArgumentIMEID[] = "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME"; +const char kExtensionID[] = "iafoklpfplgfnoimmaejoeondnjnlcfp"; // InputMethod extension should work on 1)normal extension, 2)normal extension // in incognito mode 3)component extension. @@ -262,7 +263,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:a:KeyA:false:false:false:false"; + "onKeyEvent::keydown:a:KeyA:false:false:false:false"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event( @@ -278,7 +279,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:No, Shift:No, Caps:No"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:a:KeyA:true:false:false:false"; + "onKeyEvent::keydown:a:KeyA:true:false:false:false"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -297,7 +298,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:No, alt:Yes, Shift:No, Caps:No"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:a:KeyA:false:true:false:false"; + "onKeyEvent::keydown:a:KeyA:false:true:false:false"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -316,7 +317,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:No"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:A:KeyA:false:false:true:false"; + "onKeyEvent::keydown:A:KeyA:false:false:true:false"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -335,7 +336,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:Yes"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:a:KeyA:false:false:false:true"; + "onKeyEvent::keydown:a:KeyA:false:false:false:true"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -354,7 +355,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:Yes, Shift:No, Caps:No"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:a:KeyA:true:true:false:false"; + "onKeyEvent::keydown:a:KeyA:true:true:false:false"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -373,7 +374,7 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:Yes"); KeyEventDoneCallback callback(false); const std::string expected_value = - "onKeyEvent:keydown:A:KeyA:false:false:true:true"; + "onKeyEvent::keydown:A:KeyA:false:false:true:true"; ExtensionTestMessageListener keyevent_listener(expected_value, false); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, @@ -427,9 +428,13 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, "});"; ExtensionTestMessageListener keyevent_listener_down( - "onKeyEvent:keydown:z:KeyZ:false:false:false:false", false); + std::string("onKeyEvent:") + kExtensionID + + ":keydown:z:KeyZ:false:false:false:false", + false); ExtensionTestMessageListener keyevent_listener_up( - "onKeyEvent:keyup:z:KeyZ:false:false:false:false", false); + std::string("onKeyEvent:") + kExtensionID + + ":keyup:z:KeyZ:false:false:false:false", + false); ASSERT_TRUE(content::ExecuteScript(host->host_contents(), send_key_events_test_script)); diff --git a/chrome/browser/chromeos/input_method/input_method_engine_interface.h b/chrome/browser/chromeos/input_method/input_method_engine_interface.h index 4ee0722..e52f568 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_interface.h +++ b/chrome/browser/chromeos/input_method/input_method_engine_interface.h @@ -30,6 +30,7 @@ class InputMethodEngineInterface : public IMEEngineHandlerInterface { std::string type; std::string key; std::string code; + std::string extension_id; bool alt_key; bool ctrl_key; bool shift_key; diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chrome/browser/extensions/api/input_ime/input_ime_api.cc index 895d35e..8210d74 100644 --- a/chrome/browser/extensions/api/input_ime/input_ime_api.cc +++ b/chrome/browser/extensions/api/input_ime/input_ime_api.cc @@ -180,6 +180,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { input_ime::KeyboardEvent key_data_value; key_data_value.type = input_ime::KeyboardEvent::ParseType(event.type); key_data_value.request_id = request_id; + if (!event.extension_id.empty()) + key_data_value.extension_id.reset(new std::string(event.extension_id)); key_data_value.key = event.key; key_data_value.code = event.code; key_data_value.alt_key.reset(new bool(event.alt_key)); diff --git a/chrome/common/extensions/api/input_ime.json b/chrome/common/extensions/api/input_ime.json index d821328..ab8c1644 100644 --- a/chrome/common/extensions/api/input_ime.json +++ b/chrome/common/extensions/api/input_ime.json @@ -15,6 +15,7 @@ "properties": { "type": {"type": "string", "description": "One of keyup or keydown.", "enum": ["keyup", "keydown"]}, "requestId": {"type": "string", "description": "The ID of the request."}, + "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."}, "altKey": {"type": "boolean", "optional": true, "description": "Whether or not the ALT key is pressed."}, diff --git a/chrome/test/data/extensions/input_ime/main.js b/chrome/test/data/extensions/input_ime/main.js index 53babdd..8199cd1 100644 --- a/chrome/test/data/extensions/input_ime/main.js +++ b/chrome/test/data/extensions/input_ime/main.js @@ -67,6 +67,7 @@ APIArgumentIME.prototype = new IMEBase(); **/ APIArgumentIME.prototype.onKeyEvent = function(context, engine, keyData) { chrome.test.sendMessage('onKeyEvent:' + + (keyData.extensionId || '') + ':' + keyData.type + ':' + keyData.key + ':' + keyData.code + ':' + |