This source file includes following definitions.
- GetSystemTray
- tray_view_
- CreateTrayView
- CreateDefaultView
- CreateDetailedView
- CreateNotificationView
- DestroyTrayView
- DestroyDefaultView
- DestroyDetailedView
- DestroyNotificationView
- UpdateAfterLoginStatusChange
- tray_view
- default_view
- detailed_view
- notification_view
- CreateTrayView
- CreateDefaultView
- CreateDetailedView
- CreateNotificationView
- DestroyTrayView
- DestroyDefaultView
- DestroyDetailedView
- DestroyNotificationView
- UpdateAfterLoginStatusChange
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
#include "ash/system/tray/system_tray.h"
#include <vector>
#include "ash/root_window_controller.h"
#include "ash/shelf/shelf_layout_manager.h"
#include "ash/shelf/shelf_widget.h"
#include "ash/shell.h"
#include "ash/system/status_area_widget.h"
#include "ash/system/tray/system_tray_item.h"
#include "ash/test/ash_test_base.h"
#include "ash/wm/window_util.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/aura/test/event_generator.h"
#include "ui/aura/window.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#endif
namespace ash {
namespace test {
namespace {
SystemTray* GetSystemTray() {
return Shell::GetPrimaryRootWindowController()->shelf()->
status_area_widget()->system_tray();
}
class TestItem : public SystemTrayItem {
public:
TestItem() : SystemTrayItem(GetSystemTray()), tray_view_(NULL) {}
virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE {
tray_view_ = new views::View;
tray_view_->SetLayoutManager(new views::FillLayout);
tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
return tray_view_;
}
virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE {
default_view_ = new views::View;
default_view_->SetLayoutManager(new views::FillLayout);
default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
return default_view_;
}
virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE {
detailed_view_ = new views::View;
detailed_view_->SetLayoutManager(new views::FillLayout);
detailed_view_->AddChildView(
new views::Label(base::UTF8ToUTF16("Detailed")));
return detailed_view_;
}
virtual views::View* CreateNotificationView(
user::LoginStatus status) OVERRIDE {
notification_view_ = new views::View;
return notification_view_;
}
virtual void DestroyTrayView() OVERRIDE {
tray_view_ = NULL;
}
virtual void DestroyDefaultView() OVERRIDE {
default_view_ = NULL;
}
virtual void DestroyDetailedView() OVERRIDE {
detailed_view_ = NULL;
}
virtual void DestroyNotificationView() OVERRIDE {
notification_view_ = NULL;
}
virtual void UpdateAfterLoginStatusChange(
user::LoginStatus status) OVERRIDE {
}
views::View* tray_view() const { return tray_view_; }
views::View* default_view() const { return default_view_; }
views::View* detailed_view() const { return detailed_view_; }
views::View* notification_view() const { return notification_view_; }
private:
views::View* tray_view_;
views::View* default_view_;
views::View* detailed_view_;
views::View* notification_view_;
};
class TestNoViewItem : public SystemTrayItem {
public:
TestNoViewItem() : SystemTrayItem(GetSystemTray()) {}
virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE {
return NULL;
}
virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE {
return NULL;
}
virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE {
return NULL;
}
virtual views::View* CreateNotificationView(
user::LoginStatus status) OVERRIDE {
return NULL;
}
virtual void DestroyTrayView() OVERRIDE {}
virtual void DestroyDefaultView() OVERRIDE {}
virtual void DestroyDetailedView() OVERRIDE {}
virtual void DestroyNotificationView() OVERRIDE {}
virtual void UpdateAfterLoginStatusChange(
user::LoginStatus status) OVERRIDE {
}
};
}
typedef AshTestBase SystemTrayTest;
TEST_F(SystemTrayTest, SystemTrayDefaultView) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(tray->CloseSystemBubble());
RunAllPendingInMessageLoop();
ASSERT_FALSE(tray->CloseSystemBubble());
}
TEST_F(SystemTrayTest, SystemTrayColoring) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
ASSERT_FALSE(tray->draw_background_as_active());
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(tray->draw_background_as_active());
ASSERT_TRUE(tray->CloseSystemBubble());
RunAllPendingInMessageLoop();
ASSERT_FALSE(tray->draw_background_as_active());
}
TEST_F(SystemTrayTest, SystemTrayColoringAfterAlignmentChange) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
ShelfLayoutManager* manager =
Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
manager->SetAlignment(SHELF_ALIGNMENT_BOTTOM);
ASSERT_FALSE(tray->draw_background_as_active());
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(tray->draw_background_as_active());
manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
ASSERT_FALSE(tray->draw_background_as_active());
RunAllPendingInMessageLoop();
ASSERT_FALSE(tray->CloseSystemBubble());
}
TEST_F(SystemTrayTest, SystemTrayTestItems) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestItem* test_item = new TestItem;
TestItem* detailed_item = new TestItem;
tray->AddTrayItem(test_item);
tray->AddTrayItem(detailed_item);
const std::vector<SystemTrayItem*>& items = tray->GetTrayItems();
ASSERT_TRUE(
std::find(items.begin(), items.end(), test_item) != items.end());
ASSERT_TRUE(
std::find(items.begin(), items.end(), detailed_item) != items.end());
ASSERT_TRUE(test_item->tray_view() != NULL);
ASSERT_TRUE(detailed_item->tray_view() != NULL);
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(test_item->default_view() != NULL);
ASSERT_TRUE(detailed_item->default_view() != NULL);
tray->ShowDetailedView(detailed_item, 0, false, BUBBLE_CREATE_NEW);
RunAllPendingInMessageLoop();
ASSERT_TRUE(test_item->default_view() == NULL);
ASSERT_TRUE(detailed_item->detailed_view() != NULL);
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
RunAllPendingInMessageLoop();
ASSERT_TRUE(test_item->default_view() != NULL);
ASSERT_TRUE(detailed_item->detailed_view() == NULL);
}
TEST_F(SystemTrayTest, SystemTrayNoViewItems) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestNoViewItem* no_view_item = new TestNoViewItem;
tray->AddTrayItem(no_view_item);
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
tray->ShowDetailedView(no_view_item, 0, false, BUBBLE_USE_EXISTING);
RunAllPendingInMessageLoop();
}
TEST_F(SystemTrayTest, TrayWidgetAutoResizes) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestItem* initial_item = new TestItem;
tray->AddTrayItem(initial_item);
gfx::Size initial_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
TestItem* new_item = new TestItem;
tray->AddTrayItem(new_item);
gfx::Size new_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
EXPECT_NE(initial_size.ToString(), new_size.ToString());
new_item->tray_view()->SetVisible(false);
EXPECT_EQ(initial_size.ToString(),
tray->GetWidget()->GetWindowBoundsInScreen().size().ToString());
new_item->tray_view()->SetVisible(true);
EXPECT_EQ(new_size.ToString(),
tray->GetWidget()->GetWindowBoundsInScreen().size().ToString());
}
TEST_F(SystemTrayTest, SystemTrayNotifications) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestItem* test_item = new TestItem;
TestItem* detailed_item = new TestItem;
tray->AddTrayItem(test_item);
tray->AddTrayItem(detailed_item);
ASSERT_TRUE(test_item->tray_view() != NULL);
ASSERT_TRUE(detailed_item->tray_view() != NULL);
tray->ShowNotificationView(test_item);
ASSERT_TRUE(test_item->notification_view() != NULL);
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
RunAllPendingInMessageLoop();
ASSERT_TRUE(test_item->notification_view() != NULL);
tray->ShowDetailedView(detailed_item, 0, false, BUBBLE_CREATE_NEW);
RunAllPendingInMessageLoop();
ASSERT_TRUE(detailed_item->detailed_view() != NULL);
ASSERT_TRUE(test_item->notification_view() != NULL);
ASSERT_TRUE(tray->CloseSystemBubble());
RunAllPendingInMessageLoop();
ASSERT_TRUE(detailed_item->detailed_view() == NULL);
ASSERT_TRUE(test_item->notification_view() != NULL);
}
TEST_F(SystemTrayTest, BubbleCreationTypesTest) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestItem* test_item = new TestItem;
tray->AddTrayItem(test_item);
ASSERT_TRUE(test_item->tray_view() != NULL);
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
RunAllPendingInMessageLoop();
views::Widget* widget = test_item->default_view()->GetWidget();
gfx::Rect bubble_bounds = widget->GetWindowBoundsInScreen();
tray->ShowDetailedView(test_item, 0, true, BUBBLE_USE_EXISTING);
RunAllPendingInMessageLoop();
EXPECT_FALSE(test_item->default_view());
EXPECT_EQ(bubble_bounds.ToString(), test_item->detailed_view()->GetWidget()->
GetWindowBoundsInScreen().ToString());
EXPECT_EQ(widget, test_item->detailed_view()->GetWidget());
tray->ShowDefaultView(BUBBLE_USE_EXISTING);
RunAllPendingInMessageLoop();
EXPECT_EQ(bubble_bounds.ToString(), test_item->default_view()->GetWidget()->
GetWindowBoundsInScreen().ToString());
EXPECT_EQ(widget, test_item->default_view()->GetWidget());
}
TEST_F(SystemTrayTest, TrayBoundsInWidget) {
ShelfLayoutManager* manager =
Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
StatusAreaWidget* widget =
Shell::GetPrimaryRootWindowController()->shelf()->status_area_widget();
SystemTray* tray = widget->system_tray();
manager->SetAlignment(SHELF_ALIGNMENT_BOTTOM);
gfx::Rect window_bounds = widget->GetWindowBoundsInScreen();
gfx::Rect tray_bounds = tray->GetBoundsInScreen();
EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
window_bounds = widget->GetWindowBoundsInScreen();
tray_bounds = tray->GetBoundsInScreen();
EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
window_bounds = widget->GetWindowBoundsInScreen();
tray_bounds = tray->GetBoundsInScreen();
EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
}
TEST_F(SystemTrayTest, PersistentBubble) {
SystemTray* tray = GetSystemTray();
ASSERT_TRUE(tray->GetWidget());
TestItem* test_item = new TestItem;
tray->AddTrayItem(test_item);
scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(tray->HasSystemBubble());
wm::ActivateWindow(window.get());
base::RunLoop().RunUntilIdle();
ASSERT_FALSE(tray->HasSystemBubble());
tray->ShowDefaultView(BUBBLE_CREATE_NEW);
ASSERT_TRUE(tray->HasSystemBubble());
{
aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
gfx::Point(5, 5));
generator.ClickLeftButton();
ASSERT_FALSE(tray->HasSystemBubble());
}
tray->ShowPersistentDefaultView();
ASSERT_TRUE(tray->HasSystemBubble());
wm::ActivateWindow(window.get());
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(tray->HasSystemBubble());
{
aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
gfx::Point(5, 5));
generator.ClickLeftButton();
ASSERT_TRUE(tray->HasSystemBubble());
}
}
}
}