OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 "ash/common/shelf/shelf_tooltip_manager.h" | |
6 | |
7 #include "ash/common/shelf/app_list_button.h" | |
8 #include "ash/common/shelf/shelf_model.h" | |
9 #include "ash/common/shelf/shelf_view.h" | |
10 #include "ash/common/shelf/wm_shelf.h" | |
11 #include "ash/common/test/test_shelf_item_delegate.h" | |
12 #include "ash/common/wm_shell.h" | |
13 #include "ash/test/ash_test_base.h" | |
14 #include "ash/test/shelf_view_test_api.h" | |
15 #include "base/memory/ptr_util.h" | |
16 #include "ui/events/event_constants.h" | |
17 #include "ui/events/test/event_generator.h" | |
18 #include "ui/views/bubble/bubble_dialog_delegate.h" | |
19 #include "ui/views/widget/widget.h" | |
20 | |
21 namespace ash { | |
22 namespace test { | |
23 | |
24 class ShelfTooltipManagerTest : public AshTestBase { | |
25 public: | |
26 ShelfTooltipManagerTest() {} | |
27 ~ShelfTooltipManagerTest() override {} | |
28 | |
29 void SetUp() override { | |
30 AshTestBase::SetUp(); | |
31 shelf_view_ = GetPrimaryShelf()->GetShelfViewForTesting(); | |
32 tooltip_manager_ = test::ShelfViewTestAPI(shelf_view_).tooltip_manager(); | |
33 tooltip_manager_->set_timer_delay_for_test(0); | |
34 } | |
35 | |
36 bool IsTimerRunning() { return tooltip_manager_->timer_.IsRunning(); } | |
37 views::Widget* GetTooltip() { return tooltip_manager_->bubble_->GetWidget(); } | |
38 | |
39 std::unique_ptr<views::Widget> CreateTestWidget() { | |
40 std::unique_ptr<views::Widget> widget = base::MakeUnique<views::Widget>(); | |
41 views::Widget::InitParams params; | |
42 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | |
43 params.context = CurrentContext(); | |
44 widget->Init(params); | |
45 widget->Show(); | |
46 return widget; | |
47 } | |
48 | |
49 protected: | |
50 ShelfView* shelf_view_; | |
51 ShelfTooltipManager* tooltip_manager_; | |
52 | |
53 private: | |
54 DISALLOW_COPY_AND_ASSIGN(ShelfTooltipManagerTest); | |
55 }; | |
56 | |
57 TEST_F(ShelfTooltipManagerTest, ShowTooltip) { | |
58 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
59 EXPECT_TRUE(tooltip_manager_->IsVisible()); | |
60 EXPECT_FALSE(IsTimerRunning()); | |
61 } | |
62 | |
63 TEST_F(ShelfTooltipManagerTest, ShowTooltipWithDelay) { | |
64 // ShowTooltipWithDelay should start the timer instead of showing immediately. | |
65 tooltip_manager_->ShowTooltipWithDelay(shelf_view_->GetAppListButton()); | |
66 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
67 EXPECT_TRUE(IsTimerRunning()); | |
68 // TODO: Test that the delayed tooltip is shown, without flaky failures. | |
69 } | |
70 | |
71 TEST_F(ShelfTooltipManagerTest, DoNotShowForInvalidView) { | |
72 // The manager should not show or start the timer for a null view. | |
73 tooltip_manager_->ShowTooltip(nullptr); | |
74 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
75 tooltip_manager_->ShowTooltipWithDelay(nullptr); | |
76 EXPECT_FALSE(IsTimerRunning()); | |
77 | |
78 // The manager should not show or start the timer for a non-shelf view. | |
79 views::View view; | |
80 tooltip_manager_->ShowTooltip(&view); | |
81 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
82 tooltip_manager_->ShowTooltipWithDelay(&view); | |
83 EXPECT_FALSE(IsTimerRunning()); | |
84 | |
85 // The manager should start the timer for a view on the shelf. | |
86 ShelfModel* model = shelf_view_->model(); | |
87 ShelfItem item; | |
88 item.type = TYPE_APP_SHORTCUT; | |
89 const int index = model->Add(item); | |
90 const ShelfID id = model->items()[index].id; | |
91 model->SetShelfItemDelegate(id, | |
92 base::MakeUnique<TestShelfItemDelegate>(nullptr)); | |
93 // Note: There's no easy way to correlate shelf a model index/id to its view. | |
94 tooltip_manager_->ShowTooltipWithDelay( | |
95 shelf_view_->child_at(shelf_view_->child_count() - 1)); | |
96 EXPECT_TRUE(IsTimerRunning()); | |
97 | |
98 // Removing the view won't stop the timer, but the tooltip shouldn't be shown. | |
99 model->RemoveItemAt(index); | |
100 EXPECT_TRUE(IsTimerRunning()); | |
101 RunAllPendingInMessageLoop(); | |
102 EXPECT_FALSE(IsTimerRunning()); | |
103 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
104 } | |
105 | |
106 TEST_F(ShelfTooltipManagerTest, HideWhenShelfIsHidden) { | |
107 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
108 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
109 | |
110 // Create a full-screen window to hide the shelf. | |
111 std::unique_ptr<views::Widget> widget = CreateTestWidget(); | |
112 widget->SetFullscreen(true); | |
113 | |
114 // Once the shelf is hidden, the tooltip should be invisible. | |
115 ASSERT_EQ(SHELF_HIDDEN, GetPrimaryShelf()->GetVisibilityState()); | |
116 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
117 | |
118 // Do not show the view if the shelf is hidden. | |
119 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
120 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
121 | |
122 // ShowTooltipWithDelay doesn't even start the timer for the hidden shelf. | |
123 tooltip_manager_->ShowTooltipWithDelay(shelf_view_->GetAppListButton()); | |
124 EXPECT_FALSE(IsTimerRunning()); | |
125 } | |
126 | |
127 TEST_F(ShelfTooltipManagerTest, HideWhenShelfIsAutoHideHidden) { | |
128 // Create a visible window so auto-hide behavior can actually hide the shelf. | |
129 std::unique_ptr<views::Widget> widget = CreateTestWidget(); | |
130 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
131 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
132 | |
133 GetPrimaryShelf()->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); | |
134 GetPrimaryShelf()->UpdateAutoHideState(); | |
135 ASSERT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, | |
136 GetPrimaryShelf()->auto_hide_behavior()); | |
137 ASSERT_EQ(SHELF_AUTO_HIDE_HIDDEN, GetPrimaryShelf()->GetAutoHideState()); | |
138 | |
139 // Tooltip visibility change for auto hide may take time. | |
140 EXPECT_TRUE(tooltip_manager_->IsVisible()); | |
141 RunAllPendingInMessageLoop(); | |
142 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
143 | |
144 // Do not show the view if the shelf is hidden. | |
145 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
146 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
147 | |
148 // ShowTooltipWithDelay doesn't even run the timer for the hidden shelf. | |
149 tooltip_manager_->ShowTooltipWithDelay(shelf_view_->GetAppListButton()); | |
150 EXPECT_FALSE(IsTimerRunning()); | |
151 | |
152 // Close the window to show the auto-hide shelf; tooltips should now show. | |
153 widget.reset(); | |
154 GetPrimaryShelf()->UpdateAutoHideState(); | |
155 ASSERT_EQ(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS, | |
156 GetPrimaryShelf()->auto_hide_behavior()); | |
157 ASSERT_EQ(SHELF_AUTO_HIDE_SHOWN, GetPrimaryShelf()->GetAutoHideState()); | |
158 | |
159 // The tooltip should show for an auto-hide-shown shelf. | |
160 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
161 EXPECT_TRUE(tooltip_manager_->IsVisible()); | |
162 | |
163 // ShowTooltipWithDelay should run the timer for an auto-hide-shown shelf. | |
164 tooltip_manager_->ShowTooltipWithDelay(shelf_view_->GetAppListButton()); | |
165 EXPECT_TRUE(IsTimerRunning()); | |
166 } | |
167 | |
168 TEST_F(ShelfTooltipManagerTest, HideForEvents) { | |
169 // TODO: investigate failure in mash. http://crbug.com/695563. | |
170 if (WmShell::Get()->IsRunningInMash()) | |
171 return; | |
172 | |
173 ui::test::EventGenerator& generator = GetEventGenerator(); | |
174 gfx::Rect shelf_bounds = shelf_view_->GetBoundsInScreen(); | |
175 | |
176 // Should hide if the mouse exits the shelf area. | |
177 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
178 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
179 generator.MoveMouseTo(shelf_bounds.CenterPoint()); | |
180 generator.SendMouseExit(); | |
181 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
182 | |
183 // Should hide if the mouse is pressed in the shelf area. | |
184 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
185 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
186 generator.MoveMouseTo(shelf_bounds.CenterPoint()); | |
187 generator.PressLeftButton(); | |
188 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
189 | |
190 // Should hide for touch events in the shelf. | |
191 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
192 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
193 generator.set_current_location(shelf_bounds.CenterPoint()); | |
194 generator.PressTouch(); | |
195 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
196 | |
197 // Should hide for gesture events in the shelf. | |
198 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
199 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
200 generator.GestureTapDownAndUp(shelf_bounds.CenterPoint()); | |
201 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
202 } | |
203 | |
204 TEST_F(ShelfTooltipManagerTest, HideForExternalEvents) { | |
205 // TODO: investigate failure in mash. http://crbug.com/695563. | |
206 if (WmShell::Get()->IsRunningInMash()) | |
207 return; | |
208 | |
209 ui::test::EventGenerator& generator = GetEventGenerator(); | |
210 | |
211 // Should hide for touches outside the shelf. | |
212 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
213 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
214 generator.set_current_location(gfx::Point()); | |
215 generator.PressTouch(); | |
216 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
217 generator.ReleaseTouch(); | |
218 | |
219 // Should hide for touch events on the tooltip. | |
220 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
221 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
222 generator.set_current_location( | |
223 GetTooltip()->GetWindowBoundsInScreen().CenterPoint()); | |
224 generator.PressTouch(); | |
225 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
226 generator.ReleaseTouch(); | |
227 | |
228 // Should hide for gestures outside the shelf. | |
229 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
230 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
231 generator.GestureTapDownAndUp(gfx::Point()); | |
232 EXPECT_FALSE(tooltip_manager_->IsVisible()); | |
233 } | |
234 | |
235 TEST_F(ShelfTooltipManagerTest, DoNotHideForKeyEvents) { | |
236 ui::test::EventGenerator& generator = GetEventGenerator(); | |
237 | |
238 // Should not hide for key events. | |
239 tooltip_manager_->ShowTooltip(shelf_view_->GetAppListButton()); | |
240 ASSERT_TRUE(tooltip_manager_->IsVisible()); | |
241 generator.PressKey(ui::VKEY_A, ui::EF_NONE); | |
242 EXPECT_TRUE(tooltip_manager_->IsVisible()); | |
243 } | |
244 | |
245 } // namespace test | |
246 } // namespace ash | |
OLD | NEW |