Index: content/browser/renderer_host/render_widget_host_view_win.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc |
index def1d5827b2c6c912a05ff41611e458682ca2982..be054a616e0d517898317fcabd3c4c027dad4a70 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_win.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc |
@@ -476,6 +476,7 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) |
weak_factory_(this), |
is_loading_(false), |
text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
+ can_compose_inline_(true), |
is_fullscreen_(false), |
ignore_mouse_movement_(true), |
composition_range_(ui::Range::InvalidRange()), |
@@ -762,12 +763,10 @@ void RenderWidgetHostViewWin::SetIsLoading(bool is_loading) { |
void RenderWidgetHostViewWin::TextInputStateChanged( |
const ViewHostMsg_TextInputState_Params& params) { |
- // TODO(kinaba): currently, can_compose_inline is ignored and always treated |
- // as true. We need to support "can_compose_inline=false" for PPAPI plugins |
- // that may want to avoid drawing composition-text by themselves and pass |
- // the responsibility to the browser. |
- if (text_input_type_ != params.type) { |
+ if (text_input_type_ != params.type |
+ || can_compose_inline_ != params.can_compose_inline) { |
sky
2012/09/25 15:46:18
|| on previous line.
kinaba
2012/09/26 01:59:53
Done.
|
text_input_type_ = params.type; |
+ can_compose_inline_ = params.can_compose_inline; |
UpdateIMEState(); |
} |
} |
@@ -1672,10 +1671,12 @@ LRESULT RenderWidgetHostViewWin::OnImeStartComposition( |
// Reset the composition status and create IME windows. |
ime_input_.CreateImeWindow(m_hWnd); |
ime_input_.ResetComposition(m_hWnd); |
- // We have to prevent WTL from calling ::DefWindowProc() because the function |
+ // When the focus is on an element that does not draw composition by itself |
+ // (i.e., PPAPI plugin not handling IME), let IME to draw the text. Otherwise |
+ // we have to prevent WTL from calling ::DefWindowProc() because the function |
// calls ::ImmSetCompositionWindow() and ::ImmSetCandidateWindow() to |
// over-write the position of IME windows. |
- handled = TRUE; |
+ handled = (can_compose_inline_ ? TRUE : FALSE); |
return 0; |
} |
@@ -1724,6 +1725,14 @@ LRESULT RenderWidgetHostViewWin::OnImeComposition( |
// We have to prevent WTL from calling ::DefWindowProc() because we do not |
// want for the IMM (Input Method Manager) to send WM_IME_CHAR messages. |
handled = TRUE; |
+ if (!can_compose_inline_) { |
+ // When the focus is on an element that does not draw composition by itself |
+ // (i.e., PPAPI plugin not handling IME), let IME to draw the text, which |
+ // is the default behavior of DefWindowProc. Note, however, even in this |
+ // case we don't want GCS_RESULTSTR to be converted to WM_IME_CHAR messages. |
+ // Thus we explicitly drop the flag. |
+ return ::DefWindowProc(m_hWnd, message, wparam, lparam & ~GCS_RESULTSTR); |
+ } |
return 0; |
} |
@@ -3073,6 +3082,7 @@ void RenderWidgetHostViewWin::UpdateIMEState() { |
if (text_input_type_ != ui::TEXT_INPUT_TYPE_NONE && |
text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD) { |
ime_input_.EnableIME(m_hWnd); |
+ ime_input_.SetUseCompositionWindow(!can_compose_inline_); |
} else { |
ime_input_.DisableIME(m_hWnd); |
} |