| Index: ui/views/widget/widget.cc
 | 
| diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
 | 
| index a57392053e57788faee01af110c585c0e82ea404..8baea97748786da5de544578ec5bdfe48ab5fea4 100644
 | 
| --- a/ui/views/widget/widget.cc
 | 
| +++ b/ui/views/widget/widget.cc
 | 
| @@ -11,6 +11,7 @@
 | 
|  #include "ui/base/cursor/cursor.h"
 | 
|  #include "ui/base/default_theme_provider.h"
 | 
|  #include "ui/base/hit_test.h"
 | 
| +#include "ui/base/ime/input_method.h"
 | 
|  #include "ui/base/l10n/l10n_font_util.h"
 | 
|  #include "ui/base/resource/resource_bundle.h"
 | 
|  #include "ui/compositor/compositor.h"
 | 
| @@ -24,7 +25,6 @@
 | 
|  #include "ui/views/focus/focus_manager_factory.h"
 | 
|  #include "ui/views/focus/view_storage.h"
 | 
|  #include "ui/views/focus/widget_focus_manager.h"
 | 
| -#include "ui/views/ime/input_method.h"
 | 
|  #include "ui/views/views_delegate.h"
 | 
|  #include "ui/views/widget/native_widget_private.h"
 | 
|  #include "ui/views/widget/root_view.h"
 | 
| @@ -64,6 +64,14 @@ NativeWidget* CreateNativeWidget(NativeWidget* native_widget,
 | 
|    return native_widget;
 | 
|  }
 | 
|  
 | 
