15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ash/accessibility_delegate.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_item.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ash/system/tray/tray_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/wm/window_util.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/run_loop.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/window.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/base/ui_base_types.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gfx/geometry/rect.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/widget/widget_delegate.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/windows_version.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SystemTray* GetSystemTray() {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetPrimaryRootWindowController()->shelf()->
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_area_widget()->system_tray();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Trivial item implementation that tracks its views for testing.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestItem : public SystemTrayItem {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestItem() : SystemTrayItem(GetSystemTray()), tray_view_(NULL) {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_ = new views::View;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a label so it has non-zero width.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_->SetLayoutManager(new views::FillLayout);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tray_view_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_ = new views::View;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_->SetLayoutManager(new views::FillLayout);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return default_view_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_ = new views::View;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_->SetLayoutManager(new views::FillLayout);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    detailed_view_->AddChildView(
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new views::Label(base::UTF8ToUTF16("Detailed")));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return detailed_view_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateNotificationView(
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user::LoginStatus status) OVERRIDE {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_view_ = new views::View;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return notification_view_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyTrayView() OVERRIDE {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray_view_ = NULL;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyDefaultView() OVERRIDE {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_view_ = NULL;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyDetailedView() OVERRIDE {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    detailed_view_ = NULL;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyNotificationView() OVERRIDE {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_view_ = NULL;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateAfterLoginStatusChange(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user::LoginStatus status) OVERRIDE {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* tray_view() const { return tray_view_; }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* default_view() const { return default_view_; }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* detailed_view() const { return detailed_view_; }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* notification_view() const { return notification_view_; }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* tray_view_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* default_view_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* detailed_view_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* notification_view_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Trivial item implementation that returns NULL from tray/default/detailed
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// view creation methods.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestNoViewItem : public SystemTrayItem {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNoViewItem() : SystemTrayItem(GetSystemTray()) {}
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateDefaultView(user::LoginStatus status) OVERRIDE {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateDetailedView(user::LoginStatus status) OVERRIDE {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual views::View* CreateNotificationView(
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user::LoginStatus status) OVERRIDE {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyTrayView() OVERRIDE {}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyDefaultView() OVERRIDE {}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyDetailedView() OVERRIDE {}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DestroyNotificationView() OVERRIDE {}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateAfterLoginStatusChange(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user::LoginStatus status) OVERRIDE {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ModalWidgetDelegate : public views::WidgetDelegateView {
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ModalWidgetDelegate() {}
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~ModalWidgetDelegate() {}
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual views::View* GetContentsView() OVERRIDE { return this; }
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ui::ModalType GetModalType() const OVERRIDE {
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return ui::MODAL_TYPE_SYSTEM;
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ModalWidgetDelegate);
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef AshTestBase SystemTrayTest;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayDefaultView) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that closing the bubble destroys it.
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(tray->CloseSystemBubble());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(tray->CloseSystemBubble());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Opening and closing the bubble should change the coloring of the tray.
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayColoring) {
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SystemTray* tray = GetSystemTray();
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // At the beginning the tray coloring is not active.
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(tray->draw_background_as_active());
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Showing the system bubble should show the background as active.
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tray->draw_background_as_active());
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Closing the system menu should change the coloring back to normal.
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tray->CloseSystemBubble());
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunAllPendingInMessageLoop();
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(tray->draw_background_as_active());
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Closing the system bubble through an alignment change should change the
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// system tray coloring back to normal.
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayColoringAfterAlignmentChange) {
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SystemTray* tray = GetSystemTray();
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShelfLayoutManager* manager =
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_BOTTOM);
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // At the beginning the tray coloring is not active.
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(tray->draw_background_as_active());
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Showing the system bubble should show the background as active.
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tray->draw_background_as_active());
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Changing the alignment should close the system bubble and change the
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // background color.
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(tray->draw_background_as_active());
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunAllPendingInMessageLoop();
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The bubble should already be closed by now.
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(tray->CloseSystemBubble());
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayTestItems) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* test_item = new TestItem;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* detailed_item = new TestItem;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(test_item);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(detailed_item);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check items have been added
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::vector<SystemTrayItem*>& items = tray->GetTrayItems();
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::find(items.begin(), items.end(), test_item) != items.end());
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::find(items.begin(), items.end(), detailed_item) != items.end());
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the tray views are created.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->tray_view() != NULL);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->tray_view() != NULL);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure a default views are created.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->default_view() != NULL);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->default_view() != NULL);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show the detailed view, ensure it's created and the default view destroyed.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDetailedView(detailed_item, 0, false, BUBBLE_CREATE_NEW);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->default_view() == NULL);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->detailed_view() != NULL);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show the default view, ensure it's created and the detailed view destroyed.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->default_view() != NULL);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->detailed_view() == NULL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayNoViewItems) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTray* tray = GetSystemTray();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that no crashes occur on items lacking some views.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNoViewItem* no_view_item = new TestNoViewItem;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray->AddTrayItem(no_view_item);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray->ShowDetailedView(no_view_item, 0, false, BUBBLE_USE_EXISTING);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunAllPendingInMessageLoop();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SystemTrayTest, TrayWidgetAutoResizes) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an initial tray item so that the tray gets laid out correctly.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* initial_item = new TestItem;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(initial_item);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size initial_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* new_item = new TestItem;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(new_item);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size new_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding the new item should change the size of the tray.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(initial_size.ToString(), new_size.ToString());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hiding the tray view of the new item should also change the size of the
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tray.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_item->tray_view()->SetVisible(false);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(initial_size.ToString(),
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tray->GetWidget()->GetWindowBoundsInScreen().size().ToString());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_item->tray_view()->SetVisible(true);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_size.ToString(),
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tray->GetWidget()->GetWindowBoundsInScreen().size().ToString());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SystemTrayTest, SystemTrayNotifications) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* test_item = new TestItem;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* detailed_item = new TestItem;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(test_item);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(detailed_item);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the tray views are created.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->tray_view() != NULL);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->tray_view() != NULL);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure a notification view is created.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowNotificationView(test_item);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->notification_view() != NULL);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Show the default view, notification view should remain.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_item->notification_view() != NULL);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Show the detailed view, ensure the notification view remains.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDetailedView(detailed_item, 0, false, BUBBLE_CREATE_NEW);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->detailed_view() != NULL);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->notification_view() != NULL);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Hide the detailed view, ensure the notification view still exists.
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(tray->CloseSystemBubble());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(detailed_item->detailed_view() == NULL);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->notification_view() != NULL);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SystemTrayTest, BubbleCreationTypesTest) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestItem* test_item = new TestItem;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->AddTrayItem(test_item);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the tray views are created.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_item->tray_view() != NULL);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show the default view, ensure the notification view is destroyed.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = test_item->default_view()->GetWidget();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bubble_bounds = widget->GetWindowBoundsInScreen();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDetailedView(test_item, 0, true, BUBBLE_USE_EXISTING);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(test_item->default_view());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bubble_bounds.ToString(), test_item->detailed_view()->GetWidget()->
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWindowBoundsInScreen().ToString());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget, test_item->detailed_view()->GetWidget());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_USE_EXISTING);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bubble_bounds.ToString(), test_item->default_view()->GetWidget()->
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWindowBoundsInScreen().ToString());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(widget, test_item->default_view()->GetWidget());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Tests that the tray is laid out properly and is fully contained within
364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the shelf.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SystemTrayTest, TrayBoundsInWidget) {
366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShelfLayoutManager* manager =
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->shelf_layout_manager();
368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  StatusAreaWidget* widget =
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->shelf()->status_area_widget();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemTray* tray = widget->system_tray();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test in bottom alignment.
373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_BOTTOM);
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect window_bounds = widget->GetWindowBoundsInScreen();
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect tray_bounds = tray->GetBoundsInScreen();
376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test in the left alignment.
382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_bounds = widget->GetWindowBoundsInScreen();
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_bounds = tray->GetBoundsInScreen();
385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Test in the right alignment.
391d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  manager->SetAlignment(SHELF_ALIGNMENT_LEFT);
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_bounds = widget->GetWindowBoundsInScreen();
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tray_bounds = tray->GetBoundsInScreen();
394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.bottom() >= tray_bounds.bottom());
395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.right() >= tray_bounds.right());
396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.x() >= tray_bounds.x());
397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(window_bounds.y() >= tray_bounds.y());
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SystemTrayTest, PersistentBubble) {
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(tray->GetWidget());
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestItem* test_item = new TestItem;
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tray->AddTrayItem(test_item);
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(0));
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Tests for usual default view.
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Activating window.
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(tray->HasSystemBubble());
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  wm::ActivateWindow(window.get());
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_FALSE(tray->HasSystemBubble());
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(tray->HasSystemBubble());
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::Point(5, 5));
4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    generator.ClickLeftButton();
4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_FALSE(tray->HasSystemBubble());
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Same tests for persistent default view.
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  tray->ShowPersistentDefaultView();
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(tray->HasSystemBubble());
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  wm::ActivateWindow(window.get());
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(tray->HasSystemBubble());
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::Point(5, 5));
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    generator.ClickLeftButton();
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(tray->HasSystemBubble());
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS)
442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Accessibility/Settings tray items are available only on cros.
443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_WithSystemModal WithSystemModal
444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define MAYBE_WithSystemModal DISABLED_WithSystemModal
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(SystemTrayTest, MAYBE_WithSystemModal) {
448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Check if the accessibility item is created even with system modal
449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // dialog.
450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Shell::GetInstance()->accessibility_delegate()->SetVirtualKeyboardEnabled(
451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      true);
452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      new ModalWidgetDelegate(),
454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Shell::GetPrimaryRootWindow(),
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      gfx::Rect(0, 0, 100, 100));
456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  widget->Show();
457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SystemTray* tray = GetSystemTray();
459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(tray->HasSystemBubble());
462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const views::View* accessibility =
463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      tray->GetSystemBubble()->bubble_view()->GetViewByID(
464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          test::kAccessibilityTrayItemViewId);
465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(accessibility);
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(accessibility->visible());
467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(tray->GetSystemBubble()->bubble_view()->GetViewByID(
468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      test::kSettingsTrayItemViewId));
469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  widget->Close();
471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // System modal is gone. The bubble should now contains settings
474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // as well.
475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  accessibility = tray->GetSystemBubble()->bubble_view()->GetViewByID(
476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      test::kAccessibilityTrayItemViewId);
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(accessibility);
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(accessibility->visible());
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const views::View* settings =
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      tray->GetSystemBubble()->bubble_view()->GetViewByID(
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          test::kSettingsTrayItemViewId);
483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(settings);
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(settings->visible());
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that if SetVisible(true) is called while animating to hidden that the
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// tray becomes visible, and stops animating to hidden.
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(SystemTrayTest, SetVisibleDuringHideAnimation) {
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SystemTray* tray = GetSystemTray();
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(tray->visible());
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ui::ScopedAnimationDurationScaleMode> animation_duration;
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  animation_duration.reset(
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new ui::ScopedAnimationDurationScaleMode(
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ui::ScopedAnimationDurationScaleMode::SLOW_DURATION));
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tray->SetVisible(false);
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tray->visible());
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0.0f, tray->layer()->GetTargetOpacity());
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tray->SetVisible(true);
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  animation_duration.reset();
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  tray->layer()->GetAnimator()->StopAnimating();
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tray->visible());
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1.0f, tray->layer()->GetTargetOpacity());
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
510