OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/ash/ash_keyboard_controller_proxy.h" | |
6 | |
7 #include "ash/shell.h" | |
8 #include "ash/test/ash_test_base.h" | |
9 #include "ui/aura/test/test_window_delegate.h" | |
10 #include "ui/aura/window.h" | |
11 #include "ui/base/ime/input_method.h" | |
12 #include "ui/base/ime/input_method_factory.h" | |
13 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | |
14 #include "ui/compositor/test/layer_animator_test_controller.h" | |
15 #include "ui/keyboard/keyboard_controller.h" | |
16 | |
17 namespace { | |
18 | |
19 // Steps a layer animation until it is completed. Animations must be enabled. | |
20 void RunAnimationForLayer(ui::Layer* layer) { | |
21 // Animations must be enabled for stepping to work. | |
22 ASSERT_NE(ui::ScopedAnimationDurationScaleMode::duration_scale_mode(), | |
23 ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); | |
24 | |
25 ui::LayerAnimatorTestController controller(layer->GetAnimator()); | |
26 gfx::AnimationContainerElement* element = layer->GetAnimator(); | |
27 // Multiple steps are required to complete complex animations. | |
28 // TODO(vollick): This should not be necessary. crbug.com/154017 | |
29 while (controller.animator()->is_animating()) { | |
30 controller.StartThreadedAnimationsIfNeeded(); | |
31 base::TimeTicks step_time = controller.animator()->last_step_time(); | |
32 element->Step(step_time + base::TimeDelta::FromMilliseconds(1000)); | |
33 } | |
34 } | |
35 | |
36 } // namespace | |
37 | |
38 class TestAshKeyboardControllerProxy : public AshKeyboardControllerProxy { | |
39 public: | |
40 TestAshKeyboardControllerProxy() | |
41 : window_(new aura::Window(&delegate_)), | |
42 input_method_(ui::CreateInputMethod(NULL, | |
43 gfx::kNullAcceleratedWidget)) { | |
44 window_->Init(aura::WINDOW_LAYER_NOT_DRAWN); | |
45 window_->set_owned_by_parent(false); | |
46 } | |
47 | |
48 virtual ~TestAshKeyboardControllerProxy() { | |
49 window_.reset(); | |
50 } | |
51 | |
52 // Overridden from AshKeyboardControllerProxy: | |
53 virtual aura::Window* GetKeyboardWindow() OVERRIDE { return window_.get(); } | |
54 virtual content::BrowserContext* GetBrowserContext() OVERRIDE { return NULL; } | |
55 virtual ui::InputMethod* GetInputMethod() OVERRIDE { | |
56 return input_method_.get(); | |
57 } | |
58 virtual void RequestAudioInput(content::WebContents* web_contents, | |
59 const content::MediaStreamRequest& request, | |
60 const content::MediaResponseCallback& callback) OVERRIDE {} | |
61 | |
62 private: | |
63 scoped_ptr<aura::Window> window_; | |
64 aura::test::TestWindowDelegate delegate_; | |
65 scoped_ptr<ui::InputMethod> input_method_; | |
66 | |
67 DISALLOW_COPY_AND_ASSIGN(TestAshKeyboardControllerProxy); | |
68 }; | |
69 | |
70 class AshKeyboardControllerProxyTest : public ash::test::AshTestBase { | |
71 public: | |
72 AshKeyboardControllerProxyTest() {} | |
73 | |
74 virtual ~AshKeyboardControllerProxyTest() {} | |
75 | |
76 // AshTestBase: | |
77 virtual void SetUp() OVERRIDE; | |
78 virtual void TearDown() OVERRIDE; | |
79 | |
80 TestAshKeyboardControllerProxy* proxy() { return proxy_; } | |
81 keyboard::KeyboardController* controller() { return controller_.get(); } | |
82 | |
83 protected: | |
84 void ShowKeyboard(aura::Window* container); | |
85 void HideKeyboard(aura::Window* container); | |
86 | |
87 TestAshKeyboardControllerProxy* proxy_; | |
88 scoped_ptr<keyboard::KeyboardController> controller_; | |
89 | |
90 private: | |
91 DISALLOW_COPY_AND_ASSIGN(AshKeyboardControllerProxyTest); | |
92 }; | |
93 | |
94 void AshKeyboardControllerProxyTest::SetUp() { | |
95 ui::SetUpInputMethodFactoryForTesting(); | |
96 AshTestBase::SetUp(); | |
97 proxy_ = new TestAshKeyboardControllerProxy(); | |
98 controller_.reset(new keyboard::KeyboardController(proxy_)); | |
99 | |
100 aura::Window* keyboard_container(controller_->GetContainerWindow()); | |
101 keyboard_container->SetBounds(ash::Shell::GetPrimaryRootWindow()->bounds()); | |
102 ash::Shell::GetPrimaryRootWindow()->AddChild(keyboard_container); | |
103 keyboard_container->AddChild(proxy_->GetKeyboardWindow()); | |
104 ASSERT_NE(proxy_->GetKeyboardWindow()->bounds().height(), 0); | |
105 } | |
106 | |
107 void AshKeyboardControllerProxyTest::TearDown() { | |
108 AshTestBase::TearDown(); | |
109 } | |
110 | |
111 void AshKeyboardControllerProxyTest::ShowKeyboard(aura::Window* container) { | |
112 proxy_->ShowKeyboardContainer(container); | |
113 } | |
114 | |
115 void AshKeyboardControllerProxyTest::HideKeyboard(aura::Window* container) { | |
116 proxy_->HideKeyboardContainer(container); | |
117 } | |
118 | |
119 TEST_F(AshKeyboardControllerProxyTest, VirtualKeyboardContainerAnimation) { | |
120 // We cannot short-circuit animations for this test. | |
121 ui::ScopedAnimationDurationScaleMode normal_duration_mode( | |
122 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); | |
123 | |
124 aura::Window* keyboard_container(controller()->GetContainerWindow()); | |
125 ui::Layer* layer = keyboard_container->layer(); | |
126 | |
127 EXPECT_FALSE(keyboard_container->IsVisible()); | |
128 ShowKeyboard(keyboard_container); | |
129 | |
130 // Keyboard container and window should immediately become visible before | |
131 // animation starts. | |
132 EXPECT_TRUE(keyboard_container->IsVisible()); | |
133 EXPECT_TRUE(proxy()->GetKeyboardWindow()->IsVisible()); | |
134 EXPECT_EQ(0.0, layer->opacity()); | |
135 gfx::Transform transform; | |
136 transform.Translate(0, proxy()->GetKeyboardWindow()->bounds().height()); | |
137 EXPECT_EQ(transform, layer->transform()); | |
138 | |
139 RunAnimationForLayer(layer); | |
140 EXPECT_TRUE(keyboard_container->IsVisible()); | |
141 EXPECT_TRUE(proxy()->GetKeyboardWindow()->IsVisible()); | |
142 EXPECT_EQ(1.0, layer->opacity()); | |
143 EXPECT_EQ(gfx::Transform(), layer->transform()); | |
144 | |
145 HideKeyboard(keyboard_container); | |
146 // Keyboard container and window should be visible before hide animation | |
147 // finishes. | |
148 EXPECT_TRUE(keyboard_container->IsVisible()); | |
149 EXPECT_TRUE(proxy()->GetKeyboardWindow()->IsVisible()); | |
150 | |
151 RunAnimationForLayer(layer); | |
152 EXPECT_FALSE(keyboard_container->IsVisible()); | |
153 EXPECT_FALSE(proxy()->GetKeyboardWindow()->IsVisible()); | |
154 EXPECT_EQ(0.0, layer->opacity()); | |
155 EXPECT_EQ(transform, layer->transform()); | |
156 } | |
OLD | NEW |