Index: chrome/browser/extensions/api/input_ime/input_ime_api.cc |
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 31dc26033cf676f4733be6b1a2989ec16e067567..e8a62e150a00849380f0d494b1063f6f92616b7e 100644 |
--- a/chrome/browser/extensions/api/input_ime/input_ime_api.cc |
+++ b/chrome/browser/extensions/api/input_ime/input_ime_api.cc |
@@ -12,9 +12,13 @@ namespace input_ime = extensions::api::input_ime; |
namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled; |
namespace SetComposition = extensions::api::input_ime::SetComposition; |
namespace CommitText = extensions::api::input_ime::CommitText; |
+namespace SendKeyEvents = extensions::api::input_ime::SendKeyEvents; |
using ui::IMEEngineHandlerInterface; |
using input_method::InputMethodEngineBase; |
+namespace { |
+const char kErrorEngineNotAvailable[] = "Engine is not available"; |
+} |
namespace ui { |
ImeObserver::ImeObserver(const std::string& extension_id, Profile* profile) |
@@ -329,6 +333,41 @@ ExtensionFunction::ResponseAction InputImeCommitTextFunction::Run() { |
return RespondNow(ArgumentList(std::move(output))); |
} |
+ExtensionFunction::ResponseAction InputImeSendKeyEventsFunction::Run() { |
+ InputImeEventRouter* event_router = |
+ GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())); |
+ InputMethodEngineBase* engine = |
+ event_router ? event_router->GetActiveEngine(extension_id()) : nullptr; |
+ if (!engine) |
+ return RespondNow(Error(kErrorEngineNotAvailable)); |
+ |
+ scoped_ptr<SendKeyEvents::Params> parent_params( |
+ SendKeyEvents::Params::Create(*args_)); |
+ const SendKeyEvents::Params::Parameters& params = parent_params->parameters; |
+ const std::vector<linked_ptr<input_ime::KeyboardEvent>>& key_data = |
+ params.key_data; |
+ std::vector<InputMethodEngineBase::KeyboardEvent> key_data_out; |
+ |
+ for (size_t i = 0; i < key_data.size(); ++i) { |
+ InputMethodEngineBase::KeyboardEvent event; |
+ event.type = input_ime::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) |
+ event.ctrl_key = *(key_data[i]->ctrl_key); |
+ if (key_data[i]->shift_key) |
+ event.shift_key = *(key_data[i]->shift_key); |
+ if (key_data[i]->caps_lock) |
+ event.caps_lock = *(key_data[i]->caps_lock); |
+ key_data_out.push_back(event); |
+ } |
+ engine->SendKeyEvents(params.context_id, key_data_out); |
Shu Chen
2016/03/08 05:59:44
Better to expose the errors.
Azure Wei
2016/03/08 11:42:29
Done.
|
+ return RespondNow(NoArguments()); |
+} |
+ |
InputImeAPI::InputImeAPI(content::BrowserContext* context) |
: browser_context_(context), extension_registry_observer_(this) { |
extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |