diff options
author | yusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-18 15:47:37 +0000 |
---|---|---|
committer | yusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-18 15:47:37 +0000 |
commit | e2dfbfdad8934744c0ca003e53dd01405b410f38 (patch) | |
tree | ec3b448bb35b96bb2e675773cbd192d19faa2516 /chrome/browser/extensions/extension_input_api.cc | |
parent | 1e1e5df7ce713aaa5c7500203af277f2a60a4dcd (diff) | |
download | chromium_src-e2dfbfdad8934744c0ca003e53dd01405b410f38.zip chromium_src-e2dfbfdad8934744c0ca003e53dd01405b410f38.tar.gz chromium_src-e2dfbfdad8934744c0ca003e53dd01405b410f38.tar.bz2 |
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
Diffstat (limited to 'chrome/browser/extensions/extension_input_api.cc')
-rw-r--r-- | chrome/browser/extensions/extension_input_api.cc | 24 |
1 files changed, 19 insertions, 5 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; |