Index: ui/keyboard/keyboard_controller.cc |
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc |
index 15d5208801293c8b3994a9dca92583b93784bda7..7326875205f996a97dcdcb157af5b137cff00ee1 100644 |
--- a/ui/keyboard/keyboard_controller.cc |
+++ b/ui/keyboard/keyboard_controller.cc |
@@ -178,13 +178,8 @@ KeyboardController::KeyboardController(KeyboardControllerProxy* proxy) |
} |
KeyboardController::~KeyboardController() { |
- if (container_) { |
+ if (container_) |
container_->RemoveObserver(this); |
- // Remove the keyboard window from the children because the keyboard window |
- // is owned by proxy and it should be destroyed by proxy. |
- if (container_->Contains(proxy_->GetKeyboardWindow())) |
- container_->RemoveChild(proxy_->GetKeyboardWindow()); |
- } |
if (input_method_) |
input_method_->RemoveObserver(this); |
} |
@@ -249,50 +244,15 @@ void KeyboardController::OnTextInputStateChanged( |
if (!container_.get()) |
return; |
- bool was_showing = keyboard_visible_; |
- bool should_show = was_showing; |
- ui::TextInputType type = |
- client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; |
- if (type == ui::TEXT_INPUT_TYPE_NONE && |
- !IsKeyboardUsabilityExperimentEnabled() && |
- !lock_keyboard_) { |
- should_show = false; |
- } else { |
- if (container_->children().empty()) { |
- keyboard::MarkKeyboardLoadStarted(); |
- aura::Window* keyboard = proxy_->GetKeyboardWindow(); |
- keyboard->Show(); |
- container_->AddChild(keyboard); |
- } |
- if (type != ui::TEXT_INPUT_TYPE_NONE) |
- proxy_->SetUpdateInputType(type); |
- container_->parent()->StackChildAtTop(container_.get()); |
- should_show = true; |
+ if (IsKeyboardUsabilityExperimentEnabled()) { |
+ OnShowImeIfNeeded(); |
+ return; |
} |
- if (was_showing != should_show) { |
- if (should_show) { |
- keyboard_visible_ = true; |
- |
- // If the controller is in the process of hiding the keyboard, do not log |
- // the stat here since the keyboard will not actually be shown. |
- if (!WillHideKeyboard()) |
- keyboard::LogKeyboardControlEvent(keyboard::KEYBOARD_CONTROL_SHOW); |
- |
- weak_factory_.InvalidateWeakPtrs(); |
- // If |container_| has hide animation, its visibility is set to false when |
- // hide animation finished. So even if the container is visible at this |
- // point, it may in the process of hiding. We still need to show keyboard |
- // container in this case. |
- if (container_->IsVisible() && |
- !container_->layer()->GetAnimator()->is_animating()) { |
- return; |
- } |
- |
- NotifyKeyboardBoundsChanging(container_->children()[0]->bounds()); |
- |
- proxy_->ShowKeyboardContainer(container_.get()); |
- } else { |
+ ui::TextInputType type = |
+ client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; |
+ if (type == ui::TEXT_INPUT_TYPE_NONE && !lock_keyboard_) { |
+ if (keyboard_visible_) { |
// Set the visibility state here so that any queries for visibility |
// before the timer fires returns the correct future value. |
keyboard_visible_ = false; |
@@ -302,6 +262,18 @@ void KeyboardController::OnTextInputStateChanged( |
weak_factory_.GetWeakPtr(), HIDE_REASON_AUTOMATIC), |
base::TimeDelta::FromMilliseconds(kHideKeyboardDelayMs)); |
} |
+ } else { |
+ // Abort a pending keyboard hide. |
+ if (WillHideKeyboard()) { |
+ weak_factory_.InvalidateWeakPtrs(); |
+ keyboard_visible_ = true; |
+ } |
+ proxy_->SetUpdateInputType(type); |
+ // Do not explicitly show the Virtual keyboard unless it is in the process |
+ // of hiding. Instead, the virtual keyboard is shown in response to a user |
+ // gesture (mouse or touch) that is received while an element has input |
+ // focus. Showing the keyboard requires an explicit call to |
+ // OnShowImeIfNeeded. |
} |
// TODO(bryeung): whenever the TextInputClient changes we need to notify the |
// keyboard (with the TextInputType) so that it can reset it's state (e.g. |
@@ -314,6 +286,43 @@ void KeyboardController::OnInputMethodDestroyed( |
input_method_ = NULL; |
} |
+void KeyboardController::OnShowImeIfNeeded() { |
+ if (!container_.get()) |
+ return; |
+ |
+ if (container_->children().empty()) { |
+ keyboard::MarkKeyboardLoadStarted(); |
+ aura::Window* keyboard = proxy_->GetKeyboardWindow(); |
+ keyboard->Show(); |
+ container_->AddChild(keyboard); |
+ keyboard->set_owned_by_parent(false); |
+ } |
+ if (keyboard_visible_) |
+ return; |
+ |
+ keyboard_visible_ = true; |
+ |
+ // If the controller is in the process of hiding the keyboard, do not log |
+ // the stat here since the keyboard will not actually be shown. |
+ if (!WillHideKeyboard()) |
+ keyboard::LogKeyboardControlEvent(keyboard::KEYBOARD_CONTROL_SHOW); |
+ |
+ weak_factory_.InvalidateWeakPtrs(); |
+ |
+ // If |container_| has hide animation, its visibility is set to false when |
+ // hide animation finished. So even if the container is visible at this |
+ // point, it may in the process of hiding. We still need to show keyboard |
+ // container in this case. |
+ if (container_->IsVisible() && |
+ !container_->layer()->GetAnimator()->is_animating()) { |
+ return; |
+ } |
+ |
+ NotifyKeyboardBoundsChanging(container_->children()[0]->bounds()); |
+ |
+ proxy_->ShowKeyboardContainer(container_.get()); |
+} |
+ |
bool KeyboardController::WillHideKeyboard() const { |
return weak_factory_.HasWeakPtrs(); |
} |