1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/resolution_notification_controller.h" 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/display_manager.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h" 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/shell.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/test/ash_test_base.h" 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/ash_strings.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/size.h" 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/message_center/message_center.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/message_center/notification.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/message_center/notification_list.h" 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace ash { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExpectedNotificationMessage(int64 display_id, 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& new_resolution) { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16( 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16( 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayNameForId( 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_id)), 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(new_resolution.ToString())); 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExpectedFallbackNotificationMessage( 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 display_id, 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& specified_resolution, 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& fallback_resolution) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16( 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TO_UNSUPPORTED, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16( 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayNameForId( 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_id)), 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(specified_resolution.ToString()), 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(fallback_resolution.ToString())); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass ResolutionNotificationControllerTest : public ash::test::AshTestBase { 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResolutionNotificationControllerTest() 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : accept_count_(0) { 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual ~ResolutionNotificationControllerTest() {} 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected: 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SetUp() OVERRIDE { 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::test::AshTestBase::SetUp(); 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResolutionNotificationController::SuppressTimerForTest(); 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetDisplayResolutionAndNotifyWithResolution( 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Display& display, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& new_resolution, 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& actual_new_resolution) { 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DisplayInfo& info = display_manager->GetDisplayInfo(display.id()); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DisplayMode old_mode(info.size_in_pixel(), 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 60 /* refresh_rate */, 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* interlaced */, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) false /* native */); 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DisplayMode new_mode = old_mode; 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new_mode.size = new_resolution; 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (display_manager->SetDisplayMode(display.id(), new_mode)) { 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) controller()->PrepareNotification( 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) display.id(), 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) old_mode, 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new_mode, 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&ResolutionNotificationControllerTest::OnAccepted, 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this))); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // OnConfigurationChanged event won't be emitted in the test environment, 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // so invoke UpdateDisplay() to emit that event explicitly. 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<DisplayInfo> info_list; 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 id = display_manager->GetDisplayAt(i).id(); 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DisplayInfo info = display_manager->GetDisplayInfo(id); 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (display.id() == id) { 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect bounds = info.bounds_in_native(); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bounds.set_size(actual_new_resolution); 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info.SetBounds(bounds); 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) info_list.push_back(info); 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) display_manager->OnNativeDisplaysChanged(info_list); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetDisplayResolutionAndNotify(const gfx::Display& display, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& new_resolution) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetDisplayResolutionAndNotifyWithResolution( 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display, new_resolution, new_resolution); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static base::string16 GetNotificationMessage() { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const message_center::NotificationList::Notifications& notifications = 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_center::MessageCenter::Get()->GetVisibleNotifications(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (message_center::NotificationList::Notifications::const_iterator iter = 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) notifications.begin(); iter != notifications.end(); ++iter) { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((*iter)->id() == ResolutionNotificationController::kNotificationId) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (*iter)->title(); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void ClickOnNotification() { 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message_center::MessageCenter::Get()->ClickOnNotification( 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResolutionNotificationController::kNotificationId); 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void ClickOnNotificationButton(int index) { 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message_center::MessageCenter::Get()->ClickOnNotificationButton( 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResolutionNotificationController::kNotificationId, index); 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void CloseNotification() { 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) message_center::MessageCenter::Get()->RemoveNotification( 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResolutionNotificationController::kNotificationId, true /* by_user */); 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool IsNotificationVisible() { 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return message_center::MessageCenter::Get()->FindVisibleNotificationById( 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResolutionNotificationController::kNotificationId); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void TickTimer() { 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch controller()->OnTimerTick(); 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static ResolutionNotificationController* controller() { 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return Shell::GetInstance()->resolution_notification_controller(); 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int accept_count() const { 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return accept_count_; 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void OnAccepted() { 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(controller()->DoesNotificationTimeout()); 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch accept_count_++; 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int accept_count_; 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationControllerTest); 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Basic behaviors and verifies it doesn't cause crashes. 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, Basic) { 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60"); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ASSERT_EQ(0, accept_count()); 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Changes the resolution and apply the result. 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify( 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200)); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()); 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(controller()->DoesNotificationTimeout()); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ExpectedNotificationMessage(id2, gfx::Size(200, 200)), 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetNotificationMessage()); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0, mode.refresh_rate); 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Click the revert button, which reverts to the best resolution. 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ClickOnNotificationButton(0); 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, accept_count()); 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("250x250", mode.size.ToString()); 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(59.0, mode.refresh_rate); 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, ClickMeansAccept) { 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%57|200x200%58,250x250#250x250%59|200x200%60"); 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ASSERT_EQ(0, accept_count()); 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Changes the resolution and apply the result. 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify( 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200)); 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()); 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(controller()->DoesNotificationTimeout()); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0, mode.refresh_rate); 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Click the revert button, which reverts the resolution. 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ClickOnNotification(); 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, accept_count()); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0, mode.refresh_rate); 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, AcceptButton) { 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%59|200x200%60"); 236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); 238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()); 239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If there's a single display only, it will have timeout and the first button 241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // becomes accept. 242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(controller()->DoesNotificationTimeout()); 243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ClickOnNotificationButton(0); 244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, accept_count()); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_manager->GetSelectedModeForDisplayId(display.id(), &mode)); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0f, mode.refresh_rate); 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // In that case the second button is revert. 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%59|200x200%60"); 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); 255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()); 256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(controller()->DoesNotificationTimeout()); 258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ClickOnNotificationButton(1); 259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, accept_count()); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_manager->GetSelectedModeForDisplayId(display.id(), &mode)); 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("300x300", mode.size.ToString()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(59.0f, mode.refresh_rate); 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ResolutionNotificationControllerTest, Close) { 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!SupportsMultipleDisplays()) 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("100x100,150x150#150x150%59|200x200%60"); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ash::Shell::GetInstance()->display_manager(); 2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_EQ(0, accept_count()); 2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(IsNotificationVisible()); 2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Changes the resolution and apply the result. 2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetDisplayResolutionAndNotify( 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200)); 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(IsNotificationVisible()); 2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(controller()->DoesNotificationTimeout()); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0f, mode.refresh_rate); 2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Close the notification (imitates clicking [x] button). Also verifies if 2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // this does not cause a crash. See crbug.com/271784 2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CloseNotification(); 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RunAllPendingInMessageLoop(); 2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(IsNotificationVisible()); 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1, accept_count()); 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, Timeout) { 297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%59|200x200%60"); 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (int i = 0; i < ResolutionNotificationController::kTimeoutInSec; ++i) { 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()) << "notification is closed after " 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch << i << "-th timer tick"; 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TickTimer(); 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, accept_count()); 312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_manager->GetSelectedModeForDisplayId(display.id(), &mode)); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("300x300", mode.size.ToString()); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(59.0f, mode.refresh_rate); 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, DisplayDisconnected) { 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%56|200x200%57," 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "200x200#250x250%58|200x200%59|100x100%60"); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify( 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(100, 100)); 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ASSERT_TRUE(IsNotificationVisible()); 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Disconnects the secondary display and verifies it doesn't cause crashes. 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%56|200x200%57"); 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, accept_count()); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Size resolution; 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(59.0f, mode.refresh_rate); 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) { 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!SupportsMultipleDisplays()) 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%56|200x200%57," 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "250x250#250x250%58|200x200%59"); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ash::Shell::GetInstance()->display_manager(); 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify( 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(200, 200)); 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(IsNotificationVisible()); 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(controller()->DoesNotificationTimeout()); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(59.0f, mode.refresh_rate); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Invokes SetDisplayResolutionAndNotify during the previous notification is 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // visible. 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetDisplayResolutionAndNotify( 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), gfx::Size(250, 250)); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("250x250", mode.size.ToString()); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(58.0f, mode.refresh_rate); 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Then, click the revert button. Although |old_resolution| for the second 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // SetDisplayResolutionAndNotify is 200x200, it should revert to the original 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // size 250x250. 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ClickOnNotificationButton(0); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunAllPendingInMessageLoop(); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsNotificationVisible()); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, accept_count()); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("250x250", mode.size.ToString()); 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(58.0f, mode.refresh_rate); 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResolutionNotificationControllerTest, Fallback) { 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!SupportsMultipleDisplays()) 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateDisplay("300x300#300x300%56|200x200%57," 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "250x250#250x250%58|220x220%59|200x200%60"); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 id2 = ash::ScreenUtil::GetSecondaryDisplay().id(); 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::DisplayManager* display_manager = 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::Shell::GetInstance()->display_manager(); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(0, accept_count()); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsNotificationVisible()); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Changes the resolution and apply the result. 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetDisplayResolutionAndNotifyWithResolution( 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScreenUtil::GetSecondaryDisplay(), 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(220, 220), 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(200, 200)); 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsNotificationVisible()); 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(controller()->DoesNotificationTimeout()); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedFallbackNotificationMessage( 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) id2, gfx::Size(220, 220), gfx::Size(200, 200)), 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetNotificationMessage()); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisplayMode mode; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("200x200", mode.size.ToString()); 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(60.0f, mode.refresh_rate); 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Click the revert button, which reverts to the best resolution. 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ClickOnNotificationButton(0); 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunAllPendingInMessageLoop(); 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(IsNotificationVisible()); 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, accept_count()); 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(display_manager->GetSelectedModeForDisplayId(id2, &mode)); 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("250x250", mode.size.ToString()); 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(58.0f, mode.refresh_rate); 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace ash 424