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..c7f8f2858f87e81b6f5120c639f2d340ea372283 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,42 @@ 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_)); |
Devlin
2016/03/10 23:21:14
EXTENSION_FUNCTION_VALIDATE(parent_params);
Azure Wei
2016/03/11 07:29:01
Done.
|
+ 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) { |
Devlin
2016/03/10 23:21:14
const auto& key_event : key_data
Azure Wei
2016/03/11 07:29:01
Done.
|
+ 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); |
+ } |
+ 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_)); |