diff options
-rw-r--r-- | chrome/browser/extensions/extension_input_api.cc | 24 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_input_api.h | 3 |
2 files changed, 19 insertions, 8 deletions
diff --git a/chrome/browser/extensions/extension_input_api.cc b/chrome/browser/extensions/extension_input_api.cc index f849d95..0f9b78b 100644 --- a/chrome/browser/extensions/extension_input_api.cc +++ b/chrome/browser/extensions/extension_input_api.cc @@ -73,9 +73,7 @@ uint16 UnicodeIdentifierStringToInt(const std::string& key_identifier) { return character; } -} // namespace - -views::Widget* SendKeyboardEventInputFunction::GetTopLevelWidget() { +views::Widget* GetTopLevelWidget(Browser* browser) { if (views::ViewsDelegate::views_delegate) { views::View* view = views::ViewsDelegate::views_delegate-> GetDefaultParentView(); @@ -89,7 +87,6 @@ views::Widget* SendKeyboardEventInputFunction::GetTopLevelWidget() { return login_window; #endif - Browser* browser = GetCurrentBrowser(); if (!browser) return NULL; @@ -102,6 +99,8 @@ views::Widget* SendKeyboardEventInputFunction::GetTopLevelWidget() { return browser_view ? browser_view->GetWidget() : NULL; } +} // namespace + bool SendKeyboardEventInputFunction::RunImpl() { DictionaryValue* args; EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &args)); @@ -143,7 +142,7 @@ bool SendKeyboardEventInputFunction::RunImpl() { return false; } - views::Widget* widget = GetTopLevelWidget(); + views::Widget* widget = GetTopLevelWidget(GetCurrentBrowser()); if (!widget) { error_ = kNoValidRecipientError; return false; @@ -212,6 +211,21 @@ bool SendHandwritingStrokeFunction::RunImpl() { EXTENSION_FUNCTION_VALIDATE(dict->GetDouble("y", &y)); stroke.push_back(std::make_pair(x, y)); } + + views::Widget* widget = GetTopLevelWidget(GetCurrentBrowser()); + views::InputMethod* ime = widget ? widget->GetInputMethod() : NULL; + if (ime) { + static const views::KeyEvent* dummy_keydown = new views::KeyEvent( + ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 0); + static const views::KeyEvent* dummy_keyup = new views::KeyEvent( + ui::ET_KEY_RELEASED, ui::VKEY_UNKNOWN, 0); + // These fake key events are necessary for clearing |suppress_next_result_| + // flag in view/ime/input_method_*.cc. Otherwise, clicking a candidate in + // the candidate window might be ignored. + ime->DispatchKeyEvent(*dummy_keydown); + ime->DispatchKeyEvent(*dummy_keyup); + } + chromeos::input_method::InputMethodManager::GetInstance()-> SendHandwritingStroke(stroke); return true; diff --git a/chrome/browser/extensions/extension_input_api.h b/chrome/browser/extensions/extension_input_api.h index ddc3a55..73878b3 100644 --- a/chrome/browser/extensions/extension_input_api.h +++ b/chrome/browser/extensions/extension_input_api.h @@ -22,9 +22,6 @@ class SendKeyboardEventInputFunction : public SyncExtensionFunction { public: virtual bool RunImpl() OVERRIDE; DECLARE_EXTENSION_FUNCTION_NAME("experimental.input.sendKeyboardEvent"); - - private: - views::Widget* GetTopLevelWidget(); }; #if defined(TOUCH_UI) |