| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/system/tray/tray_details_view.h" |
| |
| #include "ash/root_window_controller.h" |
| #include "ash/shelf/shelf_widget.h" |
| #include "ash/shell.h" |
| #include "ash/system/status_area_widget.h" |
| #include "ash/system/tray/system_tray.h" |
| #include "ash/system/tray/system_tray_item.h" |
| #include "ash/system/tray/tray_details_view.h" |
| #include "ash/system/tray/view_click_listener.h" |
| #include "ash/test/ash_test_base.h" |
| #include "base/run_loop.h" |
| #include "grit/ash_strings.h" |
| #include "ui/aura/window.h" |
| #include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace ash { |
| namespace test { |
| |
| namespace { |
| |
| SystemTray* GetSystemTray() { |
| return Shell::GetPrimaryRootWindowController()->shelf()-> |
| status_area_widget()->system_tray(); |
| } |
| |
| class TestDetailsView : public internal::TrayDetailsView, |
| public internal::ViewClickListener { |
| public: |
| explicit TestDetailsView(SystemTrayItem* owner) |
| : internal::TrayDetailsView(owner) {} |
| |
| virtual ~TestDetailsView() {} |
| |
| void CreateFooterAndFocus() { |
| // Uses bluetooth label for testing purpose. It can be changed to any |
| // string_id. |
| CreateSpecialRow(IDS_ASH_STATUS_TRAY_BLUETOOTH, this); |
| footer()->content()->RequestFocus(); |
| } |
| |
| // Overridden from internal::ViewClickListener: |
| virtual void OnViewClicked(views::View* sender) OVERRIDE {} |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TestDetailsView); |
| }; |
| |
| // Trivial item implementation that tracks its views for testing. |
| class TestItem : public SystemTrayItem { |
| public: |
| TestItem() : SystemTrayItem(GetSystemTray()), tray_view_(NULL) {} |
| |
| // Overridden from SystemTrayItem: |
| virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE { |
| tray_view_ = new views::View; |
| return tray_view_; |
| } |
| virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE { |
| default_view_ = new views::View; |
| default_view_->SetFocusable(true); |
| return default_view_; |
| } |
| virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE { |
| detailed_view_ = new TestDetailsView(this); |
| return detailed_view_; |
| } |
| virtual void DestroyTrayView() OVERRIDE { |
| tray_view_ = NULL; |
| } |
| virtual void DestroyDefaultView() OVERRIDE { |
| default_view_ = NULL; |
| } |
| virtual void DestroyDetailedView() OVERRIDE { |
| detailed_view_ = NULL; |
| } |
| |
| views::View* tray_view() const { return tray_view_; } |
| views::View* default_view() const { return default_view_; } |
| TestDetailsView* detailed_view() const { return detailed_view_; } |
| |
| private: |
| views::View* tray_view_; |
| views::View* default_view_; |
| TestDetailsView* detailed_view_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TestItem); |
| }; |
| |
| } // namespace |
| |
| typedef AshTestBase TrayDetailsViewTest; |
| |
| TEST_F(TrayDetailsViewTest, TransitionToDefaultViewTest) { |
| SystemTray* tray = GetSystemTray(); |
| ASSERT_TRUE(tray->GetWidget()); |
| |
| TestItem* test_item_1 = new TestItem; |
| TestItem* test_item_2 = new TestItem; |
| tray->AddTrayItem(test_item_1); |
| tray->AddTrayItem(test_item_2); |
| |
| // Ensure the tray views are created. |
| ASSERT_TRUE(test_item_1->tray_view() != NULL); |
| ASSERT_TRUE(test_item_2->tray_view() != NULL); |
| |
| // Show the default view. |
| tray->ShowDefaultView(BUBBLE_CREATE_NEW); |
| RunAllPendingInMessageLoop(); |
| |
| // Show the detailed view of item 2. |
| tray->ShowDetailedView(test_item_2, 0, true, BUBBLE_USE_EXISTING); |
| EXPECT_TRUE(test_item_2->detailed_view()); |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(test_item_2->default_view()); |
| |
| // Transition back to default view, the default view of item 2 should have |
| // focus. |
| test_item_2->detailed_view()->CreateFooterAndFocus(); |
| test_item_2->detailed_view()->TransitionToDefaultView(); |
| RunAllPendingInMessageLoop(); |
| |
| EXPECT_TRUE(test_item_2->default_view()); |
| EXPECT_FALSE(test_item_2->detailed_view()); |
| EXPECT_TRUE(test_item_2->default_view()->HasFocus()); |
| |
| // Show the detailed view of item 2 again. |
| tray->ShowDetailedView(test_item_2, 0, true, BUBBLE_USE_EXISTING); |
| EXPECT_TRUE(test_item_2->detailed_view()); |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(test_item_2->default_view()); |
| |
| // Transition back to default view, the default view of item 2 should NOT have |
| // focus. |
| test_item_2->detailed_view()->TransitionToDefaultView(); |
| RunAllPendingInMessageLoop(); |
| |
| EXPECT_TRUE(test_item_2->default_view()); |
| EXPECT_FALSE(test_item_2->detailed_view()); |
| EXPECT_FALSE(test_item_2->default_view()->HasFocus()); |
| } |
| |
| } // namespace test |
| } // namespace ash |