| +void NotifyCaretBoundsChanged(ui::InputMethod* input_method) {
 | 
| +  if (!input_method)
 | 
| +    return;
 | 
| +  ui::TextInputClient* client = input_method->GetTextInputClient();
 | 
| +  if (client)
 | 
| +    input_method->OnCaretBoundsChanged(client);
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  // A default implementation of WidgetDelegate, used by Widget when no
 | 
| @@ -764,36 +772,25 @@ const FocusManager* Widget::GetFocusManager() const {
 | 
|  }
 | 
|  
 | 
|  ui::TextInputClient* Widget::GetFocusedTextInputClient() {
 | 
| -  FocusManager* focus_manager = GetFocusManager();
 | 
| -  View* view = focus_manager ? focus_manager->GetFocusedView() : nullptr;
 | 
| -  return view ? view->GetTextInputClient() : nullptr;
 | 
| -}
 | 
| -
 | 
| -InputMethod* Widget::GetInputMethod() {
 | 
| -  return const_cast<InputMethod*>(
 | 
| -      const_cast<const Widget*>(this)->GetInputMethod());
 | 
| +  return nullptr;
 | 
|  }
 | 
|  
 | 
| -const InputMethod* Widget::GetInputMethod() const {
 | 
| +ui::InputMethod* Widget::GetInputMethod() {
 | 
|    if (is_top_level()) {
 | 
| -    if (!input_method_.get())
 | 
| -      input_method_ = const_cast<Widget*>(this)->CreateInputMethod().Pass();
 | 
| -    return input_method_.get();
 | 
| +    // Only creates the shared the input method instance on top level widget.
 | 
| +    return native_widget_private()->GetInputMethod();
 | 
|    } else {
 | 
| -    const Widget* toplevel = GetTopLevelWidget();
 | 
| +    Widget* toplevel = GetTopLevelWidget();
 | 
|      // If GetTopLevelWidget() returns itself which is not toplevel,
 | 
|      // the widget is detached from toplevel widget.
 | 
|      // TODO(oshima): Fix GetTopLevelWidget() to return NULL
 | 
|      // if there is no toplevel. We probably need to add GetTopMostWidget()
 | 
|      // to replace some use cases.
 | 
| -    return (toplevel && toplevel != this) ? toplevel->GetInputMethod() : NULL;
 | 
| +    return (toplevel && toplevel != this) ? toplevel->GetInputMethod()
 | 
| +                                          : nullptr;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -ui::InputMethod* Widget::GetHostInputMethod() {
 | 
| -  return native_widget_private()->GetHostInputMethod();
 | 
| -}
 | 
| -
 | 
|  void Widget::RunShellDrag(View* view,
 | 
|                            const ui::OSExchangeData& data,
 | 
|                            const gfx::Point& location,
 | 
| @@ -1115,12 +1112,8 @@ gfx::Size Widget::GetMaximumSize() const {
 | 
|  
 | 
|  void Widget::OnNativeWidgetMove() {
 | 
|    widget_delegate_->OnWidgetMove();
 | 
| -  View* root = GetRootView();
 | 
| -  if (root && root->GetFocusManager()) {
 | 
| -    View* focused_view = root->GetFocusManager()->GetFocusedView();
 | 
| -    if (focused_view && focused_view->GetInputMethod())
 | 
| -      focused_view->GetInputMethod()->OnCaretBoundsChanged(focused_view);
 | 
| -  }
 | 
| +  NotifyCaretBoundsChanged(GetInputMethod());
 | 
| +
 | 
|    FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged(
 | 
|      this,
 | 
|      GetWindowBoundsInScreen()));
 | 
| @@ -1128,14 +1121,10 @@ void Widget::OnNativeWidgetMove() {
 | 
|  
 | 
|  void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
 | 
|    View* root = GetRootView();
 | 
| -  if (root) {
 | 
| +  if (root)
 | 
|      root->SetSize(new_size);
 | 
| -    if (root->GetFocusManager()) {
 | 
| -      View* focused_view = GetRootView()->GetFocusManager()->GetFocusedView();
 | 
| -      if (focused_view && focused_view->GetInputMethod())
 | 
| -        focused_view->GetInputMethod()->OnCaretBoundsChanged(focused_view);
 | 
| -    }
 | 
| -  }
 | 
| +
 | 
| +  NotifyCaretBoundsChanged(GetInputMethod());
 | 
|    SaveWindowPlacementIfInitialized();
 | 
|  
 | 
|    FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged(
 | 
| @@ -1294,10 +1283,6 @@ bool Widget::ExecuteCommand(int command_id) {
 | 
|    return widget_delegate_->ExecuteWindowsCommand(command_id);
 | 
|  }
 | 
|  
 | 
| -InputMethod* Widget::GetInputMethodDirect() {
 | 
| -  return input_method_.get();
 | 
| -}
 | 
| -
 | 
|  const std::vector<ui::Layer*>& Widget::GetRootLayers() {
 | 
|    if (root_layers_dirty_) {
 | 
|      root_layers_dirty_ = false;
 | 
| @@ -1391,8 +1376,6 @@ internal::RootView* Widget::CreateRootView() {
 | 
|  void Widget::DestroyRootView() {
 | 
|    non_client_view_ = NULL;
 | 
|    root_view_.reset();
 | 
| -  // Input method has to be destroyed before focus manager.
 | 
| -  input_method_.reset();
 | 
|  }
 | 
|  
 | 
|  void Widget::OnDragWillStart() {
 | 
| @@ -1500,19 +1483,6 @@ bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds,
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| -scoped_ptr<InputMethod> Widget::CreateInputMethod() {
 | 
| -  scoped_ptr<InputMethod> input_method(native_widget_->CreateInputMethod());
 | 
| -  if (input_method.get())
 | 
| -    input_method->Init(this);
 | 
| -  return input_method.Pass();
 | 
| -}
 | 
| -
 | 
| -void Widget::ReplaceInputMethod(InputMethod* input_method) {
 | 
| -  input_method_.reset(input_method);
 | 
| -  input_method->SetDelegate(native_widget_->GetInputMethodDelegate());
 | 
| -  input_method->Init(this);
 | 
| -}
 | 
| -
 | 
|  namespace internal {
 | 
|  
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
| 
 |