Chromium Code Reviews| 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_)); |