Index: ui/views/focus/focus_manager.cc |
diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc |
index aba46e079ca754d507900c818265490b2713e6bc..8c3e994c6d07a19e5d41153f21e0fea31cf90565 100644 |
--- a/ui/views/focus/focus_manager.cc |
+++ b/ui/views/focus/focus_manager.cc |
@@ -11,6 +11,10 @@ |
#include "base/logging.h" |
#include "build/build_config.h" |
#include "ui/base/accelerators/accelerator.h" |
+#include "ui/base/ime/input_method.h" |
+#include "ui/base/ime/text_input_client.h" |
+#include "ui/base/ime/text_input_focus_manager.h" |
+#include "ui/base/ui_base_switches_util.h" |
#include "ui/events/event.h" |
#include "ui/events/keycodes/keyboard_codes.h" |
#include "ui/views/focus/focus_manager_delegate.h" |
@@ -117,6 +121,11 @@ bool FocusManager::OnKeyEvent(const ui::KeyEvent& event) { |
return true; |
} |
+void FocusManager::OnTextInputClientChanged(View* view) { |
+ if (view == focused_view_) |
+ FocusTextInputClient(view); |
+} |
+ |
void FocusManager::ValidateFocusedView() { |
if (focused_view_ && !ContainsView(focused_view_)) |
ClearFocus(); |
@@ -321,14 +330,18 @@ void FocusManager::SetFocusedViewWithReason( |
View* old_focused_view = focused_view_; |
focused_view_ = view; |
- if (old_focused_view) |
+ if (old_focused_view) { |
old_focused_view->Blur(); |
+ BlurTextInputClient(old_focused_view); |
+ } |
// Also make |focused_view_| the stored focus view. This way the stored focus |
// view is remembered if focus changes are requested prior to a show or while |
// hidden. |
SetStoredFocusView(focused_view_); |
- if (focused_view_) |
+ if (focused_view_) { |
+ FocusTextInputClient(focused_view_); |
focused_view_->Focus(); |
+ } |
FOR_EACH_OBSERVER(FocusChangeListener, focus_change_listeners_, |
OnDidChangeFocus(old_focused_view, focused_view_)); |
@@ -537,4 +550,39 @@ bool FocusManager::ProcessArrowKeyTraversal(const ui::KeyEvent& event) { |
return false; |
} |
+void FocusManager::FocusTextInputClient(View* view) { |
+ if (!switches::IsTextInputFocusManagerEnabled()) |
+ return; |
+ |
+ // If the widget is not active, do not steal the text input focus. |
+ if (!widget_->IsActive()) |
+ return; |
+ |
+ ui::TextInputClient* text_input_client = |
+ view ? view->GetTextInputClient() : NULL; |
+ ui::TextInputFocusManager::GetInstance()-> |
+ FocusTextInputClient(text_input_client); |
+ ui::InputMethod* input_method = widget_->GetHostInputMethod(); |
+ if (input_method) { |
+ input_method->OnTextInputTypeChanged(text_input_client); |
+ input_method->OnCaretBoundsChanged(text_input_client); |
+ } |
+} |
+ |
+void FocusManager::BlurTextInputClient(View* view) { |
+ if (!switches::IsTextInputFocusManagerEnabled()) |
+ return; |
+ |
+ ui::TextInputClient* text_input_client = |
+ view ? view->GetTextInputClient() : NULL; |
+ if (text_input_client && text_input_client->HasCompositionText()) { |
+ text_input_client->ConfirmCompositionText(); |
+ ui::InputMethod* input_method = widget_->GetHostInputMethod(); |
+ if (input_method && input_method->GetTextInputClient() == text_input_client) |
+ input_method->CancelComposition(text_input_client); |
+ } |
+ ui::TextInputFocusManager::GetInstance()-> |
+ BlurTextInputClient(text_input_client); |
+} |
+ |
} // namespace views |