OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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/launcher/browser_launcher_item_controller.h" | |
6 | |
7 #include <map> | |
8 #include <string> | |
9 | |
10 #include "ash/ash_switches.h" | |
11 #include "ash/launcher/launcher_model.h" | |
12 #include "base/command_line.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "chrome/browser/favicon/favicon_tab_helper.h" | |
15 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" | |
16 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" | |
17 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
18 #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" | |
19 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | |
20 #include "chrome/test/base/testing_profile.h" | |
21 #include "content/public/browser/web_contents.h" | |
22 #include "testing/gtest/include/gtest/gtest.h" | |
23 #include "third_party/skia/include/core/SkBitmap.h" | |
24 #include "ui/aura/client/activation_change_observer.h" | |
25 #include "ui/aura/client/activation_delegate.h" | |
26 #include "ui/aura/client/aura_constants.h" | |
27 #include "ui/aura/root_window.h" | |
28 #include "ui/aura/test/test_activation_client.h" | |
29 #include "ui/aura/test/test_window_delegate.h" | |
30 #include "ui/aura/window.h" | |
31 #include "ui/aura/window_delegate.h" | |
32 #include "ui/base/events/event.h" | |
33 | |
34 // TODO(skuhne): Remove this module together with the | |
35 // browser_launcher_item_controller.* when the old launcher goes away. | |
36 | |
37 namespace { | |
38 | |
39 // Test implementation of AppTabHelper. | |
40 class AppTabHelperImpl : public ChromeLauncherController::AppTabHelper { | |
41 public: | |
42 AppTabHelperImpl() {} | |
43 virtual ~AppTabHelperImpl() {} | |
44 | |
45 // Sets the id for the specified tab. The id is removed if Remove() is | |
46 // invoked. | |
47 void SetAppID(content::WebContents* tab, const std::string& id) { | |
48 tab_id_map_[tab] = id; | |
49 } | |
50 | |
51 // Returns true if there is an id registered for |tab|. | |
52 bool HasAppID(content::WebContents* tab) const { | |
53 return tab_id_map_.find(tab) != tab_id_map_.end(); | |
54 } | |
55 | |
56 // AppTabHelper implementation: | |
57 virtual std::string GetAppID(content::WebContents* tab) OVERRIDE { | |
58 return tab_id_map_.find(tab) != tab_id_map_.end() ? tab_id_map_[tab] : | |
59 std::string(); | |
60 } | |
61 | |
62 virtual bool IsValidID(const std::string& id) OVERRIDE { | |
63 for (TabToStringMap::const_iterator i = tab_id_map_.begin(); | |
64 i != tab_id_map_.end(); ++i) { | |
65 if (i->second == id) | |
66 return true; | |
67 } | |
68 return false; | |
69 } | |
70 | |
71 private: | |
72 typedef std::map<content::WebContents*, std::string> TabToStringMap; | |
73 | |
74 TabToStringMap tab_id_map_; | |
75 | |
76 DISALLOW_COPY_AND_ASSIGN(AppTabHelperImpl); | |
77 }; | |
78 | |
79 // Test implementation of AppIconLoader. | |
80 class AppIconLoaderImpl : public extensions::AppIconLoader { | |
81 public: | |
82 AppIconLoaderImpl() : fetch_count_(0) {} | |
83 virtual ~AppIconLoaderImpl() {} | |
84 | |
85 // Returns the number of times FetchImage() has been invoked and resets the | |
86 // count to 0. | |
87 int GetAndClearFetchCount() { | |
88 int value = fetch_count_; | |
89 fetch_count_ = 0; | |
90 return value; | |
91 } | |
92 | |
93 // AppIconLoader implementation: | |
94 virtual void FetchImage(const std::string& id) OVERRIDE { | |
95 fetch_count_++; | |
96 } | |
97 virtual void ClearImage(const std::string& id) OVERRIDE { | |
98 } | |
99 virtual void UpdateImage(const std::string& id) OVERRIDE { | |
100 } | |
101 | |
102 private: | |
103 int fetch_count_; | |
104 | |
105 DISALLOW_COPY_AND_ASSIGN(AppIconLoaderImpl); | |
106 }; | |
107 | |
108 // Test implementation of TabStripModelDelegate. | |
109 class TabHelperTabStripModelDelegate : public TestTabStripModelDelegate { | |
110 public: | |
111 TabHelperTabStripModelDelegate() {} | |
112 virtual ~TabHelperTabStripModelDelegate() {} | |
113 | |
114 virtual void WillAddWebContents(content::WebContents* contents) OVERRIDE { | |
115 // BrowserLauncherItemController assumes that all WebContents passed to it | |
116 // have attached an extensions::TabHelper and a FaviconTabHelper. The | |
117 // TestTabStripModelDelegate adds an extensions::TabHelper. | |
118 TestTabStripModelDelegate::WillAddWebContents(contents); | |
119 FaviconTabHelper::CreateForWebContents(contents); | |
120 } | |
121 | |
122 private: | |
123 DISALLOW_COPY_AND_ASSIGN(TabHelperTabStripModelDelegate); | |
124 }; | |
125 | |
126 } // namespace | |
127 | |
128 // TODO(skuhne): Several of these unit tests need to be moved into a new home | |
129 // when the old launcher & the browser launcher item controller are removed | |
130 // (several of these tests are not testing the BrowserLauncherItemController - | |
131 // but the LauncherController framework). | |
132 class LauncherItemControllerPerAppTest | |
133 : public ChromeRenderViewHostTestHarness { | |
134 public: | |
135 virtual void SetUp() OVERRIDE { | |
136 ChromeRenderViewHostTestHarness::SetUp(); | |
137 | |
138 activation_client_.reset( | |
139 new aura::test::TestActivationClient(root_window())); | |
140 launcher_model_.reset(new ash::LauncherModel); | |
141 launcher_delegate_.reset( | |
142 ChromeLauncherController::CreateInstance(profile(), | |
143 launcher_model_.get())); | |
144 app_tab_helper_ = new AppTabHelperImpl; | |
145 app_icon_loader_ = new AppIconLoaderImpl; | |
146 launcher_delegate_->SetAppTabHelperForTest(app_tab_helper_); | |
147 launcher_delegate_->SetAppIconLoaderForTest(app_icon_loader_); | |
148 launcher_delegate_->Init(); | |
149 } | |
150 | |
151 virtual void TearDown() OVERRIDE { | |
152 launcher_delegate_.reset(); | |
153 ChromeRenderViewHostTestHarness::TearDown(); | |
154 } | |
155 | |
156 protected: | |
157 // Contains all the objects needed to create a BrowserLauncherItemController. | |
158 struct State : public aura::client::ActivationDelegate, | |
159 public aura::client::ActivationChangeObserver { | |
160 public: | |
161 State(LauncherItemControllerPerAppTest* test, | |
162 const std::string& app_id, | |
163 BrowserLauncherItemController::Type launcher_type) | |
164 : launcher_test(test), | |
165 window(NULL), | |
166 tab_strip(&tab_strip_delegate, test->profile()), | |
167 updater(launcher_type, | |
168 &window, | |
169 &tab_strip, | |
170 test->launcher_delegate_.get(), | |
171 app_id) { | |
172 window.Init(ui::LAYER_NOT_DRAWN); | |
173 launcher_test->root_window()->AddChild(&window); | |
174 launcher_test->activation_client_->ActivateWindow(&window); | |
175 aura::client::SetActivationDelegate(&window, this); | |
176 aura::client::SetActivationChangeObserver(&window, this); | |
177 updater.Init(); | |
178 } | |
179 | |
180 ash::LauncherItem GetUpdaterItem() { | |
181 ash::LauncherID launcher_id = | |
182 BrowserLauncherItemController::TestApi(&updater).item_id(); | |
183 int index = launcher_test->launcher_model_->ItemIndexByID(launcher_id); | |
184 return launcher_test->launcher_model_->items()[index]; | |
185 } | |
186 | |
187 // aura::client::ActivationDelegate overrides. | |
188 virtual bool ShouldActivate() const OVERRIDE { | |
189 return true; | |
190 } | |
191 | |
192 // aura::client::ActivationChangeObserver overrides: | |
193 virtual void OnWindowActivated(aura::Window* gained_active, | |
194 aura::Window* lost_active) OVERRIDE { | |
195 DCHECK(&window == gained_active || &window == lost_active); | |
196 updater.BrowserActivationStateChanged(); | |
197 } | |
198 | |
199 LauncherItemControllerPerAppTest* launcher_test; | |
200 aura::Window window; | |
201 TabHelperTabStripModelDelegate tab_strip_delegate; | |
202 TabStripModel tab_strip; | |
203 BrowserLauncherItemController updater; | |
204 | |
205 private: | |
206 DISALLOW_COPY_AND_ASSIGN(State); | |
207 }; | |
208 | |
209 const std::string& GetAppID(ash::LauncherID id) const { | |
210 return launcher_delegate_->GetAppIdFromLauncherIdForTest(id); | |
211 } | |
212 | |
213 void ResetAppTabHelper() { | |
214 launcher_delegate_->SetAppTabHelperForTest(app_tab_helper_); | |
215 } | |
216 | |
217 void ResetAppIconLoader() { | |
218 launcher_delegate_->SetAppIconLoaderForTest(app_icon_loader_); | |
219 } | |
220 | |
221 void UnpinAppsWithID(const std::string& app_id) { | |
222 launcher_delegate_->UnpinAppsWithID(app_id); | |
223 } | |
224 | |
225 const ash::LauncherItem& GetItem(BrowserLauncherItemController* updater) { | |
226 int index = launcher_model_->ItemIndexByID( | |
227 BrowserLauncherItemController::TestApi(updater).item_id()); | |
228 return launcher_model_->items()[index]; | |
229 } | |
230 | |
231 scoped_ptr<ash::LauncherModel> launcher_model_; | |
232 scoped_ptr<ChromeLauncherController> launcher_delegate_; | |
233 | |
234 // Owned by BrowserLauncherItemController. | |
235 AppTabHelperImpl* app_tab_helper_; | |
236 AppIconLoaderImpl* app_icon_loader_; | |
237 | |
238 scoped_ptr<aura::test::TestActivationClient> activation_client_; | |
239 }; | |
240 | |
241 // Verify that the launcher item positions are persisted and restored. | |
242 TEST_F(LauncherItemControllerPerAppTest, PersistLauncherItemPositions) { | |
243 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
244 launcher_model_->items()[0].type); | |
245 EXPECT_EQ(ash::TYPE_APP_LIST, | |
246 launcher_model_->items()[1].type); | |
247 scoped_ptr<content::WebContents> tab1(CreateTestWebContents()); | |
248 scoped_ptr<content::WebContents> tab2(CreateTestWebContents()); | |
249 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
250 app_tab_helper_->SetAppID(tab1.get(), "2"); | |
251 | |
252 EXPECT_FALSE(launcher_delegate_->IsAppPinned("1")); | |
253 launcher_delegate_->PinAppWithID("1"); | |
254 EXPECT_TRUE(launcher_delegate_->IsAppPinned("1")); | |
255 launcher_delegate_->PinAppWithID("2"); | |
256 | |
257 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
258 launcher_model_->items()[0].type); | |
259 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
260 launcher_model_->items()[1].type); | |
261 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
262 launcher_model_->items()[2].type); | |
263 EXPECT_EQ(ash::TYPE_APP_LIST, | |
264 launcher_model_->items()[3].type); | |
265 | |
266 launcher_model_->Move(0, 2); | |
267 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
268 launcher_model_->items()[0].type); | |
269 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
270 launcher_model_->items()[1].type); | |
271 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
272 launcher_model_->items()[2].type); | |
273 EXPECT_EQ(ash::TYPE_APP_LIST, | |
274 launcher_model_->items()[3].type); | |
275 | |
276 launcher_delegate_.reset(); | |
277 launcher_model_.reset(new ash::LauncherModel); | |
278 launcher_delegate_.reset( | |
279 ChromeLauncherController::CreateInstance(profile(), | |
280 launcher_model_.get())); | |
281 app_tab_helper_ = new AppTabHelperImpl; | |
282 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
283 app_tab_helper_->SetAppID(tab2.get(), "2"); | |
284 ResetAppTabHelper(); | |
285 | |
286 launcher_delegate_->Init(); | |
287 | |
288 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
289 launcher_model_->items()[0].type); | |
290 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
291 launcher_model_->items()[1].type); | |
292 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
293 launcher_model_->items()[2].type); | |
294 EXPECT_EQ(ash::TYPE_APP_LIST, | |
295 launcher_model_->items()[3].type); | |
296 } | |
297 | |
298 class BrowserLauncherItemControllerTest | |
299 : public LauncherItemControllerPerAppTest { | |
300 public: | |
301 BrowserLauncherItemControllerTest() {} | |
302 | |
303 virtual void SetUp() OVERRIDE { | |
304 CommandLine::ForCurrentProcess()->AppendSwitch( | |
305 ash::switches::kAshDisablePerAppLauncher); | |
306 | |
307 LauncherItemControllerPerAppTest::SetUp(); | |
308 } | |
309 | |
310 virtual void TearDown() OVERRIDE { | |
311 LauncherItemControllerPerAppTest::TearDown(); | |
312 } | |
313 }; | |
314 | |
315 // Verifies a new launcher item is added for TYPE_TABBED. | |
316 TEST_F(BrowserLauncherItemControllerTest, TabbedSetup) { | |
317 size_t initial_size = launcher_model_->items().size(); | |
318 { | |
319 scoped_ptr<content::WebContents> web_contents(CreateTestWebContents()); | |
320 State state(this, std::string(), | |
321 BrowserLauncherItemController::TYPE_TABBED); | |
322 | |
323 // There should be one more item. | |
324 ASSERT_EQ(initial_size + 1, launcher_model_->items().size()); | |
325 // New item should be added at the end. | |
326 EXPECT_EQ(ash::TYPE_TABBED, state.GetUpdaterItem().type); | |
327 } | |
328 | |
329 // Deleting the BrowserLauncherItemController should have removed the item. | |
330 ASSERT_EQ(initial_size, launcher_model_->items().size()); | |
331 | |
332 // Do the same, but this time add the tab first. | |
333 { | |
334 scoped_ptr<content::WebContents> web_contents(CreateTestWebContents()); | |
335 | |
336 TabHelperTabStripModelDelegate tab_strip_delegate; | |
337 TabStripModel tab_strip(&tab_strip_delegate, profile()); | |
338 tab_strip.InsertWebContentsAt(0, | |
339 web_contents.get(), | |
340 TabStripModel::ADD_ACTIVE); | |
341 aura::Window window(NULL); | |
342 window.Init(ui::LAYER_NOT_DRAWN); | |
343 root_window()->AddChild(&window); | |
344 BrowserLauncherItemController updater( | |
345 LauncherItemController::TYPE_TABBED, | |
346 &window, &tab_strip, launcher_delegate_.get(), | |
347 std::string()); | |
348 updater.Init(); | |
349 | |
350 // There should be one more item. | |
351 ASSERT_EQ(initial_size + 1, launcher_model_->items().size()); | |
352 // New item should be added at the end. | |
353 EXPECT_EQ(ash::TYPE_TABBED, GetItem(&updater).type); | |
354 } | |
355 } | |
356 | |
357 // Verifies pinned apps are persisted and restored. | |
358 TEST_F(BrowserLauncherItemControllerTest, PersistPinned) { | |
359 size_t initial_size = launcher_model_->items().size(); | |
360 scoped_ptr<content::WebContents> tab1(CreateTestWebContents()); | |
361 | |
362 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
363 | |
364 app_icon_loader_->GetAndClearFetchCount(); | |
365 launcher_delegate_->PinAppWithID("1"); | |
366 ash::LauncherID id = launcher_delegate_->GetLauncherIDForAppID("1"); | |
367 int app_index = launcher_model_->ItemIndexByID(id); | |
368 EXPECT_GT(app_icon_loader_->GetAndClearFetchCount(), 0); | |
369 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
370 launcher_model_->items()[app_index].type); | |
371 EXPECT_TRUE(launcher_delegate_->IsAppPinned("1")); | |
372 EXPECT_FALSE(launcher_delegate_->IsAppPinned("0")); | |
373 EXPECT_EQ(initial_size + 1, launcher_model_->items().size()); | |
374 | |
375 launcher_delegate_.reset(); | |
376 launcher_model_.reset(new ash::LauncherModel); | |
377 launcher_delegate_.reset( | |
378 ChromeLauncherController::CreateInstance(profile(), | |
379 launcher_model_.get())); | |
380 app_tab_helper_ = new AppTabHelperImpl; | |
381 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
382 ResetAppTabHelper(); | |
383 app_icon_loader_ = new AppIconLoaderImpl; | |
384 ResetAppIconLoader(); | |
385 launcher_delegate_->Init(); | |
386 EXPECT_GT(app_icon_loader_->GetAndClearFetchCount(), 0); | |
387 ASSERT_EQ(initial_size + 1, launcher_model_->items().size()); | |
388 EXPECT_TRUE(launcher_delegate_->IsAppPinned("1")); | |
389 EXPECT_FALSE(launcher_delegate_->IsAppPinned("0")); | |
390 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
391 launcher_model_->items()[app_index].type); | |
392 | |
393 UnpinAppsWithID("1"); | |
394 ASSERT_EQ(initial_size, launcher_model_->items().size()); | |
395 } | |
396 | |
397 // Verify that launcher item positions are persisted and restored. | |
398 TEST_F(BrowserLauncherItemControllerTest, | |
399 PersistLauncherItemPositionsPerBrowser) { | |
400 int browser_shortcut_index = 0; | |
401 int app_list_index = 1; | |
402 | |
403 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
404 launcher_model_->items()[browser_shortcut_index].type); | |
405 EXPECT_EQ(ash::TYPE_APP_LIST, | |
406 launcher_model_->items()[app_list_index].type); | |
407 | |
408 scoped_ptr<content::WebContents> tab1(CreateTestWebContents()); | |
409 scoped_ptr<content::WebContents> tab2(CreateTestWebContents()); | |
410 | |
411 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
412 app_tab_helper_->SetAppID(tab2.get(), "2"); | |
413 | |
414 app_icon_loader_->GetAndClearFetchCount(); | |
415 launcher_delegate_->PinAppWithID("1"); | |
416 ash::LauncherID id = launcher_delegate_->GetLauncherIDForAppID("1"); | |
417 int app1_index = launcher_model_->ItemIndexByID(id); | |
418 | |
419 launcher_delegate_->PinAppWithID("2"); | |
420 id = launcher_delegate_->GetLauncherIDForAppID("2"); | |
421 int app2_index = launcher_model_->ItemIndexByID(id); | |
422 | |
423 launcher_model_->Move(browser_shortcut_index, app1_index); | |
424 | |
425 browser_shortcut_index = 1; | |
426 app1_index = 0; | |
427 | |
428 EXPECT_GT(app_icon_loader_->GetAndClearFetchCount(), 0); | |
429 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
430 launcher_model_->items()[app1_index].type); | |
431 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
432 launcher_model_->items()[browser_shortcut_index].type); | |
433 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
434 launcher_model_->items()[app2_index].type); | |
435 | |
436 launcher_delegate_.reset(); | |
437 launcher_model_.reset(new ash::LauncherModel); | |
438 launcher_delegate_.reset( | |
439 ChromeLauncherController::CreateInstance(profile(), | |
440 launcher_model_.get())); | |
441 | |
442 app_tab_helper_ = new AppTabHelperImpl; | |
443 app_tab_helper_->SetAppID(tab1.get(), "1"); | |
444 app_tab_helper_->SetAppID(tab2.get(), "2"); | |
445 ResetAppTabHelper(); | |
446 app_icon_loader_ = new AppIconLoaderImpl; | |
447 ResetAppIconLoader(); | |
448 launcher_delegate_->Init(); | |
449 | |
450 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
451 launcher_model_->items()[app1_index].type); | |
452 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, | |
453 launcher_model_->items()[browser_shortcut_index].type); | |
454 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, | |
455 launcher_model_->items()[app2_index].type); | |
456 } | |
457 | |
458 // Confirm that tabbed browsers handle activation correctly. | |
459 TEST_F(BrowserLauncherItemControllerTest, ActivateBrowsers) { | |
460 State state1(this, std::string(), BrowserLauncherItemController::TYPE_TABBED); | |
461 | |
462 // First browser is active. | |
463 EXPECT_EQ(ash::STATUS_ACTIVE, state1.GetUpdaterItem().status); | |
464 | |
465 { | |
466 // Both running. | |
467 State state2(this, std::string(), | |
468 BrowserLauncherItemController::TYPE_TABBED); | |
469 EXPECT_EQ(ash::STATUS_ACTIVE, state2.GetUpdaterItem().status); | |
470 EXPECT_EQ(ash::STATUS_RUNNING, state1.GetUpdaterItem().status); | |
471 | |
472 // Make first browser active again. | |
473 activation_client_->ActivateWindow(&state1.window); | |
474 EXPECT_EQ(ash::STATUS_ACTIVE, state1.GetUpdaterItem().status); | |
475 EXPECT_EQ(ash::STATUS_RUNNING, state2.GetUpdaterItem().status); | |
476 | |
477 // And back to second. | |
478 activation_client_->ActivateWindow(&state2.window); | |
479 EXPECT_EQ(ash::STATUS_ACTIVE, state2.GetUpdaterItem().status); | |
480 EXPECT_EQ(ash::STATUS_RUNNING, state1.GetUpdaterItem().status); | |
481 } | |
482 | |
483 // First browser should be active again after second is closed. | |
484 EXPECT_EQ(ash::STATUS_ACTIVE, state1.GetUpdaterItem().status); | |
485 } | |
486 | |
487 // Confirm that window activation works through the model. | |
488 TEST_F(BrowserLauncherItemControllerTest, SwitchDirectlyToApp) { | |
489 State state1(this, std::string(), | |
490 BrowserLauncherItemController::TYPE_TABBED); | |
491 int index1 = launcher_model_->ItemIndexByID(state1.GetUpdaterItem().id); | |
492 | |
493 // Second app is active and first is inactive. | |
494 State state2(this, std::string(), | |
495 BrowserLauncherItemController::TYPE_TABBED); | |
496 int index2 = launcher_model_->ItemIndexByID(state2.GetUpdaterItem().id); | |
497 | |
498 EXPECT_EQ(ash::STATUS_RUNNING, state1.GetUpdaterItem().status); | |
499 EXPECT_EQ(ash::STATUS_ACTIVE, state2.GetUpdaterItem().status); | |
500 EXPECT_EQ(&state2.window, activation_client_->GetActiveWindow()); | |
501 | |
502 // Test that we can properly switch to the first item. | |
503 ash::LauncherItem new_item1(launcher_model_->items()[index1]); | |
504 new_item1.status = ash::STATUS_ACTIVE; | |
505 launcher_model_->Set(index1, new_item1); | |
506 EXPECT_EQ(ash::STATUS_ACTIVE, launcher_model_->items()[index1].status); | |
507 EXPECT_EQ(ash::STATUS_RUNNING, launcher_model_->items()[index2].status); | |
508 EXPECT_EQ(&state1.window, activation_client_->GetActiveWindow()); | |
509 | |
510 // And to the second item active. | |
511 ash::LauncherItem new_item2(launcher_model_->items()[index2]); | |
512 new_item2.status = ash::STATUS_ACTIVE; | |
513 launcher_model_->Set(index2, new_item2); | |
514 EXPECT_EQ(ash::STATUS_RUNNING, launcher_model_->items()[index1].status); | |
515 EXPECT_EQ(ash::STATUS_ACTIVE, launcher_model_->items()[index2].status); | |
516 EXPECT_EQ(&state2.window, activation_client_->GetActiveWindow()); | |
517 } | |
518 | |
519 // Test attention states of windows. | |
520 TEST_F(BrowserLauncherItemControllerTest, FlashWindow) { | |
521 // App panel first | |
522 State app_state(this, "1", BrowserLauncherItemController::TYPE_APP_PANEL); | |
523 EXPECT_EQ(ash::STATUS_ACTIVE, app_state.GetUpdaterItem().status); | |
524 | |
525 // Active windows don't show attention. | |
526 app_state.window.SetProperty(aura::client::kDrawAttentionKey, true); | |
527 EXPECT_EQ(ash::STATUS_ACTIVE, app_state.GetUpdaterItem().status); | |
528 | |
529 // Then browser window | |
530 State browser_state( | |
531 this, std::string(), BrowserLauncherItemController::TYPE_TABBED); | |
532 // First browser is active. | |
533 EXPECT_EQ(ash::STATUS_ACTIVE, browser_state.GetUpdaterItem().status); | |
534 EXPECT_EQ(ash::STATUS_RUNNING, app_state.GetUpdaterItem().status); | |
535 | |
536 // App window should go to attention state. | |
537 app_state.window.SetProperty(aura::client::kDrawAttentionKey, true); | |
538 EXPECT_EQ(ash::STATUS_ATTENTION, app_state.GetUpdaterItem().status); | |
539 | |
540 // Activating app window should clear attention state. | |
541 activation_client_->ActivateWindow(&app_state.window); | |
542 EXPECT_EQ(ash::STATUS_ACTIVE, app_state.GetUpdaterItem().status); | |
543 } | |
OLD | NEW |