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 894