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