summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_input_api.cc
diff options
context:
space:
mode:
authoryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-18 15:47:37 +0000
committeryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-18 15:47:37 +0000
commite2dfbfdad8934744c0ca003e53dd01405b410f38 (patch)
treeec3b448bb35b96bb2e675773cbd192d19faa2516 /chrome/browser/extensions/extension_input_api.cc
parent1e1e5df7ce713aaa5c7500203af277f2a60a4dcd (diff)
downloadchromium_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.cc24
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;