summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/input_method/input_method_engine.cc14
-rw-r--r--chrome/browser/chromeos/input_method/input_method_engine.h7
-rw-r--r--chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc23
-rw-r--r--chrome/browser/chromeos/input_method/input_method_engine_interface.h1
-rw-r--r--chrome/browser/extensions/api/input_ime/input_ime_api.cc2
-rw-r--r--chrome/common/extensions/api/input_ime.json1
-rw-r--r--chrome/test/data/extensions/input_ime/main.js1
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 + ':' +