| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/display/resolution_notification_controller.h" | 5 #include "ash/display/resolution_notification_controller.h" |
| 6 | 6 |
| 7 #include "ash/display/display_manager.h" | 7 #include "ash/display/display_manager.h" |
| 8 #include "ash/screen_ash.h" | 8 #include "ash/screen_ash.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/test/ash_test_base.h" | 10 #include "ash/test/ash_test_base.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 Shell::GetInstance()->resolution_notification_controller()-> | 36 Shell::GetInstance()->resolution_notification_controller()-> |
| 37 SetDisplayResolutionAndNotify( | 37 SetDisplayResolutionAndNotify( |
| 38 display.id(), | 38 display.id(), |
| 39 info.size_in_pixel(), | 39 info.size_in_pixel(), |
| 40 new_resolution, | 40 new_resolution, |
| 41 base::Bind(&ResolutionNotificationControllerTest::OnAccepted, | 41 base::Bind(&ResolutionNotificationControllerTest::OnAccepted, |
| 42 base::Unretained(this))); | 42 base::Unretained(this))); |
| 43 | 43 |
| 44 // OnConfigurationChanged event won't be emitted in the test environment, | 44 // OnConfigurationChanged event won't be emitted in the test environment, |
| 45 // so invoke UpdateDisplay() to emit that event explicitly. | 45 // so invoke UpdateDisplay() to emit that event explicitly. |
| 46 std::string display_spec; | 46 std::vector<DisplayInfo> info_list; |
| 47 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { | 47 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { |
| 48 if (i > 0) | |
| 49 display_spec.append(","); | |
| 50 int64 id = display_manager->GetDisplayAt(i).id(); | 48 int64 id = display_manager->GetDisplayAt(i).id(); |
| 51 gfx::Size size = (display.id() == id) ? | 49 DisplayInfo info = display_manager->GetDisplayInfo(id); |
| 52 new_resolution : display_manager->GetDisplayInfo(id).size_in_pixel(); | 50 if (display.id() == id) { |
| 53 display_spec.append(size.ToString()); | 51 gfx::Rect bounds = info.bounds_in_pixel(); |
| 52 bounds.set_size(new_resolution); |
| 53 info.SetBounds(bounds); |
| 54 } |
| 55 info_list.push_back(info); |
| 54 } | 56 } |
| 55 UpdateDisplay(display_spec); | 57 display_manager->OnNativeDisplaysChanged(info_list); |
| 56 RunAllPendingInMessageLoop(); | 58 RunAllPendingInMessageLoop(); |
| 57 } | 59 } |
| 58 | 60 |
| 59 void ClickOnNotification() { | 61 void ClickOnNotification() { |
| 60 message_center::MessageCenter::Get()->ClickOnNotification( | 62 message_center::MessageCenter::Get()->ClickOnNotification( |
| 61 ResolutionNotificationController::kNotificationId); | 63 ResolutionNotificationController::kNotificationId); |
| 62 } | 64 } |
| 63 | 65 |
| 64 void ClickOnNotificationButton(int index) { | 66 void ClickOnNotificationButton(int index) { |
| 65 message_center::MessageCenter::Get()->ClickOnNotificationButton( | 67 message_center::MessageCenter::Get()->ClickOnNotificationButton( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 92 int accept_count_; | 94 int accept_count_; |
| 93 | 95 |
| 94 DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationControllerTest); | 96 DISALLOW_COPY_AND_ASSIGN(ResolutionNotificationControllerTest); |
| 95 }; | 97 }; |
| 96 | 98 |
| 97 // Basic behaviors and verifies it doesn't cause crashes. | 99 // Basic behaviors and verifies it doesn't cause crashes. |
| 98 TEST_F(ResolutionNotificationControllerTest, Basic) { | 100 TEST_F(ResolutionNotificationControllerTest, Basic) { |
| 99 if (!SupportsMultipleDisplays()) | 101 if (!SupportsMultipleDisplays()) |
| 100 return; | 102 return; |
| 101 | 103 |
| 102 UpdateDisplay("100x100,150x150"); | 104 UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200"); |
| 103 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); | 105 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); |
| 104 ash::internal::DisplayManager* display_manager = | 106 ash::internal::DisplayManager* display_manager = |
| 105 ash::Shell::GetInstance()->display_manager(); | 107 ash::Shell::GetInstance()->display_manager(); |
| 106 ASSERT_EQ(0, accept_count()); | 108 ASSERT_EQ(0, accept_count()); |
| 107 EXPECT_FALSE(IsNotificationVisible()); | 109 EXPECT_FALSE(IsNotificationVisible()); |
| 108 | 110 |
| 109 // Changes the resolution and apply the result. | 111 // Changes the resolution and apply the result. |
| 110 SetDisplayResolutionAndNotify( | 112 SetDisplayResolutionAndNotify( |
| 111 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); | 113 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); |
| 112 EXPECT_TRUE(IsNotificationVisible()); | 114 EXPECT_TRUE(IsNotificationVisible()); |
| 113 EXPECT_FALSE(controller()->DoesNotificationTimeout()); | 115 EXPECT_FALSE(controller()->DoesNotificationTimeout()); |
| 114 gfx::Size resolution; | 116 gfx::Size resolution; |
| 115 EXPECT_TRUE( | 117 EXPECT_TRUE( |
| 116 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 118 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 117 EXPECT_EQ("200x200", resolution.ToString()); | 119 EXPECT_EQ("200x200", resolution.ToString()); |
| 118 | 120 |
| 119 // Click the revert button, which reverts the resolution. | 121 // Click the revert button, which reverts to the best resolution. |
| 120 ClickOnNotificationButton(0); | 122 ClickOnNotificationButton(0); |
| 121 RunAllPendingInMessageLoop(); | 123 RunAllPendingInMessageLoop(); |
| 122 EXPECT_FALSE(IsNotificationVisible()); | 124 EXPECT_FALSE(IsNotificationVisible()); |
| 123 EXPECT_EQ(0, accept_count()); | 125 EXPECT_EQ(0, accept_count()); |
| 124 EXPECT_TRUE( | 126 EXPECT_FALSE( |
| 125 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 127 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 126 EXPECT_EQ("150x150", resolution.ToString()); | |
| 127 } | 128 } |
| 128 | 129 |
| 129 TEST_F(ResolutionNotificationControllerTest, ClickMeansAccept) { | 130 TEST_F(ResolutionNotificationControllerTest, ClickMeansAccept) { |
| 130 if (!SupportsMultipleDisplays()) | 131 if (!SupportsMultipleDisplays()) |
| 131 return; | 132 return; |
| 132 | 133 |
| 133 UpdateDisplay("100x100,150x150"); | 134 UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200"); |
| 134 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); | 135 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); |
| 135 ash::internal::DisplayManager* display_manager = | 136 ash::internal::DisplayManager* display_manager = |
| 136 ash::Shell::GetInstance()->display_manager(); | 137 ash::Shell::GetInstance()->display_manager(); |
| 137 ASSERT_EQ(0, accept_count()); | 138 ASSERT_EQ(0, accept_count()); |
| 138 EXPECT_FALSE(IsNotificationVisible()); | 139 EXPECT_FALSE(IsNotificationVisible()); |
| 139 | 140 |
| 140 // Changes the resolution and apply the result. | 141 // Changes the resolution and apply the result. |
| 141 SetDisplayResolutionAndNotify( | 142 SetDisplayResolutionAndNotify( |
| 142 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); | 143 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); |
| 143 EXPECT_TRUE(IsNotificationVisible()); | 144 EXPECT_TRUE(IsNotificationVisible()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 157 EXPECT_EQ("200x200", resolution.ToString()); | 158 EXPECT_EQ("200x200", resolution.ToString()); |
| 158 } | 159 } |
| 159 | 160 |
| 160 TEST_F(ResolutionNotificationControllerTest, AcceptButton) { | 161 TEST_F(ResolutionNotificationControllerTest, AcceptButton) { |
| 161 if (!SupportsMultipleDisplays()) | 162 if (!SupportsMultipleDisplays()) |
| 162 return; | 163 return; |
| 163 | 164 |
| 164 ash::internal::DisplayManager* display_manager = | 165 ash::internal::DisplayManager* display_manager = |
| 165 ash::Shell::GetInstance()->display_manager(); | 166 ash::Shell::GetInstance()->display_manager(); |
| 166 | 167 |
| 167 UpdateDisplay("100x100"); | 168 UpdateDisplay("300x300#300x300|200x200"); |
| 168 const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); | 169 const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); |
| 169 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); | 170 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); |
| 170 EXPECT_TRUE(IsNotificationVisible()); | 171 EXPECT_TRUE(IsNotificationVisible()); |
| 171 | 172 |
| 172 // If there's a single display only, it will have timeout and the first button | 173 // If there's a single display only, it will have timeout and the first button |
| 173 // becomes accept. | 174 // becomes accept. |
| 174 EXPECT_TRUE(controller()->DoesNotificationTimeout()); | 175 EXPECT_TRUE(controller()->DoesNotificationTimeout()); |
| 175 ClickOnNotificationButton(0); | 176 ClickOnNotificationButton(0); |
| 176 EXPECT_FALSE(IsNotificationVisible()); | 177 EXPECT_FALSE(IsNotificationVisible()); |
| 177 EXPECT_EQ(1, accept_count()); | 178 EXPECT_EQ(1, accept_count()); |
| 178 gfx::Size resolution; | 179 gfx::Size resolution; |
| 179 EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId( | 180 EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId( |
| 180 display.id(), &resolution)); | 181 display.id(), &resolution)); |
| 181 EXPECT_EQ("200x200", resolution.ToString()); | 182 EXPECT_EQ("200x200", resolution.ToString()); |
| 182 | 183 |
| 183 // In that case the second button is revert. | 184 // In that case the second button is revert. |
| 184 UpdateDisplay("100x100"); | 185 UpdateDisplay("300x300#300x300|200x200"); |
| 185 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); | 186 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); |
| 186 EXPECT_TRUE(IsNotificationVisible()); | 187 EXPECT_TRUE(IsNotificationVisible()); |
| 187 | 188 |
| 188 EXPECT_TRUE(controller()->DoesNotificationTimeout()); | 189 EXPECT_TRUE(controller()->DoesNotificationTimeout()); |
| 189 ClickOnNotificationButton(1); | 190 ClickOnNotificationButton(1); |
| 190 EXPECT_FALSE(IsNotificationVisible()); | 191 EXPECT_FALSE(IsNotificationVisible()); |
| 191 EXPECT_EQ(1, accept_count()); | 192 EXPECT_EQ(1, accept_count()); |
| 192 EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId( | 193 EXPECT_FALSE(display_manager->GetSelectedResolutionForDisplayId( |
| 193 display.id(), &resolution)); | 194 display.id(), &resolution)); |
| 194 EXPECT_EQ("100x100", resolution.ToString()); | |
| 195 } | 195 } |
| 196 | 196 |
| 197 TEST_F(ResolutionNotificationControllerTest, Timeout) { | 197 TEST_F(ResolutionNotificationControllerTest, Timeout) { |
| 198 if (!SupportsMultipleDisplays()) | 198 if (!SupportsMultipleDisplays()) |
| 199 return; | 199 return; |
| 200 | 200 |
| 201 UpdateDisplay("100x100"); | 201 UpdateDisplay("300x300#300x300|200x200"); |
| 202 const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); | 202 const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay(); |
| 203 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); | 203 SetDisplayResolutionAndNotify(display, gfx::Size(200, 200)); |
| 204 | 204 |
| 205 for (int i = 0; i < ResolutionNotificationController::kTimeoutInSec; ++i) { | 205 for (int i = 0; i < ResolutionNotificationController::kTimeoutInSec; ++i) { |
| 206 EXPECT_TRUE(IsNotificationVisible()) << "notification is closed after " | 206 EXPECT_TRUE(IsNotificationVisible()) << "notification is closed after " |
| 207 << i << "-th timer tick"; | 207 << i << "-th timer tick"; |
| 208 TickTimer(); | 208 TickTimer(); |
| 209 RunAllPendingInMessageLoop(); | 209 RunAllPendingInMessageLoop(); |
| 210 } | 210 } |
| 211 EXPECT_FALSE(IsNotificationVisible()); | 211 EXPECT_FALSE(IsNotificationVisible()); |
| 212 EXPECT_EQ(0, accept_count()); | 212 EXPECT_EQ(0, accept_count()); |
| 213 gfx::Size resolution; | 213 gfx::Size resolution; |
| 214 ash::internal::DisplayManager* display_manager = | 214 ash::internal::DisplayManager* display_manager = |
| 215 ash::Shell::GetInstance()->display_manager(); | 215 ash::Shell::GetInstance()->display_manager(); |
| 216 EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId( | 216 EXPECT_FALSE(display_manager->GetSelectedResolutionForDisplayId( |
| 217 display.id(), &resolution)); | 217 display.id(), &resolution)); |
| 218 EXPECT_EQ("100x100", resolution.ToString()); | |
| 219 } | 218 } |
| 220 | 219 |
| 221 TEST_F(ResolutionNotificationControllerTest, DisplayDisconnected) { | 220 TEST_F(ResolutionNotificationControllerTest, DisplayDisconnected) { |
| 222 if (!SupportsMultipleDisplays()) | 221 if (!SupportsMultipleDisplays()) |
| 223 return; | 222 return; |
| 224 | 223 |
| 225 UpdateDisplay("100x100,150x150"); | 224 UpdateDisplay("300x300#300x300|200x200,200x200#250x250|200x200|100x100"); |
| 226 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); | 225 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); |
| 227 ash::internal::DisplayManager* display_manager = | 226 ash::internal::DisplayManager* display_manager = |
| 228 ash::Shell::GetInstance()->display_manager(); | 227 ash::Shell::GetInstance()->display_manager(); |
| 229 SetDisplayResolutionAndNotify( | 228 SetDisplayResolutionAndNotify( |
| 230 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); | 229 ScreenAsh::GetSecondaryDisplay(), gfx::Size(100, 100)); |
| 231 ASSERT_TRUE(IsNotificationVisible()); | 230 ASSERT_TRUE(IsNotificationVisible()); |
| 232 | 231 |
| 233 // Disconnects the secondary display and verifies it doesn't cause crashes. | 232 // Disconnects the secondary display and verifies it doesn't cause crashes. |
| 234 UpdateDisplay("100x100"); | 233 UpdateDisplay("300x300#300x300|200x200"); |
| 235 RunAllPendingInMessageLoop(); | 234 RunAllPendingInMessageLoop(); |
| 236 EXPECT_FALSE(IsNotificationVisible()); | 235 EXPECT_FALSE(IsNotificationVisible()); |
| 237 EXPECT_EQ(0, accept_count()); | 236 EXPECT_EQ(0, accept_count()); |
| 238 gfx::Size resolution; | 237 gfx::Size resolution; |
| 239 EXPECT_TRUE( | 238 EXPECT_TRUE( |
| 240 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 239 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 241 EXPECT_EQ("150x150", resolution.ToString()); | 240 EXPECT_EQ("200x200", resolution.ToString()); |
| 242 } | 241 } |
| 243 | 242 |
| 244 TEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) { | 243 TEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) { |
| 245 if (!SupportsMultipleDisplays()) | 244 if (!SupportsMultipleDisplays()) |
| 246 return; | 245 return; |
| 247 | 246 |
| 248 UpdateDisplay("100x100,150x150"); | 247 UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200"); |
| 249 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); | 248 int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id(); |
| 250 ash::internal::DisplayManager* display_manager = | 249 ash::internal::DisplayManager* display_manager = |
| 251 ash::Shell::GetInstance()->display_manager(); | 250 ash::Shell::GetInstance()->display_manager(); |
| 252 | 251 |
| 253 SetDisplayResolutionAndNotify( | 252 SetDisplayResolutionAndNotify( |
| 254 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); | 253 ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200)); |
| 255 EXPECT_TRUE(IsNotificationVisible()); | 254 EXPECT_TRUE(IsNotificationVisible()); |
| 256 EXPECT_FALSE(controller()->DoesNotificationTimeout()); | 255 EXPECT_FALSE(controller()->DoesNotificationTimeout()); |
| 257 gfx::Size resolution; | 256 gfx::Size resolution; |
| 258 EXPECT_TRUE( | 257 EXPECT_TRUE( |
| 259 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 258 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 260 EXPECT_EQ("200x200", resolution.ToString()); | 259 EXPECT_EQ("200x200", resolution.ToString()); |
| 261 | 260 |
| 262 // Invokes SetDisplayResolutionAndNotify during the previous notification is | 261 // Invokes SetDisplayResolutionAndNotify during the previous notification is |
| 263 // visible. | 262 // visible. |
| 264 SetDisplayResolutionAndNotify( | 263 SetDisplayResolutionAndNotify( |
| 265 ScreenAsh::GetSecondaryDisplay(), gfx::Size(250, 250)); | 264 ScreenAsh::GetSecondaryDisplay(), gfx::Size(250, 250)); |
| 266 EXPECT_TRUE( | 265 EXPECT_FALSE( |
| 267 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 266 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 268 EXPECT_EQ("250x250", resolution.ToString()); | |
| 269 | 267 |
| 270 // Then, click the revert button. Although |old_resolution| for the second | 268 // Then, click the revert button. Although |old_resolution| for the second |
| 271 // SetDisplayResolutionAndNotify is 200x200, it should revert to the original | 269 // SetDisplayResolutionAndNotify is 200x200, it should revert to the original |
| 272 // size 150x150. | 270 // size 150x150. |
| 273 ClickOnNotificationButton(0); | 271 ClickOnNotificationButton(0); |
| 274 RunAllPendingInMessageLoop(); | 272 RunAllPendingInMessageLoop(); |
| 275 EXPECT_FALSE(IsNotificationVisible()); | 273 EXPECT_FALSE(IsNotificationVisible()); |
| 276 EXPECT_EQ(0, accept_count()); | 274 EXPECT_EQ(0, accept_count()); |
| 277 EXPECT_TRUE( | 275 EXPECT_FALSE( |
| 278 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); | 276 display_manager->GetSelectedResolutionForDisplayId(id2, &resolution)); |
| 279 EXPECT_EQ("150x150", resolution.ToString()); | |
| 280 } | 277 } |
| 281 | 278 |
| 282 } // namespace internal | 279 } // namespace internal |
| 283 } // namespace ash | 280 } // namespace ash |
| OLD | NEW |