diff options
author | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-17 08:36:34 +0000 |
---|---|---|
committer | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-17 08:36:34 +0000 |
commit | 9f23f59692cd588105bf8813b122e4e5aaa702d1 (patch) | |
tree | 3a86a655cbadaac641a0b47d690b558e49eb9a98 /chrome | |
parent | 01ba8f51513c615c2d54ed3ea8f26d9d8872af59 (diff) | |
download | chromium_src-9f23f59692cd588105bf8813b122e4e5aaa702d1.zip chromium_src-9f23f59692cd588105bf8813b122e4e5aaa702d1.tar.gz chromium_src-9f23f59692cd588105bf8813b122e4e5aaa702d1.tar.bz2 |
A workaround fix for Issue 343 "Chinese Sogou input method lose first initial letter".
This issue is caused by our IME code that does not filter out focus events raised by an IME function of WebKit, WebCore::Editor::setComposition().
Its details are listed below:
1. WebKit sometimes creates a WebCore::EditingText instance and moves the input focus to the instance while updating a composition string in the Editor::setComposition() function;
2. Our IME code automatically finishes the ongoing composition everytime when WebKit moves the input focus to the WebCore::EditingText instance.
As a wordaround for this issue, this change ignores focus events while a renderer process updates a composition string with the Editor::setComposition() function.
Review URL: http://codereview.chromium.org/10827
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5556 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/renderer/render_view.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/render_widget.cc | 8 | ||||
-rw-r--r-- | chrome/renderer/render_widget.h | 1 |
3 files changed, 12 insertions, 3 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 7e812a45..3c041cb 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2210,8 +2210,10 @@ void RenderView::SetInputMethodState(bool enabled) { // Save the updated IME status and mark the input focus has been updated. // The IME status is to be sent to a browser process next time when // the input caret is rendered. - ime_control_updated_ = true; - ime_control_new_state_ = enabled; + if (!ime_control_busy_) { + ime_control_updated_ = true; + ime_control_new_state_ = enabled; + } } void RenderView::ScriptedPrint(WebFrame* frame) { diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index 7f0f7ca..4c00b27 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -90,6 +90,7 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread, ime_control_y_(-1), ime_control_new_state_(false), ime_control_updated_(false), + ime_control_busy_(false), focus_on_show_(focus_on_show) { RenderProcess::AddRefProcess(); DCHECK(render_thread_); @@ -668,9 +669,11 @@ void RenderWidget::OnImeSetComposition(int string_type, int target_start, int target_end, const std::wstring& ime_string) { if (webwidget_) { + ime_control_busy_ = true; webwidget_->ImeSetComposition(string_type, cursor_position, target_start, target_end, ime_string); + ime_control_busy_ = false; } } @@ -705,7 +708,10 @@ void RenderWidget::UpdateIME() { ime_control_updated_ = true; ime_control_new_state_ = false; } - ime_control_new_state_ = enable_ime; + if (ime_control_new_state_ != enable_ime) { + ime_control_updated_ = true; + ime_control_new_state_ = enable_ime; + } if (ime_control_updated_) { // The input focus has been changed. // Compare the current state with the updated state and choose actions. diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h index f69d77e..55e4d7e 100644 --- a/chrome/renderer/render_widget.h +++ b/chrome/renderer/render_widget.h @@ -262,6 +262,7 @@ class RenderWidget : public IPC::Channel::Listener, int ime_control_y_; bool ime_control_new_state_; bool ime_control_updated_; + bool ime_control_busy_; // Whether the window for this RenderWidget should be focused when shown. bool focus_on_show_; |