tray_display_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/chromeos/tray_display.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/display/display_manager.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/root_window_controller.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shell.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/tray/system_tray.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/test/ash_test_base.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/test/test_system_tray_delegate.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string16.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/ash_strings.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/display.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/message_center/message_center.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/message_center/notification.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/message_center/notification_list.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/controls/label.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ash { 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace internal { 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetTooltipText(const base::string16& headline, 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::string16& name1, 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& data1, 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::string16& name2, 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& data2) { 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::string16> lines; 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch lines.push_back(headline); 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (data1.empty()) { 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) lines.push_back(name1); 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } else { 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) lines.push_back(l10n_util::GetStringFUTF16( 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name1, base::UTF8ToUTF16(data1))); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!name2.empty()) { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch lines.push_back(l10n_util::GetStringFUTF16( 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name2, base::UTF8ToUTF16(data2))); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return JoinString(lines, '\n'); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbase::string16 GetMirroredTooltipText(const base::string16& headline, 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const base::string16& name, 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& data) { 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return GetTooltipText(headline, name, data, base::string16(), ""); 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetFirstDisplayName() { 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(display_manager->GetDisplayNameForId( 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->first_display_id())); 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetSecondDisplayName() { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16( 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->display_manager()->GetDisplayNameForId( 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay().id())); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::string16 GetMirroredDisplayName() { 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(display_manager->GetDisplayNameForId( 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) display_manager->mirrored_display_id())); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TrayDisplayTest : public ash::test::AshTestBase { 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TrayDisplayTest(); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~TrayDisplayTest(); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetUp() OVERRIDE; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SystemTray* tray() { return tray_; } 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch TrayDisplay* tray_display() { return tray_display_; } 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CloseNotification(); 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool IsDisplayVisibleInTray() const; 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16 GetTrayDisplayText() const; 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16 GetTrayDisplayTooltipText() const; 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16 GetDisplayNotificationText() const; 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16 GetDisplayNotificationAdditionalText() const; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const message_center::Notification* GetDisplayNotification() const; 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Weak reference, owned by Shell. 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SystemTray* tray_; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Weak reference, owned by |tray_|. 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TrayDisplay* tray_display_; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(TrayDisplayTest); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTrayDisplayTest::TrayDisplayTest() : tray_(NULL), tray_display_(NULL) { 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTrayDisplayTest::~TrayDisplayTest() { 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TrayDisplayTest::SetUp() { 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ash::test::AshTestBase::SetUp(); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray_ = Shell::GetPrimaryRootWindowController()->GetSystemTray(); 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray_display_ = new TrayDisplay(tray_); 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray_->AddTrayItem(tray_display_); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TrayDisplayTest::CloseNotification() { 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) message_center::MessageCenter::Get()->RemoveNotification( 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TrayDisplay::kNotificationId, false); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RunAllPendingInMessageLoop(); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool TrayDisplayTest::IsDisplayVisibleInTray() const { 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return tray_->HasSystemBubble() && 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) tray_display_->default_view() && 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray_display_->default_view()->visible(); 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 TrayDisplayTest::GetTrayDisplayText() const { 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tray_display_->GetDefaultViewMessage(); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 TrayDisplayTest::GetTrayDisplayTooltipText() const { 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!tray_display_->default_view()) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::string16(); 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 tooltip; 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!tray_display_->default_view()->GetTooltipText(gfx::Point(), &tooltip)) 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::string16(); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tooltip; 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 TrayDisplayTest::GetDisplayNotificationText() const { 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const message_center::Notification* notification = GetDisplayNotification(); 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return notification ? notification->title() : base::string16(); 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::string16 TrayDisplayTest::GetDisplayNotificationAdditionalText() const { 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const message_center::Notification* notification = GetDisplayNotification(); 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return notification ? notification->message() : base::string16(); 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const message_center::Notification* TrayDisplayTest::GetDisplayNotification() 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const { 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const message_center::NotificationList::Notifications notifications = 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_center::MessageCenter::Get()->GetVisibleNotifications(); 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (message_center::NotificationList::Notifications::const_iterator iter = 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) notifications.begin(); iter != notifications.end(); ++iter) { 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if ((*iter)->id() == TrayDisplay::kNotificationId) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return *iter; 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return NULL; 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, NoInternalDisplay) { 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(IsDisplayVisibleInTray()); 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 expected = l10n_util::GetStringUTF16( 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL); 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 first_name = GetFirstDisplayName(); 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), "200x200"), 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // mirroring 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->display_manager()->SetSoftwareMirroring(true); 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected = l10n_util::GetStringUTF16( 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL); 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, InternalDisplay) { 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(IsDisplayVisibleInTray()); 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Extended 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 expected = l10n_util::GetStringFUTF16( 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()); 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), "200x200"), 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Mirroring 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetSoftwareMirroring(true); 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected = l10n_util::GetStringFUTF16( 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()); 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, InternalDisplayResized) { 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5"); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Shows the tray_display even though there's a single-display. 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 internal_info = l10n_util::GetStringFUTF16( 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFirstDisplayName(), base::UTF8ToUTF16("600x600")); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(internal_info, GetTrayDisplayText()); 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(base::string16(), GetFirstDisplayName(), "600x600", 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16(), std::string()), 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Extended 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5,200x200"); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 expected = l10n_util::GetStringFUTF16( 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "600x600", 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), "200x200"), 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Mirroring 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetSoftwareMirroring(true); 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5,200x200"); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected = l10n_util::GetStringFUTF16( 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()); 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "600x600"), 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Closed lid mode. 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) display_manager->SetSoftwareMirroring(false); 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateDisplay("400x400@1.5,200x200"); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Display::SetInternalDisplayId(ScreenUtil::GetSecondaryDisplay().id()); 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateDisplay("400x400@1.5"); 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(IsDisplayVisibleInTray()); 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expected = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED); 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expected, GetTrayDisplayText()); 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ( 2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetTooltipText( 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expected, GetFirstDisplayName(), "600x600", base::string16(), ""), 2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetTrayDisplayTooltipText()); 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, ExternalDisplayResized) { 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Shows the tray_display even though there's a single-display. 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(IsDisplayVisibleInTray()); 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Extended 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200@1.5"); 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Display& secondary_display = ScreenUtil::GetSecondaryDisplay(); 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 expected = l10n_util::GetStringFUTF16( 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch l10n_util::GetStringFUTF16( 296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, 297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetSecondDisplayName(), 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(secondary_display.size().ToString()))); 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), "300x300"), 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 304d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Mirroring 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetSoftwareMirroring(true); 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200@1.5"); 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected = l10n_util::GetStringFUTF16( 3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()); 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(expected, GetTrayDisplayText()); 312d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, OverscanDisplay) { 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,300x300/o"); 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(IsDisplayVisibleInTray()); 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // /o creates the default overscan, and if overscan is set, the annotation 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // should be the size. 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 overscan = l10n_util::GetStringUTF16( 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN); 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 headline = l10n_util::GetStringFUTF16( 329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, 330ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch l10n_util::GetStringFUTF16( 331ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetSecondDisplayName(), base::UTF8ToUTF16("286x286"))); 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string second_data = l10n_util::GetStringFUTF8( 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION, 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16("286x286"), overscan); 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400", 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), second_data), 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // reset the overscan. 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetOverscanInsets( 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay().id(), gfx::Insets()); 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch headline = l10n_util::GetStringFUTF16( 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, 345ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch l10n_util::GetStringFUTF16( 346ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, 347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetSecondDisplayName(), overscan)); 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch second_data = l10n_util::GetStringFUTF8( 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION, 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16("300x300"), overscan); 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400", 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetSecondDisplayName(), second_data), 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetTrayDisplayTooltipText()); 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 356d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(TrayDisplayTest, UpdateDuringDisplayConfigurationChange) { 357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(IsDisplayVisibleInTray()); 359d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 360d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateDisplay("400x400@1.5"); 361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(tray()->HasSystemBubble()); 362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(IsDisplayVisibleInTray()); 363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 internal_info = l10n_util::GetStringFUTF16( 364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFirstDisplayName(), base::UTF8ToUTF16("600x600")); 366d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(internal_info, GetTrayDisplayText()); 367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(GetTooltipText(base::string16(), GetFirstDisplayName(), "600x600", 368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16(), std::string()), 369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetTrayDisplayTooltipText()); 370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 371d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateDisplay("400x400,200x200"); 372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(tray()->HasSystemBubble()); 373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(IsDisplayVisibleInTray()); 374d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 expected = l10n_util::GetStringUTF16( 375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL); 376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 first_name = GetFirstDisplayName(); 377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(expected, GetTrayDisplayText()); 378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", 379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetSecondDisplayName(), "200x200"), 380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetTrayDisplayTooltipText()); 381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateDisplay("400x400@1.5"); 383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Back to the default state, the display tray item should disappear. 386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateDisplay("400x400"); 387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(tray()->HasSystemBubble()); 388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(IsDisplayVisibleInTray()); 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(TrayDisplayTest, DisplayNotifications) { 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test::TestSystemTrayDelegate* tray_delegate = 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<test::TestSystemTrayDelegate*>( 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->system_tray_delegate()); 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tray_delegate->set_should_show_display_notification(true); 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(GetDisplayNotificationText().empty()); 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // rotation. 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400/r"); 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ( 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch l10n_util::GetStringFUTF16( 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch l10n_util::GetStringUTF16( 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDisplayNotificationText()); 4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ( 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch l10n_util::GetStringFUTF16( 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch l10n_util::GetStringUTF16( 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION)), 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDisplayNotificationText()); 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // UI-scale 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5"); 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFirstDisplayName(), base::UTF8ToUTF16("600x600")), 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // UI-scale to 1.0 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFirstDisplayName(), base::UTF8ToUTF16("400x400")), 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // No-update 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400"); 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(GetDisplayNotificationText().empty()); 4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Extended. 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()), 454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Mirroring. 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetSoftwareMirroring(true); 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()), 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Back to extended. 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CloseNotification(); 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_manager->SetSoftwareMirroring(false); 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400,200x200"); 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()), 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Resize the first display. 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5,200x200"); 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFirstDisplayName(), base::UTF8ToUTF16("600x600")), 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Rotate the second. 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x400@1.5,200x200/r"); 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ( 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch l10n_util::GetStringFUTF16( 490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, 491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetSecondDisplayName(), 492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch l10n_util::GetStringUTF16( 493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDisplayNotificationText()); 4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); 4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Enters closed lid mode. 4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateDisplay("400x400@1.5,200x200"); 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Display::SetInternalDisplayId(ScreenUtil::GetSecondaryDisplay().id()); 5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateDisplay("400x400@1.5"); 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED), 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetDisplayNotificationText()); 5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ( 5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED_DESCRIPTION), 5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetDisplayNotificationAdditionalText()); 506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 508ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(TrayDisplayTest, DisplayConfigurationChangedTwice) { 509ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch test::TestSystemTrayDelegate* tray_delegate = 510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static_cast<test::TestSystemTrayDelegate*>( 511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Shell::GetInstance()->system_tray_delegate()); 512ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch tray_delegate->set_should_show_display_notification(true); 513ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 514ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UpdateDisplay("400x400,200x200"); 515ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ( 516ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch l10n_util::GetStringUTF16( 517ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), 518ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetDisplayNotificationText()); 519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // OnDisplayConfigurationChanged() may be called more than once for a single 521ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // update display in case of primary is swapped or recovered from dock mode. 522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Should not remove the notification in such case. 523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch tray_display()->OnDisplayConfigurationChanged(); 524ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_EQ( 525ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch l10n_util::GetStringUTF16( 526ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), 527ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetDisplayNotificationText()); 528ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 529ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Back to the single display. It SHOULD remove the notification since the 530ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // information is stale. 531ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UpdateDisplay("400x400"); 532ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_TRUE(GetDisplayNotificationText().empty()); 533ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 534ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 535c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochTEST_F(TrayDisplayTest, UpdateAfterSuppressDisplayNotification) { 536c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch UpdateDisplay("400x400,200x200"); 537c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 538c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch test::TestSystemTrayDelegate* tray_delegate = 539c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch static_cast<test::TestSystemTrayDelegate*>( 540c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch Shell::GetInstance()->system_tray_delegate()); 541c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch tray_delegate->set_should_show_display_notification(true); 542c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 543c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // rotate the second. 544c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch UpdateDisplay("400x400,200x200/r"); 545c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch EXPECT_EQ( 546c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch l10n_util::GetStringFUTF16( 547c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, 548c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch GetSecondDisplayName(), 549c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch l10n_util::GetStringUTF16( 550c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), 551c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch GetDisplayNotificationText()); 552c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch} 553c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace internal 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace ash 556