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..d2980016d4cc9d39f9a8724c9be1a3aa4f78171a 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,14 @@ 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"; |
+const char kErrorSetKeyEventsFail[] = "Could not send key events"; |
+} |
namespace ui { |
ImeObserver::ImeObserver(const std::string& extension_id, Profile* profile) |
@@ -329,6 +334,39 @@ 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_)); |
+ EXTENSION_FUNCTION_VALIDATE(parent_params); |
+ 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 (const auto& key_event : key_data) { |
+ InputMethodEngineBase::KeyboardEvent event; |
+ event.type = input_ime::ToString(key_event->type); |
+ event.key = key_event->key; |
+ event.code = key_event->code; |
+ event.key_code = key_event->key_code.get() ? *(key_event->key_code) : 0; |
+ event.alt_key = key_event->alt_key ? *(key_event->alt_key) : false; |
+ event.ctrl_key = key_event->ctrl_key ? *(key_event->ctrl_key) : false; |
+ event.shift_key = key_event->shift_key ? *(key_event->shift_key) : false; |
+ event.caps_lock = key_event->caps_lock ? *(key_event->caps_lock) : false; |
+ key_data_out.push_back(event); |
+ } |
+ if (!engine->SendKeyEvents(params.context_id, key_data_out)) |
+ return RespondNow(Error(kErrorSetKeyEventsFail)); |
+ return RespondNow(NoArguments()); |
+} |
+ |
InputImeAPI::InputImeAPI(content::BrowserContext* context) |
: browser_context_(context), extension_registry_observer_(this) { |
extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |