| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/keyboard/keyboard_controller.h" |
| 6 |
| 5 #include "base/bind.h" | 7 #include "base/bind.h" |
| 6 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 7 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/aura/client/focus_client.h" | 12 #include "ui/aura/client/focus_client.h" |
| 11 #include "ui/aura/layout_manager.h" | 13 #include "ui/aura/layout_manager.h" |
| 12 #include "ui/aura/test/aura_test_helper.h" | 14 #include "ui/aura/test/aura_test_helper.h" |
| 13 #include "ui/aura/test/event_generator.h" | 15 #include "ui/aura/test/event_generator.h" |
| 14 #include "ui/aura/test/test_window_delegate.h" | 16 #include "ui/aura/test/test_window_delegate.h" |
| 15 #include "ui/aura/window.h" | 17 #include "ui/aura/window.h" |
| 16 #include "ui/aura/window_event_dispatcher.h" | 18 #include "ui/aura/window_event_dispatcher.h" |
| 17 #include "ui/base/ime/dummy_text_input_client.h" | 19 #include "ui/base/ime/dummy_text_input_client.h" |
| 18 #include "ui/base/ime/input_method.h" | 20 #include "ui/base/ime/input_method.h" |
| 19 #include "ui/base/ime/input_method_factory.h" | 21 #include "ui/base/ime/input_method_factory.h" |
| 20 #include "ui/base/ime/text_input_client.h" | 22 #include "ui/base/ime/text_input_client.h" |
| 23 #include "ui/base/ime/text_input_focus_manager.h" |
| 24 #include "ui/base/ui_base_switches_util.h" |
| 21 #include "ui/compositor/compositor.h" | 25 #include "ui/compositor/compositor.h" |
| 22 #include "ui/compositor/layer_type.h" | 26 #include "ui/compositor/layer_type.h" |
| 23 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 27 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
| 24 #include "ui/compositor/test/context_factories_for_test.h" | 28 #include "ui/compositor/test/context_factories_for_test.h" |
| 25 #include "ui/compositor/test/layer_animator_test_controller.h" | 29 #include "ui/compositor/test/layer_animator_test_controller.h" |
| 26 #include "ui/gfx/rect.h" | 30 #include "ui/gfx/geometry/rect.h" |
| 27 #include "ui/keyboard/keyboard_controller.h" | |
| 28 #include "ui/keyboard/keyboard_controller_observer.h" | 31 #include "ui/keyboard/keyboard_controller_observer.h" |
| 29 #include "ui/keyboard/keyboard_controller_proxy.h" | 32 #include "ui/keyboard/keyboard_controller_proxy.h" |
| 30 #include "ui/keyboard/keyboard_switches.h" | 33 #include "ui/keyboard/keyboard_switches.h" |
| 31 #include "ui/keyboard/keyboard_util.h" | 34 #include "ui/keyboard/keyboard_util.h" |
| 32 #include "ui/wm/core/default_activation_client.h" | 35 #include "ui/wm/core/default_activation_client.h" |
| 33 | 36 |
| 34 namespace keyboard { | 37 namespace keyboard { |
| 35 namespace { | 38 namespace { |
| 36 | 39 |
| 37 // Steps a layer animation until it is completed. Animations must be enabled. | 40 // Steps a layer animation until it is completed. Animations must be enabled. |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 virtual void SetUp() OVERRIDE { | 169 virtual void SetUp() OVERRIDE { |
| 167 // The ContextFactory must exist before any Compositors are created. | 170 // The ContextFactory must exist before any Compositors are created. |
| 168 bool enable_pixel_output = false; | 171 bool enable_pixel_output = false; |
| 169 ui::ContextFactory* context_factory = | 172 ui::ContextFactory* context_factory = |
| 170 ui::InitializeContextFactoryForTests(enable_pixel_output); | 173 ui::InitializeContextFactoryForTests(enable_pixel_output); |
| 171 | 174 |
| 172 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_)); | 175 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_)); |
| 173 aura_test_helper_->SetUp(context_factory); | 176 aura_test_helper_->SetUp(context_factory); |
| 174 new wm::DefaultActivationClient(aura_test_helper_->root_window()); | 177 new wm::DefaultActivationClient(aura_test_helper_->root_window()); |
| 175 ui::SetUpInputMethodFactoryForTesting(); | 178 ui::SetUpInputMethodFactoryForTesting(); |
| 179 if (::switches::IsTextInputFocusManagerEnabled()) |
| 180 ui::TextInputFocusManager::GetInstance()->FocusTextInputClient(NULL); |
| 176 focus_controller_.reset(new TestFocusController(root_window())); | 181 focus_controller_.reset(new TestFocusController(root_window())); |
| 177 proxy_ = new TestKeyboardControllerProxy(); | 182 proxy_ = new TestKeyboardControllerProxy(); |
| 178 controller_.reset(new KeyboardController(proxy_)); | 183 controller_.reset(new KeyboardController(proxy_)); |
| 179 } | 184 } |
| 180 | 185 |
| 181 virtual void TearDown() OVERRIDE { | 186 virtual void TearDown() OVERRIDE { |
| 182 controller_.reset(); | 187 controller_.reset(); |
| 183 focus_controller_.reset(); | 188 focus_controller_.reset(); |
| 189 if (::switches::IsTextInputFocusManagerEnabled()) |
| 190 ui::TextInputFocusManager::GetInstance()->FocusTextInputClient(NULL); |
| 184 aura_test_helper_->TearDown(); | 191 aura_test_helper_->TearDown(); |
| 185 ui::TerminateContextFactoryForTests(); | 192 ui::TerminateContextFactoryForTests(); |
| 186 } | 193 } |
| 187 | 194 |
| 188 aura::Window* root_window() { return aura_test_helper_->root_window(); } | 195 aura::Window* root_window() { return aura_test_helper_->root_window(); } |
| 189 KeyboardControllerProxy* proxy() { return proxy_; } | 196 KeyboardControllerProxy* proxy() { return proxy_; } |
| 190 KeyboardController* controller() { return controller_.get(); } | 197 KeyboardController* controller() { return controller_.get(); } |
| 191 | 198 |
| 192 void ShowKeyboard() { | 199 void ShowKeyboard() { |
| 193 test_text_input_client_.reset( | 200 test_text_input_client_.reset( |
| 194 new ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT)); | 201 new ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT)); |
| 195 SetFocus(test_text_input_client_.get()); | 202 SetFocus(test_text_input_client_.get()); |
| 196 } | 203 } |
| 197 | 204 |
| 198 protected: | 205 protected: |
| 199 void SetFocus(ui::TextInputClient* client) { | 206 void SetFocus(ui::TextInputClient* client) { |
| 200 ui::InputMethod* input_method = proxy()->GetInputMethod(); | 207 ui::InputMethod* input_method = proxy()->GetInputMethod(); |
| 201 input_method->SetFocusedTextInputClient(client); | 208 if (::switches::IsTextInputFocusManagerEnabled()) { |
| 209 ui::TextInputFocusManager::GetInstance()->FocusTextInputClient(client); |
| 210 input_method->OnTextInputTypeChanged(client); |
| 211 } else { |
| 212 input_method->SetFocusedTextInputClient(client); |
| 213 } |
| 202 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { | 214 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { |
| 203 input_method->ShowImeIfNeeded(); | 215 input_method->ShowImeIfNeeded(); |
| 204 if (proxy_->GetKeyboardWindow()->bounds().height() == 0) { | 216 if (proxy_->GetKeyboardWindow()->bounds().height() == 0) { |
| 205 // Set initial bounds for test keyboard window. | 217 // Set initial bounds for test keyboard window. |
| 206 proxy_->GetKeyboardWindow()->SetBounds( | 218 proxy_->GetKeyboardWindow()->SetBounds( |
| 207 KeyboardBoundsFromWindowBounds( | 219 KeyboardBoundsFromWindowBounds( |
| 208 controller()->GetContainerWindow()->bounds(), 100)); | 220 controller()->GetContainerWindow()->bounds(), 100)); |
| 209 } | 221 } |
| 210 } | 222 } |
| 211 } | 223 } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 | 332 |
| 321 // Make sure hit testing works correctly while the keyboard is visible. | 333 // Make sure hit testing works correctly while the keyboard is visible. |
| 322 aura::Window* keyboard_window = proxy()->GetKeyboardWindow(); | 334 aura::Window* keyboard_window = proxy()->GetKeyboardWindow(); |
| 323 ui::EventTarget* root = root_window(); | 335 ui::EventTarget* root = root_window(); |
| 324 ui::EventTargeter* targeter = root->GetEventTargeter(); | 336 ui::EventTargeter* targeter = root->GetEventTargeter(); |
| 325 gfx::Point location = keyboard_window->bounds().CenterPoint(); | 337 gfx::Point location = keyboard_window->bounds().CenterPoint(); |
| 326 ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, location, location, ui::EF_NONE, | 338 ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, location, location, ui::EF_NONE, |
| 327 ui::EF_NONE); | 339 ui::EF_NONE); |
| 328 EXPECT_EQ(keyboard_window, targeter->FindTargetForEvent(root, &mouse1)); | 340 EXPECT_EQ(keyboard_window, targeter->FindTargetForEvent(root, &mouse1)); |
| 329 | 341 |
| 330 | |
| 331 location.set_y(keyboard_window->bounds().y() - 5); | 342 location.set_y(keyboard_window->bounds().y() - 5); |
| 332 ui::MouseEvent mouse2(ui::ET_MOUSE_MOVED, location, location, ui::EF_NONE, | 343 ui::MouseEvent mouse2(ui::ET_MOUSE_MOVED, location, location, ui::EF_NONE, |
| 333 ui::EF_NONE); | 344 ui::EF_NONE); |
| 334 EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root, &mouse2)); | 345 EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root, &mouse2)); |
| 335 } | 346 } |
| 336 | 347 |
| 337 TEST_F(KeyboardControllerTest, VisibilityChangeWithTextInputTypeChange) { | 348 TEST_F(KeyboardControllerTest, VisibilityChangeWithTextInputTypeChange) { |
| 338 const gfx::Rect& root_bounds = root_window()->bounds(); | 349 const gfx::Rect& root_bounds = root_window()->bounds(); |
| 339 | 350 |
| 340 ui::DummyTextInputClient input_client_0(ui::TEXT_INPUT_TYPE_TEXT); | 351 ui::DummyTextInputClient input_client_0(ui::TEXT_INPUT_TYPE_TEXT); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 SetFocus(&input_client); | 564 SetFocus(&input_client); |
| 554 EXPECT_TRUE(keyboard_container->IsVisible()); | 565 EXPECT_TRUE(keyboard_container->IsVisible()); |
| 555 | 566 |
| 556 SetFocus(&no_input_client); | 567 SetFocus(&no_input_client); |
| 557 // Keyboard should not hide itself after lost focus. | 568 // Keyboard should not hide itself after lost focus. |
| 558 EXPECT_TRUE(keyboard_container->IsVisible()); | 569 EXPECT_TRUE(keyboard_container->IsVisible()); |
| 559 EXPECT_FALSE(WillHideKeyboard()); | 570 EXPECT_FALSE(WillHideKeyboard()); |
| 560 } | 571 } |
| 561 | 572 |
| 562 } // namespace keyboard | 573 } // namespace keyboard |
| OLD | NEW |