From e2dfbfdad8934744c0ca003e53dd01405b410f38 Mon Sep 17 00:00:00 2001 From: "yusukes@google.com" Date: Thu, 18 Aug 2011 15:47:37 +0000 Subject: Send fake key events before sending a key stroke to a handwriting IME. The dummy events are necessary to keep the internal state of views/ime/input_method_*.cc correct. BUG=None (internal bug only) TEST=see the bug Review URL: http://codereview.chromium.org/7600015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97316 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/extensions/extension_input_api.cc | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'chrome/browser/extensions/extension_input_api.cc') 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; -- cgit v1.1