Home | History | Annotate | Download | only in display
      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/display/display_info.h"
      8 #include "ash/display/display_layout_store.h"
      9 #include "ash/display/display_manager.h"
     10 #include "ash/launcher/launcher.h"
     11 #include "ash/screen_ash.h"
     12 #include "ash/shelf/shelf_widget.h"
     13 #include "ash/shell.h"
     14 #include "ash/test/ash_test_base.h"
     15 #include "ash/test/cursor_manager_test_api.h"
     16 #include "ui/aura/env.h"
     17 #include "ui/aura/root_window.h"
     18 #include "ui/aura/test/event_generator.h"
     19 #include "ui/aura/window_tracker.h"
     20 #include "ui/base/events/event_handler.h"
     21 #include "ui/gfx/display.h"
     22 #include "ui/gfx/screen.h"
     23 #include "ui/views/widget/widget.h"
     24 
     25 #if defined(USE_X11)
     26 #include "ui/base/x/x11_util.h"
     27 #include <X11/Xlib.h>
     28 #undef RootWindow
     29 #endif
     30 
     31 namespace ash {
     32 namespace {
     33 
     34 const char kDesktopBackgroundView[] = "DesktopBackgroundView";
     35 
     36 class TestObserver : public DisplayController::Observer,
     37                      public gfx::DisplayObserver {
     38  public:
     39   TestObserver()
     40       : changing_count_(0),
     41         changed_count_(0),
     42         bounds_changed_count_(0),
     43         changed_display_id_(0) {
     44     Shell::GetInstance()->display_controller()->AddObserver(this);
     45     Shell::GetScreen()->AddObserver(this);
     46   }
     47 
     48   virtual ~TestObserver() {
     49     Shell::GetInstance()->display_controller()->RemoveObserver(this);
     50     Shell::GetScreen()->RemoveObserver(this);
     51   }
     52 
     53   // Overridden from DisplayController::Observer
     54   virtual void OnDisplayConfigurationChanging() OVERRIDE {
     55     ++changing_count_;
     56   }
     57   virtual void OnDisplayConfigurationChanged() OVERRIDE {
     58     ++changed_count_;
     59   }
     60 
     61   // Overrideen from gfx::DisplayObserver
     62   virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
     63     changed_display_id_ = display.id();
     64     bounds_changed_count_ ++;
     65   }
     66   virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
     67   }
     68   virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
     69   }
     70 
     71   int CountAndReset() {
     72     EXPECT_EQ(changing_count_, changed_count_);
     73     int count = changing_count_;
     74     changing_count_ = changed_count_ = 0;
     75     return count;
     76   }
     77 
     78   int64 GetBoundsChangedCountAndReset() {
     79     int count = bounds_changed_count_;
     80     bounds_changed_count_ = 0;
     81     return count;
     82   }
     83 
     84   int64 GetChangedDisplayIdAndReset() {
     85     int64 id = changed_display_id_;
     86     changed_display_id_ = 0;
     87     return id;
     88   }
     89 
     90  private:
     91   int changing_count_;
     92   int changed_count_;
     93 
     94   int bounds_changed_count_;
     95   int64 changed_display_id_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(TestObserver);
     98 };
     99 
    100 gfx::Display GetPrimaryDisplay() {
    101   return Shell::GetScreen()->GetDisplayNearestWindow(
    102       Shell::GetAllRootWindows()[0]);
    103 }
    104 
    105 gfx::Display GetSecondaryDisplay() {
    106   return Shell::GetScreen()->GetDisplayNearestWindow(
    107       Shell::GetAllRootWindows()[1]);
    108 }
    109 
    110 void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position,
    111                                         int offset) {
    112   DisplayLayout layout(position, offset);
    113   ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
    114   Shell::GetInstance()->display_controller()->
    115       SetLayoutForCurrentDisplays(layout);
    116 }
    117 
    118 void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
    119   SetSecondaryDisplayLayoutAndOffset(position, 0);
    120 }
    121 
    122 void SetDefaultDisplayLayout(DisplayLayout::Position position) {
    123   Shell::GetInstance()->display_manager()->layout_store()->
    124       SetDefaultDisplayLayout(DisplayLayout(position, 0));
    125 }
    126 
    127 class DisplayControllerShutdownTest : public test::AshTestBase {
    128  public:
    129   virtual void TearDown() OVERRIDE {
    130     test::AshTestBase::TearDown();
    131     if (!SupportsMultipleDisplays())
    132       return;
    133 
    134     // Make sure that primary display is accessible after shutdown.
    135     gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay();
    136     EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
    137     EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    138   }
    139 };
    140 
    141 class TestEventHandler : public ui::EventHandler {
    142  public:
    143   TestEventHandler() : target_root_(NULL),
    144                        touch_radius_x_(0.0),
    145                        touch_radius_y_(0.0),
    146                        scroll_x_offset_(0.0),
    147                        scroll_y_offset_(0.0),
    148                        scroll_x_offset_ordinal_(0.0),
    149                        scroll_y_offset_ordinal_(0.0) {}
    150   virtual ~TestEventHandler() {}
    151 
    152   virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
    153     if (event->flags() & ui::EF_IS_SYNTHESIZED &&
    154         event->type() != ui::ET_MOUSE_EXITED &&
    155         event->type() != ui::ET_MOUSE_ENTERED) {
    156       return;
    157     }
    158     aura::Window* target = static_cast<aura::Window*>(event->target());
    159     mouse_location_ = event->root_location();
    160     target_root_ = target->GetRootWindow();
    161     event->StopPropagation();
    162   }
    163 
    164   virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
    165     aura::Window* target = static_cast<aura::Window*>(event->target());
    166     // Only record when the target is the background which covers
    167     // entire root window.
    168     if (target->name() != kDesktopBackgroundView)
    169       return;
    170     touch_radius_x_ = event->radius_x();
    171     touch_radius_y_ = event->radius_y();
    172     event->StopPropagation();
    173   }
    174 
    175   virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
    176     aura::Window* target = static_cast<aura::Window*>(event->target());
    177     // Only record when the target is the background which covers
    178     // entire root window.
    179     if (target->name() != kDesktopBackgroundView)
    180       return;
    181 
    182     if (event->type() == ui::ET_SCROLL) {
    183       scroll_x_offset_ = event->x_offset();
    184       scroll_y_offset_ = event->y_offset();
    185       scroll_x_offset_ordinal_ = event->x_offset_ordinal();
    186       scroll_y_offset_ordinal_ = event->y_offset_ordinal();
    187     }
    188     event->StopPropagation();
    189   }
    190 
    191   std::string GetLocationAndReset() {
    192     std::string result = mouse_location_.ToString();
    193     mouse_location_.SetPoint(0, 0);
    194     target_root_ = NULL;
    195     return result;
    196   }
    197 
    198   float touch_radius_x() { return touch_radius_x_; }
    199   float touch_radius_y() { return touch_radius_y_; }
    200   float scroll_x_offset() { return scroll_x_offset_; }
    201   float scroll_y_offset() { return scroll_y_offset_; }
    202   float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; }
    203   float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; }
    204 
    205  private:
    206   gfx::Point mouse_location_;
    207   aura::RootWindow* target_root_;
    208 
    209   float touch_radius_x_;
    210   float touch_radius_y_;
    211   float scroll_x_offset_;
    212   float scroll_y_offset_;
    213   float scroll_x_offset_ordinal_;
    214   float scroll_y_offset_ordinal_;
    215 
    216   DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
    217 };
    218 
    219 gfx::Display::Rotation GetStoredRotation(int64 id) {
    220   return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation();
    221 }
    222 
    223 float GetStoredUIScale(int64 id) {
    224   return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale();
    225 }
    226 
    227 #if defined(USE_X11)
    228 void GetPrimaryAndSeconary(aura::RootWindow** primary,
    229                            aura::RootWindow** secondary) {
    230   *primary = Shell::GetPrimaryRootWindow();
    231   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    232   *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
    233 }
    234 
    235 std::string GetXWindowName(aura::RootWindow* window) {
    236   char* name = NULL;
    237   XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name);
    238   std::string ret(name);
    239   XFree(name);
    240   return ret;
    241 }
    242 #endif
    243 
    244 }  // namespace
    245 
    246 typedef test::AshTestBase DisplayControllerTest;
    247 
    248 TEST_F(DisplayControllerShutdownTest, Shutdown) {
    249   if (!SupportsMultipleDisplays())
    250     return;
    251 
    252   UpdateDisplay("444x333, 200x200");
    253 }
    254 
    255 TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
    256   if (!SupportsMultipleDisplays())
    257     return;
    258 
    259   TestObserver observer;
    260   UpdateDisplay("500x500,400x400");
    261   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    262   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    263   gfx::Insets insets(5, 5, 5, 5);
    264   int64 secondary_display_id = ScreenAsh::GetSecondaryDisplay().id();
    265   Shell::GetInstance()->display_manager()->UpdateWorkAreaOfDisplay(
    266       secondary_display_id, insets);
    267 
    268   // Default layout is RIGHT.
    269   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    270   EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString());
    271   EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString());
    272 
    273   // Layout the secondary display to the bottom of the primary.
    274   SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
    275   EXPECT_EQ(1, observer.CountAndReset());
    276   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    277   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    278   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    279   EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString());
    280   EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString());
    281 
    282   // Layout the secondary display to the left of the primary.
    283   SetSecondaryDisplayLayout(DisplayLayout::LEFT);
    284   EXPECT_EQ(1, observer.CountAndReset());
    285   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    286   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    287   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    288   EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString());
    289   EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString());
    290 
    291   // Layout the secondary display to the top of the primary.
    292   SetSecondaryDisplayLayout(DisplayLayout::TOP);
    293   EXPECT_EQ(1, observer.CountAndReset());
    294   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    295   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    296   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    297   EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString());
    298   EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString());
    299 
    300   // Layout to the right with an offset.
    301   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
    302   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    303   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    304   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    305   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    306   EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString());
    307 
    308   // Keep the minimum 100.
    309   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
    310   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    311   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    312   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    313   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    314   EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString());
    315 
    316   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
    317   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    318   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    319   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    320   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    321   EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString());
    322 
    323   //  Layout to the bottom with an offset.
    324   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
    325   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    326   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    327   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    328   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    329   EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString());
    330 
    331   // Keep the minimum 100.
    332   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
    333   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    334   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    335   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    336   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    337   EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString());
    338 
    339   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
    340   EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
    341   EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
    342   EXPECT_EQ(1, observer.CountAndReset());  // resize and add
    343   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    344   EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
    345 
    346   // Setting the same layout shouldn't invoke observers.
    347   SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
    348   EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset());
    349   EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset());
    350   EXPECT_EQ(0, observer.CountAndReset());  // resize and add
    351   EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
    352   EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
    353 }
    354 
    355 TEST_F(DisplayControllerTest, BoundsUpdated) {
    356   if (!SupportsMultipleDisplays())
    357     return;
    358 
    359   TestObserver observer;
    360   SetDefaultDisplayLayout(DisplayLayout::BOTTOM);
    361   UpdateDisplay("200x200,300x300");  // layout, resize and add.
    362   EXPECT_EQ(1, observer.CountAndReset());
    363 
    364   internal::DisplayManager* display_manager =
    365       Shell::GetInstance()->display_manager();
    366   gfx::Insets insets(5, 5, 5, 5);
    367   display_manager->UpdateWorkAreaOfDisplay(
    368       ScreenAsh::GetSecondaryDisplay().id(), insets);
    369 
    370   EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
    371   EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
    372   EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString());
    373 
    374   UpdateDisplay("400x400,200x200");
    375   EXPECT_EQ(1, observer.CountAndReset());  // two resizes
    376   EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
    377   EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString());
    378 
    379   UpdateDisplay("400x400,300x300");
    380   EXPECT_EQ(1, observer.CountAndReset());
    381   EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
    382   EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString());
    383 
    384   UpdateDisplay("400x400");
    385   EXPECT_EQ(1, observer.CountAndReset());
    386   EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
    387   EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
    388 
    389   UpdateDisplay("400x500*2,300x300");
    390   EXPECT_EQ(1, observer.CountAndReset());
    391   ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    392   EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
    393   EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
    394 
    395   // No change
    396   UpdateDisplay("400x500*2,300x300");
    397   EXPECT_EQ(0, observer.CountAndReset());
    398 
    399   // Rotation
    400   int64 primary_id = GetPrimaryDisplay().id();
    401   display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
    402   EXPECT_EQ(1, observer.CountAndReset());
    403   display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
    404   EXPECT_EQ(0, observer.CountAndReset());
    405 
    406   // UI scale is eanbled only on internal display.
    407   int64 secondary_id = GetSecondaryDisplay().id();
    408   gfx::Display::SetInternalDisplayId(secondary_id);
    409   display_manager->SetDisplayUIScale(secondary_id, 1.125f);
    410   EXPECT_EQ(1, observer.CountAndReset());
    411   display_manager->SetDisplayUIScale(secondary_id, 1.125f);
    412   EXPECT_EQ(0, observer.CountAndReset());
    413   display_manager->SetDisplayUIScale(primary_id, 1.125f);
    414   EXPECT_EQ(0, observer.CountAndReset());
    415   display_manager->SetDisplayUIScale(primary_id, 1.125f);
    416   EXPECT_EQ(0, observer.CountAndReset());
    417 }
    418 
    419 TEST_F(DisplayControllerTest, MirroredLayout) {
    420   if (!SupportsMultipleDisplays())
    421     return;
    422 
    423   DisplayController* display_controller =
    424       Shell::GetInstance()->display_controller();
    425   UpdateDisplay("500x500,400x400");
    426   EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
    427   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    428   EXPECT_EQ(
    429       2U, Shell::GetInstance()->display_manager()->num_connected_displays());
    430 
    431   UpdateDisplay("1+0-500x500,1+0-500x500");
    432   EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored);
    433   EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
    434   EXPECT_EQ(
    435       2U, Shell::GetInstance()->display_manager()->num_connected_displays());
    436 
    437   UpdateDisplay("500x500,500x500");
    438   EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
    439   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    440   EXPECT_EQ(
    441       2U, Shell::GetInstance()->display_manager()->num_connected_displays());
    442 }
    443 
    444 TEST_F(DisplayControllerTest, InvertLayout) {
    445   EXPECT_EQ("left, 0",
    446             DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
    447   EXPECT_EQ("left, -100",
    448             DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString());
    449   EXPECT_EQ("left, 50",
    450             DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString());
    451 
    452   EXPECT_EQ("right, 0",
    453             DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString());
    454   EXPECT_EQ("right, -90",
    455             DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString());
    456   EXPECT_EQ("right, 60",
    457             DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString());
    458 
    459   EXPECT_EQ("bottom, 0",
    460             DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString());
    461   EXPECT_EQ("bottom, -80",
    462             DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString());
    463   EXPECT_EQ("bottom, 70",
    464             DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString());
    465 
    466   EXPECT_EQ("top, 0",
    467             DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString());
    468   EXPECT_EQ("top, -70",
    469             DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString());
    470   EXPECT_EQ("top, 80",
    471             DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString());
    472 }
    473 
    474 TEST_F(DisplayControllerTest, SwapPrimary) {
    475   if (!SupportsMultipleDisplays())
    476     return;
    477 
    478   DisplayController* display_controller =
    479       Shell::GetInstance()->display_controller();
    480 
    481   UpdateDisplay("200x200,300x300");
    482   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
    483   gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
    484 
    485   DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
    486   display_controller->SetLayoutForCurrentDisplays(display_layout);
    487 
    488   EXPECT_NE(primary_display.id(), secondary_display.id());
    489   aura::RootWindow* primary_root =
    490       display_controller->GetRootWindowForDisplayId(primary_display.id());
    491   aura::RootWindow* secondary_root =
    492       display_controller->GetRootWindowForDisplayId(secondary_display.id());
    493   EXPECT_NE(primary_root, secondary_root);
    494   aura::Window* launcher_window =
    495       Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
    496   EXPECT_TRUE(primary_root->Contains(launcher_window));
    497   EXPECT_FALSE(secondary_root->Contains(launcher_window));
    498   EXPECT_EQ(primary_display.id(),
    499             Shell::GetScreen()->GetDisplayNearestPoint(
    500                 gfx::Point(-100, -100)).id());
    501   EXPECT_EQ(primary_display.id(),
    502             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
    503 
    504   EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
    505   EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
    506   EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
    507   EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
    508   EXPECT_EQ("right, 50",
    509             display_controller->GetCurrentDisplayLayout().ToString());
    510 
    511   // Switch primary and secondary
    512   display_controller->SetPrimaryDisplay(secondary_display);
    513   const DisplayLayout& inverted_layout =
    514       display_controller->GetCurrentDisplayLayout();
    515   EXPECT_EQ("left, -50", inverted_layout.ToString());
    516 
    517   EXPECT_EQ(secondary_display.id(),
    518             Shell::GetScreen()->GetPrimaryDisplay().id());
    519   EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
    520   EXPECT_EQ(secondary_display.id(),
    521             Shell::GetScreen()->GetDisplayNearestPoint(
    522                 gfx::Point(-100, -100)).id());
    523   EXPECT_EQ(secondary_display.id(),
    524             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
    525 
    526   EXPECT_EQ(
    527       primary_root,
    528       display_controller->GetRootWindowForDisplayId(secondary_display.id()));
    529   EXPECT_EQ(
    530       secondary_root,
    531       display_controller->GetRootWindowForDisplayId(primary_display.id()));
    532   EXPECT_TRUE(primary_root->Contains(launcher_window));
    533   EXPECT_FALSE(secondary_root->Contains(launcher_window));
    534 
    535   // Test if the bounds are correctly swapped.
    536   gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
    537   gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
    538   EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
    539   EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
    540   EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
    541 
    542   EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
    543 
    544   aura::WindowTracker tracker;
    545   tracker.Add(primary_root);
    546   tracker.Add(secondary_root);
    547 
    548   // Deleting 2nd display should move the primary to original primary display.
    549   UpdateDisplay("200x200");
    550   RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
    551   EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
    552   EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
    553   EXPECT_EQ(primary_display.id(),
    554             Shell::GetScreen()->GetDisplayNearestPoint(
    555                 gfx::Point(-100, -100)).id());
    556   EXPECT_EQ(primary_display.id(),
    557             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
    558   EXPECT_TRUE(tracker.Contains(primary_root));
    559   EXPECT_FALSE(tracker.Contains(secondary_root));
    560   EXPECT_TRUE(primary_root->Contains(launcher_window));
    561 }
    562 
    563 TEST_F(DisplayControllerTest, SwapPrimaryById) {
    564   if (!SupportsMultipleDisplays())
    565     return;
    566 
    567   DisplayController* display_controller =
    568       Shell::GetInstance()->display_controller();
    569 
    570   UpdateDisplay("200x200,300x300");
    571   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
    572   gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
    573 
    574   DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
    575   display_controller->SetLayoutForCurrentDisplays(display_layout);
    576 
    577   EXPECT_NE(primary_display.id(), secondary_display.id());
    578   aura::RootWindow* primary_root =
    579       display_controller->GetRootWindowForDisplayId(primary_display.id());
    580   aura::RootWindow* secondary_root =
    581       display_controller->GetRootWindowForDisplayId(secondary_display.id());
    582   aura::Window* launcher_window =
    583       Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
    584   EXPECT_TRUE(primary_root->Contains(launcher_window));
    585   EXPECT_FALSE(secondary_root->Contains(launcher_window));
    586   EXPECT_NE(primary_root, secondary_root);
    587   EXPECT_EQ(primary_display.id(),
    588             Shell::GetScreen()->GetDisplayNearestPoint(
    589                 gfx::Point(-100, -100)).id());
    590   EXPECT_EQ(primary_display.id(),
    591             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
    592 
    593   // Switch primary and secondary by display ID.
    594   TestObserver observer;
    595   display_controller->SetPrimaryDisplayId(secondary_display.id());
    596   EXPECT_EQ(secondary_display.id(),
    597             Shell::GetScreen()->GetPrimaryDisplay().id());
    598   EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
    599   EXPECT_LT(0, observer.CountAndReset());
    600 
    601   EXPECT_EQ(
    602       primary_root,
    603       display_controller->GetRootWindowForDisplayId(secondary_display.id()));
    604   EXPECT_EQ(
    605       secondary_root,
    606       display_controller->GetRootWindowForDisplayId(primary_display.id()));
    607   EXPECT_TRUE(primary_root->Contains(launcher_window));
    608   EXPECT_FALSE(secondary_root->Contains(launcher_window));
    609 
    610   const DisplayLayout& inverted_layout =
    611       display_controller->GetCurrentDisplayLayout();
    612 
    613   EXPECT_EQ("left, -50", inverted_layout.ToString());
    614 
    615   // Calling the same ID don't do anything.
    616   display_controller->SetPrimaryDisplayId(secondary_display.id());
    617   EXPECT_EQ(0, observer.CountAndReset());
    618 
    619   aura::WindowTracker tracker;
    620   tracker.Add(primary_root);
    621   tracker.Add(secondary_root);
    622 
    623   // Deleting 2nd display should move the primary to original primary display.
    624   UpdateDisplay("200x200");
    625   RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
    626   EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
    627   EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
    628   EXPECT_EQ(primary_display.id(),
    629             Shell::GetScreen()->GetDisplayNearestPoint(
    630                 gfx::Point(-100, -100)).id());
    631   EXPECT_EQ(primary_display.id(),
    632             Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
    633   EXPECT_TRUE(tracker.Contains(primary_root));
    634   EXPECT_FALSE(tracker.Contains(secondary_root));
    635   EXPECT_TRUE(primary_root->Contains(launcher_window));
    636 
    637   internal::DisplayManager* display_manager =
    638       Shell::GetInstance()->display_manager();
    639   // Adding 2nd display with the same ID.  The 2nd display should become primary
    640   // since secondary id is still stored as desirable_primary_id.
    641   std::vector<internal::DisplayInfo> display_info_list;
    642   display_info_list.push_back(
    643       display_manager->GetDisplayInfo(primary_display.id()));
    644   display_info_list.push_back(
    645       display_manager->GetDisplayInfo(secondary_display.id()));
    646   display_manager->OnNativeDisplaysChanged(display_info_list);
    647 
    648   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    649   EXPECT_EQ(secondary_display.id(),
    650             Shell::GetScreen()->GetPrimaryDisplay().id());
    651   EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
    652   EXPECT_EQ(
    653       primary_root,
    654       display_controller->GetRootWindowForDisplayId(secondary_display.id()));
    655   EXPECT_NE(
    656       primary_root,
    657       display_controller->GetRootWindowForDisplayId(primary_display.id()));
    658   EXPECT_TRUE(primary_root->Contains(launcher_window));
    659 
    660   // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
    661   // display shouldn't become primary.
    662   UpdateDisplay("200x200");
    663   internal::DisplayInfo third_display_info(
    664       secondary_display.id() + 1, std::string(), false);
    665   third_display_info.SetBounds(secondary_display.bounds());
    666   ASSERT_NE(primary_display.id(), third_display_info.id());
    667 
    668   const internal::DisplayInfo& primary_display_info =
    669       display_manager->GetDisplayInfo(primary_display.id());
    670   std::vector<internal::DisplayInfo> display_info_list2;
    671   display_info_list2.push_back(primary_display_info);
    672   display_info_list2.push_back(third_display_info);
    673   display_manager->OnNativeDisplaysChanged(display_info_list2);
    674   EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    675   EXPECT_EQ(primary_display.id(),
    676             Shell::GetScreen()->GetPrimaryDisplay().id());
    677   EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id());
    678   EXPECT_EQ(
    679       primary_root,
    680       display_controller->GetRootWindowForDisplayId(primary_display.id()));
    681   EXPECT_NE(
    682       primary_root,
    683       display_controller->GetRootWindowForDisplayId(third_display_info.id()));
    684   EXPECT_TRUE(primary_root->Contains(launcher_window));
    685 }
    686 
    687 TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
    688   if (!SupportsMultipleDisplays())
    689     return;
    690 
    691   DisplayController* display_controller =
    692       Shell::GetInstance()->display_controller();
    693 
    694   UpdateDisplay("200x200,200x200*2");
    695   gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
    696   gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
    697 
    698   aura::RootWindow* primary_root =
    699       display_controller->GetRootWindowForDisplayId(primary_display.id());
    700   aura::RootWindow* secondary_root =
    701       display_controller->GetRootWindowForDisplayId(secondary_display.id());
    702   EXPECT_NE(primary_root, secondary_root);
    703 
    704   test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
    705 
    706   EXPECT_EQ(1.0f,
    707             primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
    708   primary_root->MoveCursorTo(gfx::Point(50, 50));
    709   EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
    710   EXPECT_EQ(2.0f,
    711             secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
    712   secondary_root->MoveCursorTo(gfx::Point(50, 50));
    713   EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
    714 
    715   // Switch primary and secondary
    716   display_controller->SetPrimaryDisplay(secondary_display);
    717 
    718   // Cursor's device scale factor should be updated accroding to the swap of
    719   // primary and secondary.
    720   EXPECT_EQ(1.0f,
    721             secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
    722   secondary_root->MoveCursorTo(gfx::Point(50, 50));
    723   EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
    724   primary_root->MoveCursorTo(gfx::Point(50, 50));
    725   EXPECT_EQ(2.0f,
    726             primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
    727   EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
    728 
    729   // Deleting 2nd display.
    730   UpdateDisplay("200x200");
    731   RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
    732 
    733   // Cursor's device scale factor should be updated even without moving cursor.
    734   EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
    735 
    736   primary_root->MoveCursorTo(gfx::Point(50, 50));
    737   EXPECT_EQ(1.0f,
    738             primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
    739   EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
    740 }
    741 
    742 #if defined(OS_WIN)
    743 // TODO(scottmg): RootWindow doesn't get resized on Windows
    744 // Ash. http://crbug.com/247916.
    745 #define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin
    746 #else
    747 #define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin
    748 #endif
    749 
    750 TEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) {
    751   UpdateDisplay("100x200,300x400");
    752   ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    753   Shell::RootWindowList root_windows =
    754       Shell::GetInstance()->GetAllRootWindows();
    755   ASSERT_EQ(2U, root_windows.size());
    756   EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString());
    757   EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
    758   // UpdateDisplay set the origin if it's not set.
    759   EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString());
    760   EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
    761 
    762   UpdateDisplay("100x200,200+300-300x400");
    763   ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    764   EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString());
    765   EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
    766   EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString());
    767   EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
    768 
    769   UpdateDisplay("400+500-200x300,300x400");
    770   ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    771   EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString());
    772   EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString());
    773   EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString());
    774   EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
    775 
    776   UpdateDisplay("100+200-100x200,300+500-200x300");
    777   ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
    778   EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString());
    779   EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
    780   EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString());
    781   EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString());
    782 }
    783 
    784 TEST_F(DisplayControllerTest, OverscanInsets) {
    785   if (!SupportsMultipleDisplays())
    786     return;
    787 
    788   DisplayController* display_controller =
    789       Shell::GetInstance()->display_controller();
    790   TestEventHandler event_handler;
    791   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
    792 
    793   UpdateDisplay("120x200,300x400*2");
    794   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
    795   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    796 
    797   display_controller->SetOverscanInsets(display1.id(),
    798                                         gfx::Insets(10, 15, 20, 25));
    799   EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
    800   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
    801   EXPECT_EQ("80,0 150x200",
    802             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    803 
    804   aura::test::EventGenerator generator(root_windows[0]);
    805   generator.MoveMouseToInHost(20, 25);
    806   EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
    807 
    808   display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
    809   EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
    810   EXPECT_EQ("120,0 150x200",
    811             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    812 
    813   generator.MoveMouseToInHost(30, 20);
    814   EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
    815 
    816   // Make sure the root window transformer uses correct scale
    817   // factor when swapping display. Test crbug.com/253690.
    818   UpdateDisplay("400x300*2,600x400/o");
    819   root_windows = Shell::GetAllRootWindows();
    820   gfx::Point point;
    821   Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
    822   EXPECT_EQ("15,10", point.ToString());
    823 
    824   display_controller->SwapPrimaryDisplay();
    825   point.SetPoint(0, 0);
    826   Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
    827   EXPECT_EQ("15,10", point.ToString());
    828 
    829   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
    830 }
    831 
    832 TEST_F(DisplayControllerTest, Rotate) {
    833   if (!SupportsMultipleDisplays())
    834     return;
    835 
    836   DisplayController* display_controller =
    837       Shell::GetInstance()->display_controller();
    838   internal::DisplayManager* display_manager =
    839       Shell::GetInstance()->display_manager();
    840   TestEventHandler event_handler;
    841   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
    842 
    843   UpdateDisplay("120x200,300x400*2");
    844   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
    845   int64 display2_id = ScreenAsh::GetSecondaryDisplay().id();
    846   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    847   aura::test::EventGenerator generator1(root_windows[0]);
    848 
    849   EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
    850   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
    851   EXPECT_EQ("120,0 150x200",
    852             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    853   generator1.MoveMouseToInHost(50, 40);
    854   EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
    855   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
    856   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
    857 
    858   display_manager->SetDisplayRotation(display1.id(),
    859                                       gfx::Display::ROTATE_90);
    860   EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
    861   EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
    862   EXPECT_EQ("200,0 150x200",
    863             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    864   generator1.MoveMouseToInHost(50, 40);
    865   EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
    866   EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
    867   EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
    868 
    869   DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
    870   display_controller->SetLayoutForCurrentDisplays(display_layout);
    871   EXPECT_EQ("50,120 150x200",
    872             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    873 
    874   display_manager->SetDisplayRotation(display2_id,
    875                                       gfx::Display::ROTATE_270);
    876   EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
    877   EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
    878   EXPECT_EQ("50,120 200x150",
    879             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    880   EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
    881   EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
    882 
    883 #if !defined(OS_WIN)
    884   aura::test::EventGenerator generator2(root_windows[1]);
    885   generator2.MoveMouseToInHost(50, 40);
    886   EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
    887   display_manager->SetDisplayRotation(display1.id(),
    888                                       gfx::Display::ROTATE_180);
    889 
    890   EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
    891   EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
    892   // Dislay must share at least 100, so the x's offset becomes 20.
    893   EXPECT_EQ("20,200 200x150",
    894             ScreenAsh::GetSecondaryDisplay().bounds().ToString());
    895   EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
    896   EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
    897 
    898   generator1.MoveMouseToInHost(50, 40);
    899   EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
    900 #endif
    901 
    902   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
    903 }
    904 
    905 TEST_F(DisplayControllerTest, ScaleRootWindow) {
    906   if (!SupportsMultipleDisplays())
    907     return;
    908 
    909   TestEventHandler event_handler;
    910   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
    911 
    912   UpdateDisplay("600x400*2 (at) 1.5,500x300");
    913 
    914   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
    915   gfx::Display::SetInternalDisplayId(display1.id());
    916 
    917   gfx::Display display2 = ScreenAsh::GetSecondaryDisplay();
    918   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    919   EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
    920   EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
    921   EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
    922   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
    923   EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
    924 
    925   aura::test::EventGenerator generator(root_windows[0]);
    926   generator.MoveMouseToInHost(599, 200);
    927   EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
    928 
    929   internal::DisplayManager* display_manager =
    930       Shell::GetInstance()->display_manager();
    931   display_manager->SetDisplayUIScale(display1.id(), 1.25f);
    932   display1 = Shell::GetScreen()->GetPrimaryDisplay();
    933   display2 = ScreenAsh::GetSecondaryDisplay();
    934   EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
    935   EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
    936   EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
    937   EXPECT_EQ(1.25f, GetStoredUIScale(display1.id()));
    938   EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
    939 
    940   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
    941 }
    942 
    943 TEST_F(DisplayControllerTest, TouchScale) {
    944   if (!SupportsMultipleDisplays())
    945     return;
    946 
    947   TestEventHandler event_handler;
    948   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
    949 
    950   UpdateDisplay("200x200*2");
    951   gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
    952   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    953   aura::RootWindow* root_window = root_windows[0];
    954   aura::test::EventGenerator generator(root_window);
    955 
    956   generator.PressMoveAndReleaseTouchTo(50, 50);
    957   // Default test touches have radius_x/y = 1.0, with device scale
    958   // factor = 2, the scaled radius_x/y should be 0.5.
    959   EXPECT_EQ(0.5, event_handler.touch_radius_x());
    960   EXPECT_EQ(0.5, event_handler.touch_radius_y());
    961 
    962   generator.ScrollSequence(gfx::Point(0,0),
    963                            base::TimeDelta::FromMilliseconds(100),
    964                            10.0, 1.0, 5, 1);
    965 
    966   // With device scale factor = 2, ordinal_offset * 2 = offset.
    967   EXPECT_EQ(event_handler.scroll_x_offset(),
    968             event_handler.scroll_x_offset_ordinal() * 2);
    969   EXPECT_EQ(event_handler.scroll_y_offset(),
    970             event_handler.scroll_y_offset_ordinal() * 2);
    971 
    972   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
    973 }
    974 
    975 TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
    976   if (!SupportsMultipleDisplays())
    977     return;
    978 
    979   TestEventHandler event_handler;
    980   Shell::GetInstance()->AddPreTargetHandler(&event_handler);
    981 
    982   UpdateDisplay("600x400*2/r (at) 1.5");
    983 
    984   gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
    985   Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
    986   EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
    987   EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
    988   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
    989 
    990   aura::test::EventGenerator generator(root_windows[0]);
    991   generator.MoveMouseToInHost(0, 0);
    992   EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
    993   generator.MoveMouseToInHost(599, 0);
    994   EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
    995   generator.MoveMouseToInHost(599, 399);
    996   EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
    997   generator.MoveMouseToInHost(0, 399);
    998   EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
    999 
   1000   UpdateDisplay("600x400*2/u (at) 1.5");
   1001   display1 = Shell::GetScreen()->GetPrimaryDisplay();
   1002   root_windows = Shell::GetAllRootWindows();
   1003   EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
   1004   EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
   1005   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
   1006 
   1007   generator.MoveMouseToInHost(0, 0);
   1008   EXPECT_EQ("449,299", event_handler.GetLocationAndReset());
   1009   generator.MoveMouseToInHost(599, 0);
   1010   EXPECT_EQ("0,299", event_handler.GetLocationAndReset());
   1011   generator.MoveMouseToInHost(599, 399);
   1012   EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
   1013   generator.MoveMouseToInHost(0, 399);
   1014   EXPECT_EQ("449,0", event_handler.GetLocationAndReset());
   1015 
   1016   UpdateDisplay("600x400*2/l (at) 1.5");
   1017   display1 = Shell::GetScreen()->GetPrimaryDisplay();
   1018   root_windows = Shell::GetAllRootWindows();
   1019   EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
   1020   EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
   1021   EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
   1022 
   1023   generator.MoveMouseToInHost(0, 0);
   1024   EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
   1025   generator.MoveMouseToInHost(599, 0);
   1026   EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
   1027   generator.MoveMouseToInHost(599, 399);
   1028   EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
   1029   generator.MoveMouseToInHost(0, 399);
   1030   EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
   1031 
   1032   Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
   1033 }
   1034 
   1035 #if defined(USE_X11)
   1036 TEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
   1037   EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
   1038 
   1039   // Multiple display.
   1040   UpdateDisplay("200x200,300x300");
   1041   aura::RootWindow* primary, *secondary;
   1042   GetPrimaryAndSeconary(&primary, &secondary);
   1043   EXPECT_EQ("aura_root_0", GetXWindowName(primary));
   1044   EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
   1045 
   1046   // Swap primary.
   1047   primary = secondary = NULL;
   1048   Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
   1049   GetPrimaryAndSeconary(&primary, &secondary);
   1050   EXPECT_EQ("aura_root_0", GetXWindowName(primary));
   1051   EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
   1052 
   1053   // Switching back to single display.
   1054   UpdateDisplay("300x400");
   1055   EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
   1056 }
   1057 #endif
   1058 
   1059 }  // namespace ash
   1060