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/system/tray/tray_details_view.h" 6 7 #include "ash/root_window_controller.h" 8 #include "ash/shelf/shelf_widget.h" 9 #include "ash/shell.h" 10 #include "ash/system/status_area_widget.h" 11 #include "ash/system/tray/system_tray.h" 12 #include "ash/system/tray/system_tray_item.h" 13 #include "ash/system/tray/tray_details_view.h" 14 #include "ash/system/tray/view_click_listener.h" 15 #include "ash/test/ash_test_base.h" 16 #include "base/run_loop.h" 17 #include "grit/ash_strings.h" 18 #include "ui/aura/window.h" 19 #include "ui/views/view.h" 20 #include "ui/views/widget/widget.h" 21 22 namespace ash { 23 namespace test { 24 25 namespace { 26 27 SystemTray* GetSystemTray() { 28 return Shell::GetPrimaryRootWindowController()->shelf()-> 29 status_area_widget()->system_tray(); 30 } 31 32 class TestDetailsView : public TrayDetailsView, public ViewClickListener { 33 public: 34 explicit TestDetailsView(SystemTrayItem* owner) : TrayDetailsView(owner) {} 35 36 virtual ~TestDetailsView() {} 37 38 void CreateFooterAndFocus() { 39 // Uses bluetooth label for testing purpose. It can be changed to any 40 // string_id. 41 CreateSpecialRow(IDS_ASH_STATUS_TRAY_BLUETOOTH, this); 42 footer()->content()->RequestFocus(); 43 } 44 45 // Overridden from ViewClickListener: 46 virtual void OnViewClicked(views::View* sender) OVERRIDE {} 47 48 private: 49 DISALLOW_COPY_AND_ASSIGN(TestDetailsView); 50 }; 51 52 // Trivial item implementation that tracks its views for testing. 53 class TestItem : public SystemTrayItem { 54 public: 55 TestItem() : SystemTrayItem(GetSystemTray()), tray_view_(NULL) {} 56 57 // Overridden from SystemTrayItem: 58 virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE { 59 tray_view_ = new views::View; 60 return tray_view_; 61 } 62 virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE { 63 default_view_ = new views::View; 64 default_view_->SetFocusable(true); 65 return default_view_; 66 } 67 virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE { 68 detailed_view_ = new TestDetailsView(this); 69 return detailed_view_; 70 } 71 virtual void DestroyTrayView() OVERRIDE { 72 tray_view_ = NULL; 73 } 74 virtual void DestroyDefaultView() OVERRIDE { 75 default_view_ = NULL; 76 } 77 virtual void DestroyDetailedView() OVERRIDE { 78 detailed_view_ = NULL; 79 } 80 81 views::View* tray_view() const { return tray_view_; } 82 views::View* default_view() const { return default_view_; } 83 TestDetailsView* detailed_view() const { return detailed_view_; } 84 85 private: 86 views::View* tray_view_; 87 views::View* default_view_; 88 TestDetailsView* detailed_view_; 89 90 DISALLOW_COPY_AND_ASSIGN(TestItem); 91 }; 92 93 } // namespace 94 95 typedef AshTestBase TrayDetailsViewTest; 96 97 TEST_F(TrayDetailsViewTest, TransitionToDefaultViewTest) { 98 SystemTray* tray = GetSystemTray(); 99 ASSERT_TRUE(tray->GetWidget()); 100 101 TestItem* test_item_1 = new TestItem; 102 TestItem* test_item_2 = new TestItem; 103 tray->AddTrayItem(test_item_1); 104 tray->AddTrayItem(test_item_2); 105 106 // Ensure the tray views are created. 107 ASSERT_TRUE(test_item_1->tray_view() != NULL); 108 ASSERT_TRUE(test_item_2->tray_view() != NULL); 109 110 // Show the default view. 111 tray->ShowDefaultView(BUBBLE_CREATE_NEW); 112 RunAllPendingInMessageLoop(); 113 114 // Show the detailed view of item 2. 115 tray->ShowDetailedView(test_item_2, 0, true, BUBBLE_USE_EXISTING); 116 EXPECT_TRUE(test_item_2->detailed_view()); 117 RunAllPendingInMessageLoop(); 118 EXPECT_FALSE(test_item_2->default_view()); 119 120 // Transition back to default view, the default view of item 2 should have 121 // focus. 122 test_item_2->detailed_view()->CreateFooterAndFocus(); 123 test_item_2->detailed_view()->TransitionToDefaultView(); 124 RunAllPendingInMessageLoop(); 125 126 EXPECT_TRUE(test_item_2->default_view()); 127 EXPECT_FALSE(test_item_2->detailed_view()); 128 EXPECT_TRUE(test_item_2->default_view()->HasFocus()); 129 130 // Show the detailed view of item 2 again. 131 tray->ShowDetailedView(test_item_2, 0, true, BUBBLE_USE_EXISTING); 132 EXPECT_TRUE(test_item_2->detailed_view()); 133 RunAllPendingInMessageLoop(); 134 EXPECT_FALSE(test_item_2->default_view()); 135 136 // Transition back to default view, the default view of item 2 should NOT have 137 // focus. 138 test_item_2->detailed_view()->TransitionToDefaultView(); 139 RunAllPendingInMessageLoop(); 140 141 EXPECT_TRUE(test_item_2->default_view()); 142 EXPECT_FALSE(test_item_2->detailed_view()); 143 EXPECT_FALSE(test_item_2->default_view()->HasFocus()); 144 } 145 146 } // namespace test 147 } // namespace ash 148