| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/extensions/api/system_display/display_info_provider.h" | |
| 6 | |
| 7 #include "ash/display/display_controller.h" | |
| 8 #include "ash/display/display_manager.h" | |
| 9 #include "ash/screen_util.h" | |
| 10 #include "ash/shell.h" | |
| 11 #include "ash/test/ash_test_base.h" | |
| 12 #include "ash/test/display_manager_test_api.h" | |
| 13 #include "base/strings/string_number_conversions.h" | |
| 14 #include "base/strings/stringprintf.h" | |
| 15 #include "ui/gfx/display.h" | |
| 16 #include "ui/gfx/rect.h" | |
| 17 | |
| 18 namespace extensions { | |
| 19 namespace { | |
| 20 | |
| 21 class DisplayInfoProviderChromeosTest : public ash::test::AshTestBase { | |
| 22 public: | |
| 23 DisplayInfoProviderChromeosTest() {} | |
| 24 | |
| 25 virtual ~DisplayInfoProviderChromeosTest() {} | |
| 26 | |
| 27 protected: | |
| 28 void CallSetDisplayUnitInfo( | |
| 29 const std::string& display_id, | |
| 30 const api::system_display::DisplayProperties& info, | |
| 31 bool* success, | |
| 32 std::string* error) { | |
| 33 // Reset error messsage. | |
| 34 (*error).clear(); | |
| 35 *success = DisplayInfoProvider::Get()->SetInfo(display_id, info, error); | |
| 36 } | |
| 37 | |
| 38 bool DisplayExists(int64 display_id) const { | |
| 39 const gfx::Display& display = | |
| 40 GetDisplayManager()->GetDisplayForId(display_id); | |
| 41 return display.id() != gfx::Display::kInvalidDisplayID; | |
| 42 } | |
| 43 | |
| 44 ash::DisplayManager* GetDisplayManager() const { | |
| 45 return ash::Shell::GetInstance()->display_manager(); | |
| 46 } | |
| 47 | |
| 48 ash::DisplayController* GetDisplayController() const { | |
| 49 return ash::Shell::GetInstance()->display_controller(); | |
| 50 } | |
| 51 | |
| 52 std::string SystemInfoDisplayInsetsToString( | |
| 53 const api::system_display::Insets& insets) const { | |
| 54 // Order to match gfx::Insets::ToString(). | |
| 55 return base::StringPrintf("%d,%d,%d,%d", | |
| 56 insets.top, insets.left, insets.bottom, insets.right); | |
| 57 } | |
| 58 | |
| 59 std::string SystemInfoDisplayBoundsToString( | |
| 60 const api::system_display::Bounds& bounds) const { | |
| 61 // Order to match gfx::Rect::ToString(). | |
| 62 return base::StringPrintf("%d,%d %dx%d", | |
| 63 bounds.left, bounds.top, bounds.width, bounds.height); | |
| 64 } | |
| 65 | |
| 66 DISALLOW_COPY_AND_ASSIGN(DisplayInfoProviderChromeosTest); | |
| 67 }; | |
| 68 | |
| 69 TEST_F(DisplayInfoProviderChromeosTest, GetBasic) { | |
| 70 UpdateDisplay("500x600,400x520"); | |
| 71 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 72 | |
| 73 ASSERT_EQ(2u, result.size()); | |
| 74 | |
| 75 int64 display_id; | |
| 76 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
| 77 << "Display id must be convertable to integer: " << result[0]->id; | |
| 78 | |
| 79 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
| 80 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 81 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
| 82 EXPECT_EQ(0, result[0]->rotation); | |
| 83 EXPECT_TRUE(result[0]->is_primary); | |
| 84 EXPECT_EQ(96, result[0]->dpi_x); | |
| 85 EXPECT_EQ(96, result[0]->dpi_y); | |
| 86 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
| 87 EXPECT_TRUE(result[0]->is_enabled); | |
| 88 | |
| 89 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id)) | |
| 90 << "Display id must be convertable to integer: " << result[0]->id; | |
| 91 | |
| 92 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
| 93 EXPECT_EQ(GetDisplayManager()->GetDisplayNameForId(display_id), | |
| 94 result[1]->name); | |
| 95 // The second display is positioned left of the primary display, whose width | |
| 96 // is 500. | |
| 97 EXPECT_EQ("500,0 400x520", | |
| 98 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 99 EXPECT_EQ("0,0,0,0", SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
| 100 EXPECT_EQ(0, result[1]->rotation); | |
| 101 EXPECT_FALSE(result[1]->is_primary); | |
| 102 EXPECT_EQ(96, result[1]->dpi_x); | |
| 103 EXPECT_EQ(96, result[1]->dpi_y); | |
| 104 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
| 105 EXPECT_TRUE(result[1]->is_enabled); | |
| 106 } | |
| 107 | |
| 108 TEST_F(DisplayInfoProviderChromeosTest, GetRotation) { | |
| 109 UpdateDisplay("500x600/r"); | |
| 110 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 111 | |
| 112 ASSERT_EQ(1u, result.size()); | |
| 113 | |
| 114 int64 display_id; | |
| 115 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
| 116 << "Display id must be convertable to integer: " << result[0]->id; | |
| 117 | |
| 118 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
| 119 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 120 EXPECT_EQ(90, result[0]->rotation); | |
| 121 | |
| 122 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_270); | |
| 123 | |
| 124 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 125 | |
| 126 ASSERT_EQ(1u, result.size()); | |
| 127 | |
| 128 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
| 129 EXPECT_EQ("0,0 600x500", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 130 EXPECT_EQ(270, result[0]->rotation); | |
| 131 | |
| 132 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_180); | |
| 133 | |
| 134 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 135 | |
| 136 ASSERT_EQ(1u, result.size()); | |
| 137 | |
| 138 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
| 139 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 140 EXPECT_EQ(180, result[0]->rotation); | |
| 141 | |
| 142 GetDisplayManager()->SetDisplayRotation(display_id, gfx::Display::ROTATE_0); | |
| 143 | |
| 144 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 145 | |
| 146 ASSERT_EQ(1u, result.size()); | |
| 147 | |
| 148 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
| 149 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 150 EXPECT_EQ(0, result[0]->rotation); | |
| 151 } | |
| 152 | |
| 153 TEST_F(DisplayInfoProviderChromeosTest, GetHiDPI) { | |
| 154 UpdateDisplay("500x600,400x520*2"); | |
| 155 DisplayInfo result; | |
| 156 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 157 | |
| 158 ASSERT_EQ(2u, result.size()); | |
| 159 | |
| 160 EXPECT_EQ("0,0 500x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 161 EXPECT_EQ(96, result[0]->dpi_x); | |
| 162 EXPECT_EQ(96, result[0]->dpi_y); | |
| 163 | |
| 164 EXPECT_EQ("500,0 200x260", | |
| 165 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 166 EXPECT_EQ(2 * 96, result[1]->dpi_x); | |
| 167 EXPECT_EQ(2 * 96, result[1]->dpi_y); | |
| 168 | |
| 169 GetDisplayController()->SwapPrimaryDisplay(); | |
| 170 | |
| 171 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 172 | |
| 173 ASSERT_EQ(2u, result.size()); | |
| 174 | |
| 175 EXPECT_EQ("-500,0 500x600", | |
| 176 SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 177 EXPECT_EQ(96, result[0]->dpi_x); | |
| 178 EXPECT_EQ(96, result[0]->dpi_y); | |
| 179 | |
| 180 EXPECT_EQ("0,0 200x260", SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 181 EXPECT_EQ(2 * 96, result[1]->dpi_x); | |
| 182 EXPECT_EQ(2 * 96, result[1]->dpi_y); | |
| 183 } | |
| 184 | |
| 185 TEST_F(DisplayInfoProviderChromeosTest, GetVisibleArea) { | |
| 186 UpdateDisplay("640x720*2/o, 400x520/o"); | |
| 187 DisplayInfo result; | |
| 188 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 189 | |
| 190 ASSERT_EQ(2u, result.size()); | |
| 191 | |
| 192 int64 display_id; | |
| 193 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id)) | |
| 194 << "Display id must be convertable to integer: " << result[1]->id; | |
| 195 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
| 196 | |
| 197 // Default overscan is 5%. | |
| 198 EXPECT_EQ("304,0 380x494", | |
| 199 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 200 EXPECT_EQ("13,10,13,10", | |
| 201 SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
| 202 | |
| 203 GetDisplayManager()->SetOverscanInsets(display_id, | |
| 204 gfx::Insets(20, 30, 50, 60)); | |
| 205 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 206 | |
| 207 ASSERT_EQ(2u, result.size()); | |
| 208 | |
| 209 EXPECT_EQ(base::Int64ToString(display_id), result[1]->id); | |
| 210 EXPECT_EQ("304,0 310x450", | |
| 211 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 212 EXPECT_EQ("20,30,50,60", | |
| 213 SystemInfoDisplayInsetsToString(result[1]->overscan)); | |
| 214 | |
| 215 // Set insets for the primary screen. Note that it has 2x scale. | |
| 216 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id)) | |
| 217 << "Display id must be convertable to integer: " << result[0]->id; | |
| 218 ASSERT_TRUE(DisplayExists(display_id)) << display_id << " not found"; | |
| 219 | |
| 220 EXPECT_EQ("0,0 304x342", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 221 EXPECT_EQ("9,8,9,8", SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
| 222 | |
| 223 GetDisplayManager()->SetOverscanInsets(display_id, | |
| 224 gfx::Insets(10, 20, 30, 40)); | |
| 225 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 226 | |
| 227 ASSERT_EQ(2u, result.size()); | |
| 228 | |
| 229 EXPECT_EQ(base::Int64ToString(display_id), result[0]->id); | |
| 230 EXPECT_EQ("0,0 260x320", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 231 EXPECT_EQ("10,20,30,40", | |
| 232 SystemInfoDisplayInsetsToString(result[0]->overscan)); | |
| 233 } | |
| 234 | |
| 235 TEST_F(DisplayInfoProviderChromeosTest, GetMirroring) { | |
| 236 UpdateDisplay("600x600, 400x520/o"); | |
| 237 DisplayInfo result; | |
| 238 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 239 | |
| 240 ASSERT_EQ(2u, result.size()); | |
| 241 | |
| 242 int64 display_id_primary; | |
| 243 ASSERT_TRUE(base::StringToInt64(result[0]->id, &display_id_primary)) | |
| 244 << "Display id must be convertable to integer: " << result[0]->id; | |
| 245 ASSERT_TRUE(DisplayExists(display_id_primary)) | |
| 246 << display_id_primary << " not found"; | |
| 247 | |
| 248 int64 display_id_secondary; | |
| 249 ASSERT_TRUE(base::StringToInt64(result[1]->id, &display_id_secondary)) | |
| 250 << "Display id must be convertable to integer: " << result[1]->id; | |
| 251 ASSERT_TRUE(DisplayExists(display_id_secondary)) | |
| 252 << display_id_secondary << " not found"; | |
| 253 | |
| 254 ASSERT_FALSE(GetDisplayManager()->IsMirrored()); | |
| 255 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
| 256 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
| 257 | |
| 258 GetDisplayManager()->SetMirrorMode(true); | |
| 259 ASSERT_TRUE(GetDisplayManager()->IsMirrored()); | |
| 260 | |
| 261 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 262 | |
| 263 ASSERT_EQ(1u, result.size()); | |
| 264 EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id); | |
| 265 EXPECT_EQ(base::Int64ToString(display_id_secondary), | |
| 266 result[0]->mirroring_source_id); | |
| 267 | |
| 268 GetDisplayManager()->SetMirrorMode(false); | |
| 269 ASSERT_FALSE(GetDisplayManager()->IsMirrored()); | |
| 270 | |
| 271 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 272 | |
| 273 ASSERT_EQ(2u, result.size()); | |
| 274 EXPECT_EQ(base::Int64ToString(display_id_primary), result[0]->id); | |
| 275 EXPECT_TRUE(result[0]->mirroring_source_id.empty()); | |
| 276 EXPECT_EQ(base::Int64ToString(display_id_secondary), result[1]->id); | |
| 277 EXPECT_TRUE(result[1]->mirroring_source_id.empty()); | |
| 278 } | |
| 279 | |
| 280 TEST_F(DisplayInfoProviderChromeosTest, GetBounds) { | |
| 281 UpdateDisplay("600x600, 400x520"); | |
| 282 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
| 283 ash::DisplayLayout::FromInts(ash::DisplayLayout::LEFT, -40)); | |
| 284 | |
| 285 DisplayInfo result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 286 | |
| 287 ASSERT_EQ(2u, result.size()); | |
| 288 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 289 EXPECT_EQ("-400,-40 400x520", | |
| 290 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 291 | |
| 292 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
| 293 ash::DisplayLayout::FromInts(ash::DisplayLayout::TOP, 40)); | |
| 294 | |
| 295 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 296 | |
| 297 ASSERT_EQ(2u, result.size()); | |
| 298 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 299 EXPECT_EQ("40,-520 400x520", | |
| 300 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 301 | |
| 302 GetDisplayManager()->SetLayoutForCurrentDisplays( | |
| 303 ash::DisplayLayout::FromInts(ash::DisplayLayout::BOTTOM, 80)); | |
| 304 | |
| 305 result = DisplayInfoProvider::Get()->GetAllDisplaysInfo(); | |
| 306 ASSERT_EQ(2u, result.size()); | |
| 307 EXPECT_EQ("0,0 600x600", SystemInfoDisplayBoundsToString(result[0]->bounds)); | |
| 308 EXPECT_EQ("80,600 400x520", | |
| 309 SystemInfoDisplayBoundsToString(result[1]->bounds)); | |
| 310 } | |
| 311 | |
| 312 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftExact) { | |
| 313 UpdateDisplay("1200x600,520x400"); | |
| 314 | |
| 315 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 316 api::system_display::DisplayProperties info; | |
| 317 info.bounds_origin_x.reset(new int(-520)); | |
| 318 info.bounds_origin_y.reset(new int(50)); | |
| 319 | |
| 320 bool success = false; | |
| 321 std::string error; | |
| 322 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 323 &success, &error); | |
| 324 | |
| 325 ASSERT_TRUE(success); | |
| 326 ASSERT_TRUE(error.empty()); | |
| 327 | |
| 328 EXPECT_EQ("-520,50 520x400", secondary.bounds().ToString()); | |
| 329 } | |
| 330 | |
| 331 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginRightExact) { | |
| 332 UpdateDisplay("1200x600,520x400"); | |
| 333 | |
| 334 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 335 api::system_display::DisplayProperties info; | |
| 336 info.bounds_origin_x.reset(new int(1200)); | |
| 337 info.bounds_origin_y.reset(new int(100)); | |
| 338 | |
| 339 bool success = false; | |
| 340 std::string error; | |
| 341 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 342 &success, &error); | |
| 343 | |
| 344 ASSERT_TRUE(success); | |
| 345 ASSERT_TRUE(error.empty()); | |
| 346 | |
| 347 EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString()); | |
| 348 } | |
| 349 | |
| 350 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopExact) { | |
| 351 UpdateDisplay("1200x600,520x400"); | |
| 352 | |
| 353 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 354 api::system_display::DisplayProperties info; | |
| 355 info.bounds_origin_x.reset(new int(1100)); | |
| 356 info.bounds_origin_y.reset(new int(-400)); | |
| 357 | |
| 358 bool success = false; | |
| 359 std::string error; | |
| 360 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 361 &success, &error); | |
| 362 | |
| 363 ASSERT_TRUE(success); | |
| 364 ASSERT_TRUE(error.empty()); | |
| 365 | |
| 366 EXPECT_EQ("1100,-400 520x400", secondary.bounds().ToString()); | |
| 367 } | |
| 368 | |
| 369 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginBottomExact) { | |
| 370 UpdateDisplay("1200x600,520x400"); | |
| 371 | |
| 372 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 373 api::system_display::DisplayProperties info; | |
| 374 info.bounds_origin_x.reset(new int(-350)); | |
| 375 info.bounds_origin_y.reset(new int(600)); | |
| 376 | |
| 377 bool success = false; | |
| 378 std::string error; | |
| 379 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 380 &success, &error); | |
| 381 | |
| 382 ASSERT_TRUE(success); | |
| 383 ASSERT_TRUE(error.empty()); | |
| 384 | |
| 385 EXPECT_EQ("-350,600 520x400", secondary.bounds().ToString()); | |
| 386 } | |
| 387 | |
| 388 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSameCenter) { | |
| 389 UpdateDisplay("1200x600,520x400"); | |
| 390 | |
| 391 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 392 api::system_display::DisplayProperties info; | |
| 393 info.bounds_origin_x.reset(new int(340)); | |
| 394 info.bounds_origin_y.reset(new int(100)); | |
| 395 | |
| 396 bool success = false; | |
| 397 std::string error; | |
| 398 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 399 &success, &error); | |
| 400 | |
| 401 ASSERT_TRUE(success); | |
| 402 ASSERT_TRUE(error.empty()); | |
| 403 | |
| 404 EXPECT_EQ("1200,100 520x400", secondary.bounds().ToString()); | |
| 405 } | |
| 406 | |
| 407 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginLeftOutside) { | |
| 408 UpdateDisplay("1200x600,520x400"); | |
| 409 | |
| 410 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 411 api::system_display::DisplayProperties info; | |
| 412 info.bounds_origin_x.reset(new int(-1040)); | |
| 413 info.bounds_origin_y.reset(new int(100)); | |
| 414 | |
| 415 bool success = false; | |
| 416 std::string error; | |
| 417 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 418 &success, &error); | |
| 419 | |
| 420 ASSERT_TRUE(success); | |
| 421 ASSERT_TRUE(error.empty()); | |
| 422 | |
| 423 EXPECT_EQ("-520,100 520x400", secondary.bounds().ToString()); | |
| 424 } | |
| 425 | |
| 426 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginTopOutside) { | |
| 427 UpdateDisplay("1200x600,520x400"); | |
| 428 | |
| 429 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 430 api::system_display::DisplayProperties info; | |
| 431 info.bounds_origin_x.reset(new int(-360)); | |
| 432 info.bounds_origin_y.reset(new int(-301)); | |
| 433 | |
| 434 bool success = false; | |
| 435 std::string error; | |
| 436 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 437 &success, &error); | |
| 438 | |
| 439 ASSERT_TRUE(success); | |
| 440 ASSERT_TRUE(error.empty()); | |
| 441 | |
| 442 EXPECT_EQ("-360,-400 520x400", secondary.bounds().ToString()); | |
| 443 } | |
| 444 | |
| 445 TEST_F(DisplayInfoProviderChromeosTest, | |
| 446 SetBoundsOriginLeftButSharesBottomSide) { | |
| 447 UpdateDisplay("1200x600,1000x100"); | |
| 448 | |
| 449 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 450 api::system_display::DisplayProperties info; | |
| 451 info.bounds_origin_x.reset(new int(-650)); | |
| 452 info.bounds_origin_y.reset(new int(700)); | |
| 453 | |
| 454 bool success = false; | |
| 455 std::string error; | |
| 456 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 457 &success, &error); | |
| 458 | |
| 459 ASSERT_TRUE(success); | |
| 460 ASSERT_TRUE(error.empty()); | |
| 461 | |
| 462 EXPECT_EQ("-650,600 1000x100", secondary.bounds().ToString()); | |
| 463 } | |
| 464 | |
| 465 TEST_F(DisplayInfoProviderChromeosTest, | |
| 466 SetBoundsOriginRightButSharesTopSide) { | |
| 467 UpdateDisplay("1200x600,1000x100"); | |
| 468 | |
| 469 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 470 api::system_display::DisplayProperties info; | |
| 471 info.bounds_origin_x.reset(new int(850)); | |
| 472 info.bounds_origin_y.reset(new int(-150)); | |
| 473 | |
| 474 bool success = false; | |
| 475 std::string error; | |
| 476 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 477 &success, &error); | |
| 478 | |
| 479 ASSERT_TRUE(success); | |
| 480 ASSERT_TRUE(error.empty()); | |
| 481 | |
| 482 EXPECT_EQ("850,-100 1000x100", secondary.bounds().ToString()); | |
| 483 } | |
| 484 | |
| 485 TEST_F(DisplayInfoProviderChromeosTest, | |
| 486 SetBoundsOriginTopButSharesLeftSide) { | |
| 487 UpdateDisplay("1200x600,1000x100/l"); | |
| 488 | |
| 489 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 490 api::system_display::DisplayProperties info; | |
| 491 info.bounds_origin_x.reset(new int(-150)); | |
| 492 info.bounds_origin_y.reset(new int(-650)); | |
| 493 | |
| 494 bool success = false; | |
| 495 std::string error; | |
| 496 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 497 &success, &error); | |
| 498 | |
| 499 ASSERT_TRUE(success); | |
| 500 ASSERT_TRUE(error.empty()); | |
| 501 | |
| 502 EXPECT_EQ("-100,-650 100x1000", secondary.bounds().ToString()); | |
| 503 } | |
| 504 | |
| 505 TEST_F(DisplayInfoProviderChromeosTest, | |
| 506 SetBoundsOriginBottomButSharesRightSide) { | |
| 507 UpdateDisplay("1200x600,1000x100/l"); | |
| 508 | |
| 509 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 510 api::system_display::DisplayProperties info; | |
| 511 info.bounds_origin_x.reset(new int(1350)); | |
| 512 info.bounds_origin_y.reset(new int(450)); | |
| 513 | |
| 514 bool success = false; | |
| 515 std::string error; | |
| 516 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 517 &success, &error); | |
| 518 | |
| 519 ASSERT_TRUE(success); | |
| 520 ASSERT_TRUE(error.empty()); | |
| 521 | |
| 522 EXPECT_EQ("1200,450 100x1000", secondary.bounds().ToString()); | |
| 523 } | |
| 524 | |
| 525 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginPrimaryHiDPI) { | |
| 526 UpdateDisplay("1200x600*2,500x500"); | |
| 527 | |
| 528 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 529 api::system_display::DisplayProperties info; | |
| 530 info.bounds_origin_x.reset(new int(250)); | |
| 531 info.bounds_origin_y.reset(new int(-100)); | |
| 532 | |
| 533 bool success = false; | |
| 534 std::string error; | |
| 535 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 536 &success, &error); | |
| 537 | |
| 538 ASSERT_TRUE(success); | |
| 539 ASSERT_TRUE(error.empty()); | |
| 540 | |
| 541 EXPECT_EQ("600,-100 500x500", secondary.bounds().ToString()); | |
| 542 } | |
| 543 | |
| 544 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginSecondaryHiDPI) { | |
| 545 UpdateDisplay("1200x600,600x1000*2"); | |
| 546 | |
| 547 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 548 api::system_display::DisplayProperties info; | |
| 549 info.bounds_origin_x.reset(new int(450)); | |
| 550 info.bounds_origin_y.reset(new int(-100)); | |
| 551 | |
| 552 bool success = false; | |
| 553 std::string error; | |
| 554 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 555 &success, &error); | |
| 556 | |
| 557 ASSERT_TRUE(success); | |
| 558 ASSERT_TRUE(error.empty()); | |
| 559 | |
| 560 EXPECT_EQ("450,-500 300x500", secondary.bounds().ToString()); | |
| 561 } | |
| 562 | |
| 563 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBounds) { | |
| 564 UpdateDisplay("1200x600,600x1000*2"); | |
| 565 | |
| 566 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 567 api::system_display::DisplayProperties info; | |
| 568 info.bounds_origin_x.reset(new int(0x200001)); | |
| 569 info.bounds_origin_y.reset(new int(-100)); | |
| 570 | |
| 571 bool success = false; | |
| 572 std::string error; | |
| 573 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 574 &success, &error); | |
| 575 | |
| 576 ASSERT_FALSE(success); | |
| 577 ASSERT_EQ("Bounds origin x out of bounds.", error); | |
| 578 | |
| 579 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 580 } | |
| 581 | |
| 582 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOutOfBoundsNegative) { | |
| 583 UpdateDisplay("1200x600,600x1000*2"); | |
| 584 | |
| 585 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 586 api::system_display::DisplayProperties info; | |
| 587 info.bounds_origin_x.reset(new int(300)); | |
| 588 info.bounds_origin_y.reset(new int(-0x200001)); | |
| 589 | |
| 590 bool success = false; | |
| 591 std::string error; | |
| 592 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 593 &success, &error); | |
| 594 | |
| 595 ASSERT_FALSE(success); | |
| 596 ASSERT_EQ("Bounds origin y out of bounds.", error); | |
| 597 | |
| 598 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 599 } | |
| 600 | |
| 601 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginMaxValues) { | |
| 602 UpdateDisplay("1200x4600,600x1000*2"); | |
| 603 | |
| 604 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 605 api::system_display::DisplayProperties info; | |
| 606 info.bounds_origin_x.reset(new int(200000)); | |
| 607 info.bounds_origin_y.reset(new int(10)); | |
| 608 | |
| 609 bool success = false; | |
| 610 std::string error; | |
| 611 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 612 &success, &error); | |
| 613 | |
| 614 ASSERT_TRUE(success); | |
| 615 EXPECT_TRUE(error.empty()); | |
| 616 | |
| 617 EXPECT_EQ("1200,10 300x500", secondary.bounds().ToString()); | |
| 618 } | |
| 619 | |
| 620 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginOnPrimary) { | |
| 621 UpdateDisplay("1200x600,600x1000*2"); | |
| 622 | |
| 623 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 624 api::system_display::DisplayProperties info; | |
| 625 info.bounds_origin_x.reset(new int(300)); | |
| 626 info.is_primary.reset(new bool(true)); | |
| 627 | |
| 628 bool success = false; | |
| 629 std::string error; | |
| 630 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 631 &success, &error); | |
| 632 | |
| 633 ASSERT_FALSE(success); | |
| 634 ASSERT_EQ("Bounds origin not allowed for the primary display.", error); | |
| 635 | |
| 636 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 637 // The operation failed because the primary property would be set before | |
| 638 // setting bounds. The primary display shouldn't have been changed, though. | |
| 639 EXPECT_NE(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id()); | |
| 640 } | |
| 641 | |
| 642 TEST_F(DisplayInfoProviderChromeosTest, SetBoundsOriginWithMirroring) { | |
| 643 UpdateDisplay("1200x600,600x1000*2"); | |
| 644 | |
| 645 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 646 const gfx::Display& primary = ash::Shell::GetScreen()->GetPrimaryDisplay(); | |
| 647 | |
| 648 api::system_display::DisplayProperties info; | |
| 649 info.bounds_origin_x.reset(new int(300)); | |
| 650 info.mirroring_source_id.reset( | |
| 651 new std::string(base::Int64ToString(primary.id()))); | |
| 652 | |
| 653 bool success = false; | |
| 654 std::string error; | |
| 655 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 656 &success, &error); | |
| 657 | |
| 658 ASSERT_FALSE(success); | |
| 659 ASSERT_EQ("No other parameter should be set alongside mirroringSourceId.", | |
| 660 error); | |
| 661 } | |
| 662 | |
| 663 TEST_F(DisplayInfoProviderChromeosTest, SetRotation) { | |
| 664 UpdateDisplay("1200x600,600x1000*2"); | |
| 665 | |
| 666 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 667 api::system_display::DisplayProperties info; | |
| 668 info.rotation.reset(new int(90)); | |
| 669 | |
| 670 bool success = false; | |
| 671 std::string error; | |
| 672 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 673 &success, &error); | |
| 674 | |
| 675 ASSERT_TRUE(success); | |
| 676 EXPECT_TRUE(error.empty()); | |
| 677 | |
| 678 EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString()); | |
| 679 EXPECT_EQ(gfx::Display::ROTATE_90, secondary.rotation()); | |
| 680 | |
| 681 info.rotation.reset(new int(270)); | |
| 682 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 683 &success, &error); | |
| 684 | |
| 685 ASSERT_TRUE(success); | |
| 686 EXPECT_TRUE(error.empty()); | |
| 687 | |
| 688 EXPECT_EQ("1200,0 500x300", secondary.bounds().ToString()); | |
| 689 EXPECT_EQ(gfx::Display::ROTATE_270, secondary.rotation()); | |
| 690 | |
| 691 info.rotation.reset(new int(180)); | |
| 692 // Switch primary display. | |
| 693 info.is_primary.reset(new bool(true)); | |
| 694 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 695 &success, &error); | |
| 696 | |
| 697 ASSERT_TRUE(success); | |
| 698 EXPECT_TRUE(error.empty()); | |
| 699 | |
| 700 EXPECT_EQ("0,0 300x500", secondary.bounds().ToString()); | |
| 701 EXPECT_EQ(gfx::Display::ROTATE_180, secondary.rotation()); | |
| 702 EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id()); | |
| 703 | |
| 704 info.rotation.reset(new int(0)); | |
| 705 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 706 &success, &error); | |
| 707 | |
| 708 ASSERT_TRUE(success); | |
| 709 EXPECT_TRUE(error.empty()); | |
| 710 | |
| 711 EXPECT_EQ("0,0 300x500", secondary.bounds().ToString()); | |
| 712 EXPECT_EQ(gfx::Display::ROTATE_0, secondary.rotation()); | |
| 713 EXPECT_EQ(ash::Shell::GetScreen()->GetPrimaryDisplay().id(), secondary.id()); | |
| 714 } | |
| 715 | |
| 716 TEST_F(DisplayInfoProviderChromeosTest, SetInvalidRotation) { | |
| 717 UpdateDisplay("1200x600,600x1000*2"); | |
| 718 | |
| 719 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 720 api::system_display::DisplayProperties info; | |
| 721 info.rotation.reset(new int(91)); | |
| 722 | |
| 723 bool success = false; | |
| 724 std::string error; | |
| 725 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 726 &success, &error); | |
| 727 | |
| 728 ASSERT_FALSE(success); | |
| 729 EXPECT_EQ("Invalid rotation.", error); | |
| 730 } | |
| 731 | |
| 732 TEST_F(DisplayInfoProviderChromeosTest, SetNegativeOverscan) { | |
| 733 UpdateDisplay("1200x600,600x1000*2"); | |
| 734 | |
| 735 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 736 api::system_display::DisplayProperties info; | |
| 737 info.overscan.reset(new api::system_display::Insets); | |
| 738 info.overscan->left= -10; | |
| 739 | |
| 740 bool success = false; | |
| 741 std::string error; | |
| 742 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 743 &success, &error); | |
| 744 | |
| 745 ASSERT_FALSE(success); | |
| 746 EXPECT_EQ("Negative overscan not allowed.", error); | |
| 747 | |
| 748 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 749 | |
| 750 info.overscan->left= 0; | |
| 751 info.overscan->right = -200; | |
| 752 | |
| 753 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 754 &success, &error); | |
| 755 | |
| 756 ASSERT_FALSE(success); | |
| 757 EXPECT_EQ("Negative overscan not allowed.", error); | |
| 758 | |
| 759 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 760 | |
| 761 info.overscan->right= 0; | |
| 762 info.overscan->top = -300; | |
| 763 | |
| 764 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 765 &success, &error); | |
| 766 | |
| 767 ASSERT_FALSE(success); | |
| 768 EXPECT_EQ("Negative overscan not allowed.", error); | |
| 769 | |
| 770 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 771 | |
| 772 info.overscan->right= 0; | |
| 773 info.overscan->top = -1000; | |
| 774 | |
| 775 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 776 &success, &error); | |
| 777 | |
| 778 ASSERT_FALSE(success); | |
| 779 EXPECT_EQ("Negative overscan not allowed.", error); | |
| 780 | |
| 781 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 782 | |
| 783 info.overscan->right= 0; | |
| 784 info.overscan->top = 0; | |
| 785 | |
| 786 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 787 &success, &error); | |
| 788 | |
| 789 ASSERT_TRUE(success); | |
| 790 EXPECT_TRUE(error.empty()); | |
| 791 | |
| 792 EXPECT_EQ("1200,0 300x500", secondary.bounds().ToString()); | |
| 793 } | |
| 794 | |
| 795 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanHorizontalBounds) { | |
| 796 UpdateDisplay("1200x600,600x1000*2"); | |
| 797 | |
| 798 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 799 api::system_display::DisplayProperties info; | |
| 800 info.overscan.reset(new api::system_display::Insets); | |
| 801 // Horizontal overscan is 151, which would make the bounds width 149. | |
| 802 info.overscan->left= 50; | |
| 803 info.overscan->top = 10; | |
| 804 info.overscan->right = 101; | |
| 805 info.overscan->bottom = 20; | |
| 806 | |
| 807 bool success = false; | |
| 808 std::string error; | |
| 809 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 810 &success, &error); | |
| 811 | |
| 812 ASSERT_FALSE(success); | |
| 813 EXPECT_EQ("Horizontal overscan is more than half of the screen width.", | |
| 814 error); | |
| 815 } | |
| 816 | |
| 817 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanLargerThanVerticalBounds) { | |
| 818 UpdateDisplay("1200x600,600x1000"); | |
| 819 | |
| 820 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 821 api::system_display::DisplayProperties info; | |
| 822 info.overscan.reset(new api::system_display::Insets); | |
| 823 // Vertical overscan is 501, which would make the bounds height 499. | |
| 824 info.overscan->left= 20; | |
| 825 info.overscan->top = 250; | |
| 826 info.overscan->right = 101; | |
| 827 info.overscan->bottom = 251; | |
| 828 | |
| 829 bool success = false; | |
| 830 std::string error; | |
| 831 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 832 &success, &error); | |
| 833 | |
| 834 ASSERT_FALSE(success); | |
| 835 EXPECT_EQ("Vertical overscan is more than half of the screen height.", | |
| 836 error); | |
| 837 } | |
| 838 | |
| 839 TEST_F(DisplayInfoProviderChromeosTest, SetOverscan) { | |
| 840 UpdateDisplay("1200x600,600x1000*2"); | |
| 841 | |
| 842 const gfx::Display& secondary = ash::ScreenUtil::GetSecondaryDisplay(); | |
| 843 api::system_display::DisplayProperties info; | |
| 844 info.overscan.reset(new api::system_display::Insets); | |
| 845 info.overscan->left= 20; | |
| 846 info.overscan->top = 199; | |
| 847 info.overscan->right = 130; | |
| 848 info.overscan->bottom = 51; | |
| 849 | |
| 850 bool success = false; | |
| 851 std::string error; | |
| 852 CallSetDisplayUnitInfo(base::Int64ToString(secondary.id()), info, | |
| 853 &success, &error); | |
| 854 | |
| 855 ASSERT_TRUE(success); | |
| 856 EXPECT_TRUE(error.empty()); | |
| 857 | |
| 858 EXPECT_EQ("1200,0 150x250", secondary.bounds().ToString()); | |
| 859 const gfx::Insets overscan = | |
| 860 GetDisplayManager()->GetOverscanInsets(secondary.id()); | |
| 861 | |
| 862 EXPECT_EQ(20, overscan.left()); | |
| 863 EXPECT_EQ(199, overscan.top()); | |
| 864 EXPECT_EQ(130, overscan.right()); | |
| 865 EXPECT_EQ(51, overscan.bottom()); | |
| 866 } | |
| 867 | |
| 868 TEST_F(DisplayInfoProviderChromeosTest, SetOverscanForInternal) { | |
| 869 UpdateDisplay("1200x600,600x1000*2"); | |
| 870 const int64 internal_display_id = | |
| 871 ash::test::DisplayManagerTestApi(GetDisplayManager()). | |
| 872 SetFirstDisplayAsInternalDisplay(); | |
| 873 | |
| 874 api::system_display::DisplayProperties info; | |
| 875 info.overscan.reset(new api::system_display::Insets); | |
| 876 // Vertical overscan is 501, which would make the bounds height 499. | |
| 877 info.overscan->left= 20; | |
| 878 info.overscan->top = 20; | |
| 879 info.overscan->right = 20; | |
| 880 info.overscan->bottom = 20; | |
| 881 | |
| 882 bool success = false; | |
| 883 std::string error; | |
| 884 CallSetDisplayUnitInfo(base::Int64ToString(internal_display_id), info, | |
| 885 &success, &error); | |
| 886 | |
| 887 ASSERT_FALSE(success); | |
| 888 EXPECT_EQ("Overscan changes not allowed for the internal monitor.", | |
| 889 error); | |
| 890 } | |
| 891 | |
| 892 } // namespace | |
| 893 } // namespace extensions | |
| OLD | NEW |