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