Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Unified Diff: chrome/browser/autocomplete/autocomplete_edit_view_win.cc

Issue 155546: Merge 20395 - Fix a crash when clicking a popup entry while composing in the ... (Closed) Base URL: svn://chrome-svn/chrome/branches/193/src/
Patch Set: Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/autocomplete/autocomplete_edit_view_win.cc
===================================================================
--- chrome/browser/autocomplete/autocomplete_edit_view_win.cc (revision 20692)
+++ chrome/browser/autocomplete/autocomplete_edit_view_win.cc (working copy)
@@ -417,6 +417,7 @@
tracking_double_click_(false),
double_click_time_(0),
can_discard_mousemove_(false),
+ ignore_ime_messages_(false),
font_(font),
possible_drag_(false),
in_drag_(false),
@@ -634,8 +635,15 @@
// control. To avoid this, we force the IME to cancel any outstanding
// compositions here. This is harmless in Vista and in cases where the IME
// isn't composing.
+
+ // NOTE: We MUST ignore messages like WM_IME_COMPOSITION that may be sent as
+ // a result of doing this. Until the SetWindowText() call below, the
+ // underlying edit (on XP) has out-of-date text in it; for problems this can
+ // cause, see OnImeComposition().
+ ignore_ime_messages_ = true;
ImmNotifyIME(imm_context, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
ImmReleaseContext(m_hWnd, imm_context);
+ ignore_ime_messages_ = false;
}
SetWindowText(text.c_str());
@@ -1225,6 +1233,17 @@
LRESULT AutocompleteEditViewWin::OnImeComposition(UINT message,
WPARAM wparam,
LPARAM lparam) {
+ if (ignore_ime_messages_) {
+ // This message was sent while we're in the middle of meddling with the
+ // underlying edit control. If we handle it below, OnAfterPossibleChange()
+ // can get bogus text for the edit, and rerun autocomplete, destructively
+ // modifying the result set that we're in the midst of using. For example,
+ // if SetWindowTextAndCaretPos() was called due to the user clicking an
+ // entry in the popup, we're in the middle of executing SetSelectedLine(),
+ // and changing the results can cause checkfailures.
+ return DefWindowProc(message, wparam, lparam);
+ }
+
ScopedFreeze freeze(this, GetTextObjectModel());
OnBeforePossibleChange();
LRESULT result = DefWindowProc(message, wparam, lparam);
@@ -1244,7 +1263,9 @@
LRESULT AutocompleteEditViewWin::OnImeNotify(UINT message,
WPARAM wparam,
LPARAM lparam) {
- if (wparam == IMN_SETOPENSTATUS) {
+ // NOTE: I'm not sure this is ever reached with |ignore_ime_messages_| set,
+ // but if it is, the safe thing to do is to only call DefWindowProc().
+ if (!ignore_ime_messages_ && (wparam == IMN_SETOPENSTATUS)) {
// A user has activated (or deactivated) IMEs (but not started a
// composition).
// Some IMEs get confused when we accept keywords while they are composing
Property changes on: chrome\browser\autocomplete\autocomplete_edit_view_win.cc
___________________________________________________________________
Added: svn:mergeinfo
Merged /branches/chrome_webkit_merge_branch/chrome/browser/autocomplete/autocomplete_edit_view_win.cc:r69-2775
Merged /trunk/src/chrome/browser/autocomplete/autocomplete_edit_view_win.cc:r20395
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698