display_controller_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 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 "ash/display/display_controller.h" 6 7#include "ash/launcher/launcher.h" 8#include "ash/screen_ash.h" 9#include "ash/shell.h" 10#include "ash/test/ash_test_base.h" 11#include "ash/test/cursor_manager_test_api.h" 12#include "ui/aura/display_manager.h" 13#include "ui/aura/env.h" 14#include "ui/aura/root_window.h" 15#include "ui/aura/window_tracker.h" 16#include "ui/gfx/display.h" 17#include "ui/gfx/screen.h" 18#include "ui/views/widget/widget.h" 19 20namespace ash { 21namespace test { 22namespace { 23 24class TestObserver : public DisplayController::Observer { 25 public: 26 TestObserver() : count_(0) { 27 Shell::GetInstance()->display_controller()->AddObserver(this); 28 } 29 30 virtual ~TestObserver() { 31 Shell::GetInstance()->display_controller()->RemoveObserver(this); 32 } 33 34 virtual void OnDisplayConfigurationChanging() OVERRIDE { 35 ++count_; 36 } 37 38 int CountAndReset() { 39 int c = count_; 40 count_ = 0; 41 return c; 42 } 43 44 private: 45 int count_; 46 47 DISALLOW_COPY_AND_ASSIGN(TestObserver); 48}; 49 50gfx::Display GetPrimaryDisplay() { 51 return Shell::GetScreen()->GetDisplayNearestWindow( 52 Shell::GetAllRootWindows()[0]); 53} 54 55gfx::Display GetSecondaryDisplay() { 56 return Shell::GetScreen()->GetDisplayNearestWindow( 57 Shell::GetAllRootWindows()[1]); 58} 59 60void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position, 61 int offset) { 62 DisplayController* display_controller = 63 Shell::GetInstance()->display_controller(); 64 DisplayLayout layout = display_controller->default_display_layout(); 65 layout.position = position; 66 layout.offset = offset; 67 display_controller->SetDefaultDisplayLayout(layout); 68} 69 70void SetSecondaryDisplayLayout(DisplayLayout::Position position) { 71 SetSecondaryDisplayLayoutAndOffset(position, 0); 72} 73 74} // namespace 75 76typedef test::AshTestBase DisplayControllerTest; 77 78#if defined(OS_WIN) 79// TOD(oshima): Windows creates a window with smaller client area. 80// Fix this and enable tests. 81#define MAYBE_SecondaryDisplayLayout DISABLED_SecondaryDisplayLayout 82#define MAYBE_BoundsUpdated DISABLED_BoundsUpdated 83#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin 84#else 85#define MAYBE_SecondaryDisplayLayout SecondaryDisplayLayout 86#define MAYBE_BoundsUpdated BoundsUpdated 87#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin 88#endif 89 90TEST_F(DisplayControllerTest, MAYBE_SecondaryDisplayLayout) { 91 TestObserver observer; 92 UpdateDisplay("500x500,400x400"); 93 EXPECT_EQ(2, observer.CountAndReset()); // resize and add 94 gfx::Display* secondary_display = 95 aura::Env::GetInstance()->display_manager()->GetDisplayAt(1); 96 gfx::Insets insets(5, 5, 5, 5); 97 secondary_display->UpdateWorkAreaFromInsets(insets); 98 99 // Default layout is RIGHT. 100 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 101 EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString()); 102 EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString()); 103 104 // Layout the secondary display to the bottom of the primary. 105 SetSecondaryDisplayLayout(DisplayLayout::BOTTOM); 106 EXPECT_EQ(1, observer.CountAndReset()); 107 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 108 EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString()); 109 EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString()); 110 111 // Layout the secondary display to the left of the primary. 112 SetSecondaryDisplayLayout(DisplayLayout::LEFT); 113 EXPECT_EQ(1, observer.CountAndReset()); 114 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 115 EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString()); 116 EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString()); 117 118 // Layout the secondary display to the top of the primary. 119 SetSecondaryDisplayLayout(DisplayLayout::TOP); 120 EXPECT_EQ(1, observer.CountAndReset()); 121 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 122 EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString()); 123 EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString()); 124 125 // Layout to the right with an offset. 126 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300); 127 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 128 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 129 EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString()); 130 131 // Keep the minimum 100. 132 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490); 133 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 134 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 135 EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString()); 136 137 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400); 138 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 139 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 140 EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString()); 141 142 // Layout to the bottom with an offset. 143 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200); 144 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 145 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 146 EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString()); 147 148 // Keep the minimum 100. 149 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490); 150 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 151 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 152 EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString()); 153 154 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 155 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 156 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 157 EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 158 159} 160 161TEST_F(DisplayControllerTest, MAYBE_BoundsUpdated) { 162 TestObserver observer; 163 SetSecondaryDisplayLayout(DisplayLayout::BOTTOM); 164 UpdateDisplay("200x200,300x300"); // layout, resize and add. 165 EXPECT_EQ(3, observer.CountAndReset()); 166 167 gfx::Display* secondary_display = 168 aura::Env::GetInstance()->display_manager()->GetDisplayAt(1); 169 gfx::Insets insets(5, 5, 5, 5); 170 secondary_display->UpdateWorkAreaFromInsets(insets); 171 172 EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString()); 173 EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString()); 174 EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString()); 175 176 UpdateDisplay("400x400,200x200"); 177 EXPECT_EQ(2, observer.CountAndReset()); // two resizes 178 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 179 EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString()); 180 EXPECT_EQ("5,405 190x190", GetSecondaryDisplay().work_area().ToString()); 181 182 UpdateDisplay("400x400,300x300"); 183 EXPECT_EQ(1, observer.CountAndReset()); 184 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 185 EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString()); 186 EXPECT_EQ("5,405 290x290", GetSecondaryDisplay().work_area().ToString()); 187 188 UpdateDisplay("400x400"); 189 EXPECT_EQ(1, observer.CountAndReset()); 190 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 191 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 192 193 UpdateDisplay("500x500,700x700"); 194 EXPECT_EQ(2, observer.CountAndReset()); 195 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 196 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 197 EXPECT_EQ("0,500 700x700", GetSecondaryDisplay().bounds().ToString()); 198} 199 200TEST_F(DisplayControllerTest, InvertLayout) { 201 EXPECT_EQ("left, 0", 202 DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString()); 203 EXPECT_EQ("left, -100", 204 DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString()); 205 EXPECT_EQ("left, 50", 206 DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString()); 207 208 EXPECT_EQ("right, 0", 209 DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString()); 210 EXPECT_EQ("right, -90", 211 DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString()); 212 EXPECT_EQ("right, 60", 213 DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString()); 214 215 EXPECT_EQ("bottom, 0", 216 DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString()); 217 EXPECT_EQ("bottom, -80", 218 DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString()); 219 EXPECT_EQ("bottom, 70", 220 DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString()); 221 222 EXPECT_EQ("top, 0", 223 DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString()); 224 EXPECT_EQ("top, -70", 225 DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString()); 226 EXPECT_EQ("top, 80", 227 DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString()); 228} 229 230TEST_F(DisplayControllerTest, SwapPrimary) { 231 DisplayController* display_controller = 232 Shell::GetInstance()->display_controller(); 233 234 UpdateDisplay("200x200,300x300"); 235 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 236 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 237 238 std::string secondary_name = aura::Env::GetInstance()-> 239 display_manager()->GetDisplayNameFor(secondary_display); 240 DisplayLayout secondary_layout(DisplayLayout::RIGHT, 50); 241 display_controller->SetLayoutForDisplayName(secondary_name, secondary_layout); 242 243 EXPECT_NE(primary_display.id(), secondary_display.id()); 244 aura::RootWindow* primary_root = 245 display_controller->GetRootWindowForDisplayId(primary_display.id()); 246 aura::RootWindow* secondary_root = 247 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 248 EXPECT_NE(primary_root, secondary_root); 249 aura::Window* launcher_window = 250 Launcher::ForPrimaryDisplay()->widget()->GetNativeView(); 251 EXPECT_TRUE(primary_root->Contains(launcher_window)); 252 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 253 EXPECT_EQ(primary_display.id(), 254 Shell::GetScreen()->GetDisplayNearestPoint( 255 gfx::Point(-100, -100)).id()); 256 EXPECT_EQ(primary_display.id(), 257 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 258 259#if !defined(OS_WIN) 260 EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString()); 261 EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString()); 262 EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString()); 263 EXPECT_EQ("200,0 300x300", secondary_display.work_area().ToString()); 264#endif 265 266 // Switch primary and secondary 267 display_controller->SetPrimaryDisplay(secondary_display); 268 EXPECT_EQ(secondary_display.id(), 269 Shell::GetScreen()->GetPrimaryDisplay().id()); 270 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 271 EXPECT_EQ(secondary_display.id(), 272 Shell::GetScreen()->GetDisplayNearestPoint( 273 gfx::Point(-100, -100)).id()); 274 EXPECT_EQ(secondary_display.id(), 275 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 276 277 EXPECT_EQ( 278 primary_root, 279 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 280 EXPECT_EQ( 281 secondary_root, 282 display_controller->GetRootWindowForDisplayId(primary_display.id())); 283 EXPECT_TRUE(primary_root->Contains(launcher_window)); 284 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 285 286#if !defined(OS_WIN) 287 // Test if the bounds are correctly swapped. 288 gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay(); 289 gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay(); 290 EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString()); 291 EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString()); 292 EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString()); 293 EXPECT_EQ("-200,-50 200x200", swapped_secondary.work_area().ToString()); 294#endif 295 296 const DisplayLayout& inverted_layout = 297 display_controller->GetLayoutForDisplay(primary_display); 298 299 EXPECT_EQ("left, -50", inverted_layout.ToString()); 300 301 aura::WindowTracker tracker; 302 tracker.Add(primary_root); 303 tracker.Add(secondary_root); 304 305 // Deleting 2nd display should move the primary to original primary display. 306 UpdateDisplay("200x200"); 307 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 308 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 309 EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 310 EXPECT_EQ(primary_display.id(), 311 Shell::GetScreen()->GetDisplayNearestPoint( 312 gfx::Point(-100, -100)).id()); 313 EXPECT_EQ(primary_display.id(), 314 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 315 EXPECT_TRUE(tracker.Contains(primary_root)); 316 EXPECT_FALSE(tracker.Contains(secondary_root)); 317 EXPECT_TRUE(primary_root->Contains(launcher_window)); 318} 319 320TEST_F(DisplayControllerTest, SwapPrimaryById) { 321 DisplayController* display_controller = 322 Shell::GetInstance()->display_controller(); 323 324 UpdateDisplay("200x200,300x300"); 325 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 326 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 327 328 std::string secondary_name = aura::Env::GetInstance()-> 329 display_manager()->GetDisplayNameFor(secondary_display); 330 DisplayLayout secondary_layout(DisplayLayout::RIGHT, 50); 331 display_controller->SetLayoutForDisplayName(secondary_name, secondary_layout); 332 333 EXPECT_NE(primary_display.id(), secondary_display.id()); 334 aura::RootWindow* primary_root = 335 display_controller->GetRootWindowForDisplayId(primary_display.id()); 336 aura::RootWindow* secondary_root = 337 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 338 aura::Window* launcher_window = 339 Launcher::ForPrimaryDisplay()->widget()->GetNativeView(); 340 EXPECT_TRUE(primary_root->Contains(launcher_window)); 341 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 342 EXPECT_NE(primary_root, secondary_root); 343 EXPECT_EQ(primary_display.id(), 344 Shell::GetScreen()->GetDisplayNearestPoint( 345 gfx::Point(-100, -100)).id()); 346 EXPECT_EQ(primary_display.id(), 347 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 348 349 // Switch primary and secondary by display ID. 350 TestObserver observer; 351 display_controller->SetPrimaryDisplayId(secondary_display.id()); 352 EXPECT_EQ(secondary_display.id(), 353 Shell::GetScreen()->GetPrimaryDisplay().id()); 354 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 355 EXPECT_LT(0, observer.CountAndReset()); 356 357 EXPECT_EQ( 358 primary_root, 359 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 360 EXPECT_EQ( 361 secondary_root, 362 display_controller->GetRootWindowForDisplayId(primary_display.id())); 363 EXPECT_TRUE(primary_root->Contains(launcher_window)); 364 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 365 366 const DisplayLayout& inverted_layout = 367 display_controller->GetLayoutForDisplay(primary_display); 368 369 EXPECT_EQ("left, -50", inverted_layout.ToString()); 370 371 // Calling the same ID don't do anything. 372 display_controller->SetPrimaryDisplayId(secondary_display.id()); 373 EXPECT_EQ(0, observer.CountAndReset()); 374 375 aura::WindowTracker tracker; 376 tracker.Add(primary_root); 377 tracker.Add(secondary_root); 378 379 // Deleting 2nd display should move the primary to original primary display. 380 UpdateDisplay("200x200"); 381 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 382 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 383 EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 384 EXPECT_EQ(primary_display.id(), 385 Shell::GetScreen()->GetDisplayNearestPoint( 386 gfx::Point(-100, -100)).id()); 387 EXPECT_EQ(primary_display.id(), 388 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 389 EXPECT_TRUE(tracker.Contains(primary_root)); 390 EXPECT_FALSE(tracker.Contains(secondary_root)); 391 EXPECT_TRUE(primary_root->Contains(launcher_window)); 392 393 // Adding 2nd display with the same ID. The 2nd display should become primary 394 // since secondary id is still stored as desirable_primary_id. 395 std::vector<gfx::Display> displays; 396 displays.push_back(primary_display); 397 displays.push_back(secondary_display); 398 aura::DisplayManager* display_manager = 399 aura::Env::GetInstance()->display_manager(); 400 display_manager->OnNativeDisplaysChanged(displays); 401 402 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 403 EXPECT_EQ(secondary_display.id(), 404 Shell::GetScreen()->GetPrimaryDisplay().id()); 405 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 406 EXPECT_EQ( 407 primary_root, 408 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 409 EXPECT_NE( 410 primary_root, 411 display_controller->GetRootWindowForDisplayId(primary_display.id())); 412 EXPECT_TRUE(primary_root->Contains(launcher_window)); 413 414 // Deleting 2nd display and adding 2nd display with a different ID. The 2nd 415 // display shouldn't become primary. 416 UpdateDisplay("200x200"); 417 std::vector<gfx::Display> displays2; 418 gfx::Display third_display( 419 secondary_display.id() + 1, secondary_display.bounds()); 420 ASSERT_NE(primary_display.id(), third_display.id()); 421 displays2.push_back(primary_display); 422 displays2.push_back(third_display); 423 display_manager->OnNativeDisplaysChanged(displays2); 424 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 425 EXPECT_EQ(primary_display.id(), 426 Shell::GetScreen()->GetPrimaryDisplay().id()); 427 EXPECT_EQ(third_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 428 EXPECT_EQ( 429 primary_root, 430 display_controller->GetRootWindowForDisplayId(primary_display.id())); 431 EXPECT_NE( 432 primary_root, 433 display_controller->GetRootWindowForDisplayId(third_display.id())); 434 EXPECT_TRUE(primary_root->Contains(launcher_window)); 435} 436 437TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) { 438 DisplayController* display_controller = 439 Shell::GetInstance()->display_controller(); 440 441 UpdateDisplay("200x200,200x200*2"); 442 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 443 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 444 445 aura::RootWindow* primary_root = 446 display_controller->GetRootWindowForDisplayId(primary_display.id()); 447 aura::RootWindow* secondary_root = 448 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 449 EXPECT_NE(primary_root, secondary_root); 450 451 test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager()); 452 453 EXPECT_EQ(1.0f, 454 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 455 primary_root->MoveCursorTo(gfx::Point(50, 50)); 456 EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor()); 457 EXPECT_EQ(2.0f, 458 secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 459 secondary_root->MoveCursorTo(gfx::Point(50, 50)); 460 EXPECT_EQ(2.0f, test_api.GetDeviceScaleFactor()); 461 462 // Switch primary and secondary 463 display_controller->SetPrimaryDisplay(secondary_display); 464 465 // Cursor's device scale factor should be updated accroding to the swap of 466 // primary and secondary. 467 EXPECT_EQ(1.0f, 468 secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 469 secondary_root->MoveCursorTo(gfx::Point(50, 50)); 470 EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor()); 471 primary_root->MoveCursorTo(gfx::Point(50, 50)); 472 EXPECT_EQ(2.0f, 473 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 474 EXPECT_EQ(2.0f, test_api.GetDeviceScaleFactor()); 475 476 // Deleting 2nd display. 477 UpdateDisplay("200x200"); 478 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 479 480 // Cursor's device scale factor should be updated even without moving cursor. 481 EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor()); 482 483 primary_root->MoveCursorTo(gfx::Point(50, 50)); 484 EXPECT_EQ(1.0f, 485 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 486 EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor()); 487} 488 489TEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) { 490 UpdateDisplay("100x200,300x400"); 491 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 492 Shell::RootWindowList root_windows = 493 Shell::GetInstance()->GetAllRootWindows(); 494 ASSERT_EQ(2U, root_windows.size()); 495 EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString()); 496 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 497 // UpdateDisplay set the origin if it's not set. 498 EXPECT_NE("0,0", root_windows[1]->GetHostOrigin().ToString()); 499 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 500 501 UpdateDisplay("100x200,200+300-300x400"); 502 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 503 EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString()); 504 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 505 EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString()); 506 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 507 508 UpdateDisplay("400+500-200x300,300x400"); 509 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 510 EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString()); 511 EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString()); 512 EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString()); 513 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 514 515 UpdateDisplay("100+200-100x200,300+500-200x300"); 516 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 517 EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString()); 518 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 519 EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString()); 520 EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString()); 521} 522 523} // namespace test 524} // namespace ash 525