| Index: content/renderer/render_view.cc | 
| =================================================================== | 
| --- content/renderer/render_view.cc	(revision 103683) | 
| +++ content/renderer/render_view.cc	(working copy) | 
| @@ -323,6 +323,9 @@ | 
| cached_has_main_frame_horizontal_scrollbar_(false), | 
| cached_has_main_frame_vertical_scrollbar_(false), | 
| ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)), | 
| +#if defined(OS_WIN) | 
| +      focused_plugin_id_(-1), | 
| +#endif | 
| ALLOW_THIS_IN_INITIALIZER_LIST(cookie_jar_(this)), | 
| geolocation_dispatcher_(NULL), | 
| speech_input_dispatcher_(NULL), | 
| @@ -4037,6 +4040,32 @@ | 
| // TODO(kinaba) This temporal remedy can be removed after PPAPI is extended | 
| // with an IME handling interface. | 
| if (!pepper_delegate_.IsPluginFocused()) { | 
| +#if defined(OS_WIN) | 
| +    // When a plug-in has focus, we create platform-specific IME data used by | 
| +    // our IME emulator and send it directly to the focused plug-in, i.e. we | 
| +    // bypass WebKit. (WebPluginDelegate dispatches this IME data only when its | 
| +    // instance ID is the same one as the specified ID.) | 
| +    if (focused_plugin_id_ >= 0) { | 
| +      std::vector<int> clauses; | 
| +      std::vector<int> target; | 
| +      for (size_t i = 0; i < underlines.size(); ++i) { | 
| +        clauses.push_back(underlines[i].startOffset); | 
| +        clauses.push_back(underlines[i].endOffset); | 
| +        if (underlines[i].thick) { | 
| +          target.clear(); | 
| +          target.push_back(underlines[i].startOffset); | 
| +          target.push_back(underlines[i].endOffset); | 
| +        } | 
| +      } | 
| +      std::set<WebPluginDelegateProxy*>::iterator it; | 
| +      for (it = plugin_delegates_.begin(); | 
| +           it != plugin_delegates_.end(); ++it) { | 
| +        (*it)->ImeCompositionUpdated(text, clauses, target, selection_end, | 
| +                                     focused_plugin_id_); | 
| +      } | 
| +      return; | 
| +    } | 
| +#endif | 
| RenderWidget::OnImeSetComposition(text, | 
| underlines, | 
| selection_start, | 
| @@ -4061,6 +4090,19 @@ | 
| webwidget_->handleInputEvent(char_event); | 
| } | 
| } else { | 
| +#if defined(OS_WIN) | 
| +    // Same as OnImeSetComposition(), we send the text from IMEs directly to | 
| +    // plug-ins. When we send IME text directly to plug-ins, we should not send | 
| +    // it to WebKit to prevent WebKit from controlling IMEs. | 
| +    if (focused_plugin_id_ >= 0) { | 
| +      std::set<WebPluginDelegateProxy*>::iterator it; | 
| +      for (it = plugin_delegates_.begin(); | 
| +           it != plugin_delegates_.end(); ++it) { | 
| +        (*it)->ImeCompositionCompleted(text, focused_plugin_id_); | 
| +      } | 
| +      return; | 
| +    } | 
| +#endif | 
| RenderWidget::OnImeConfirmComposition(text); | 
| } | 
| } | 
| @@ -4091,6 +4133,15 @@ | 
| return true; | 
| } | 
|  | 
| +#if defined(OS_WIN) | 
| +void RenderView::PluginFocusChanged(bool focused, int plugin_id) { | 
| +  if (focused) | 
| +    focused_plugin_id_ = plugin_id; | 
| +  else | 
| +    focused_plugin_id_ = -1; | 
| +} | 
| +#endif | 
| + | 
| #if defined(OS_MACOSX) | 
| void RenderView::PluginFocusChanged(bool focused, int plugin_id) { | 
| IPC::Message* msg = new ViewHostMsg_PluginFocusChanged(routing_id(), | 
|  |