Home | History | Annotate | Download | only in tray
      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