display_controller_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// Use of this source code is governed by a BSD-style license that can be
3aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// found in the LICENSE file.
4aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
5aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_controller.h"
6aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
7aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_info.h"
8aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_manager.h"
9aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/launcher/launcher.h"
102e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#include "ash/screen_ash.h"
11aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/shelf/shelf_widget.h"
12aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/shell.h"
13aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/test/ash_test_base.h"
14aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/test/cursor_manager_test_api.h"
15aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/env.h"
16aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/root_window.h"
17aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/test/event_generator.h"
18aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/window_tracker.h"
19aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/base/events/event_handler.h"
2041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt#include "ui/gfx/display.h"
21aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/gfx/screen.h"
2261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include "ui/views/widget/widget.h"
23aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
24aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#if defined(USE_X11)
2561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include "ui/base/x/x11_util.h"
2661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include <X11/Xlib.h>
2761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#undef RootWindow
28aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#endif
29aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
30aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace ash {
31aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace test {
32aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace {
3341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
3441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardtconst char kDesktopBackgroundView[] = "DesktopBackgroundView";
3541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
3641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardtclass TestObserver : public DisplayController::Observer {
3741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt public:
3841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  TestObserver() : changing_count_(0), changed_count_(0) {
3941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt    Shell::GetInstance()->display_controller()->AddObserver(this);
4061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  }
4161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
4261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  virtual ~TestObserver() {
4361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt    Shell::GetInstance()->display_controller()->RemoveObserver(this);
4441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  }
45aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
46aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  virtual void OnDisplayConfigurationChanging() OVERRIDE {
47aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    ++changing_count_;
48aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  }
49aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
50aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  virtual void OnDisplayConfigurationChanged() OVERRIDE {
51aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    ++changed_count_;
52aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  }
53aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
54aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  int CountAndReset() {
55aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    EXPECT_EQ(changing_count_, changed_count_);
56aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    int c = changing_count_;
57aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    changing_count_ = changed_count_ = 0;
58aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    return c;
59aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  }
60aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
61aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt private:
62aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  int changing_count_;
63aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  int changed_count_;
64aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
65aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DISALLOW_COPY_AND_ASSIGN(TestObserver);
66aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt};
67aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
68aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtgfx::Display GetPrimaryDisplay() {
69aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  return Shell::GetScreen()->GetDisplayNearestWindow(
70aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetAllRootWindows()[0]);
71aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
72aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
73aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtgfx::Display GetSecondaryDisplay() {
74aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  return Shell::GetScreen()->GetDisplayNearestWindow(
75aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetAllRootWindows()[1]);
76aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
77aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
78aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position,
79aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                                        int offset) {
80aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DisplayController* display_controller =
81aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetInstance()->display_controller();
82aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DisplayLayout layout(position, offset);
83aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
84aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_controller->SetLayoutForCurrentDisplays(layout);
85aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
86aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
87aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetSecondaryDisplayLayout(DisplayLayout::Position position) {
88aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(position, 0);
89aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
90aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
91aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetDefaultDisplayLayout(DisplayLayout::Position position) {
92aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->display_controller()->
93aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      SetDefaultDisplayLayout(DisplayLayout(position, 0));
94aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
95aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
96aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtclass DisplayControllerShutdownTest : public test::AshTestBase {
97aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt public:
98aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  virtual void TearDown() OVERRIDE {
99aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    test::AshTestBase::TearDown();
100aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    if (!SupportsMultipleDisplays())
101a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt      return;
102a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt
103a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    // Make sure that primary display is accessible after shutdown.
104a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay();
105a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
106a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1078b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt  }
108a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt};
109a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt
110dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardtclass TestEventHandler : public ui::EventHandler {
111dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt public:
1120eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt  TestEventHandler() : target_root_(NULL),
1130eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt                       touch_radius_x_(0.0),
1148b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt                       touch_radius_y_(0.0),
1158b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt                       scroll_x_offset_(0.0),
116d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt                       scroll_y_offset_(0.0),
117d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt                       scroll_x_offset_ordinal_(0.0),
118d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt                       scroll_y_offset_ordinal_(0.0) {}
119d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt  virtual ~TestEventHandler() {}
120d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt
121a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
122a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    if (event->flags() & ui::EF_IS_SYNTHESIZED &&
123a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt        event->type() != ui::ET_MOUSE_EXITED &&
1248b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt        event->type() != ui::ET_MOUSE_ENTERED) {
125a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt      return;
126a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    }
127dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt    aura::Window* target = static_cast<aura::Window*>(event->target());
128dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt    mouse_location_ = event->root_location();
129dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt    target_root_ = target->GetRootWindow();
130dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt    event->StopPropagation();
1310eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt  }
1320eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt
1330eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
1340eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt    aura::Window* target = static_cast<aura::Window*>(event->target());
135dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt    // Only record when the target is the background which covers
136a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    // entire root window.
137a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    if (target->name() != kDesktopBackgroundView)
138a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt      return;
1398b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt    touch_radius_x_ = event->radius_x();
1408b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt    touch_radius_y_ = event->radius_y();
1418b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt    event->StopPropagation();
1428b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt  }
143a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt
144a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
145a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt    aura::Window* target = static_cast<aura::Window*>(event->target());
14604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt    // Only record when the target is the background which covers
147f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    // entire root window.
148f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    if (target->name() != kDesktopBackgroundView)
149f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt      return;
150f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt
151f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    if (event->type() == ui::ET_SCROLL) {
152f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt      scroll_x_offset_ = event->x_offset();
153f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt      scroll_y_offset_ = event->y_offset();
154f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt      scroll_x_offset_ordinal_ = event->x_offset_ordinal();
155f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt      scroll_y_offset_ordinal_ = event->y_offset_ordinal();
156f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    }
157f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    event->StopPropagation();
158f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  }
159f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt
160f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  std::string GetLocationAndReset() {
161f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    std::string result = mouse_location_.ToString();
162f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    mouse_location_.SetPoint(0, 0);
163f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    target_root_ = NULL;
164f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt    return result;
165f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  }
166f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt
167f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  float touch_radius_x() { return touch_radius_x_; }
168f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  float touch_radius_y() { return touch_radius_y_; }
169f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt  float scroll_x_offset() { return scroll_x_offset_; }
17004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float scroll_y_offset() { return scroll_y_offset_; }
17104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; }
17204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; }
17304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
17404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt private:
17504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  gfx::Point mouse_location_;
17604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  aura::RootWindow* target_root_;
17704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
17804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float touch_radius_x_;
17904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float touch_radius_y_;
18004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float scroll_x_offset_;
18104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  float scroll_y_offset_;
182564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  float scroll_x_offset_ordinal_;
183564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  float scroll_y_offset_ordinal_;
18404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
18504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
18604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt};
18704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
1888bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardtgfx::Display::Rotation GetStoredRotation(int64 id) {
1898bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation();
1908bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt}
191564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt
192bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardtfloat GetStoredUIScale(int64 id) {
193bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale();
194564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt}
19504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
19604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#if defined(USE_X11)
197564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardtvoid GetPrimaryAndSeconary(aura::RootWindow** primary,
19804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt                           aura::RootWindow** secondary) {
19904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  *primary = Shell::GetPrimaryRootWindow();
20004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
20104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
20204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt}
20304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
20404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardtstd::string GetXWindowName(aura::RootWindow* window) {
20504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  char* name = NULL;
20604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name);
20704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  return std::string(name);
20804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt}
20904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#endif
21004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
21104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt}  // namespace
21204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
21304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardttypedef test::AshTestBase DisplayControllerTest;
21404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
21504bb988275ac76815a15788a7fc75ac78f3bb833Jan EngelhardtTEST_F(DisplayControllerShutdownTest, Shutdown) {
216564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  if (!SupportsMultipleDisplays())
2178bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt    return;
2188bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt
2198bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt  UpdateDisplay("444x333, 200x200");
220564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt}
221564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt
222564eaf48e14411803a353206eefbb89d525c63ffJan EngelhardtTEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
223bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt  if (!SupportsMultipleDisplays())
224bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt    return;
225564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt
2260787a82873fe9db5dea478942b183e6ff2a8500dJan Engelhardt  TestObserver observer;
227564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  UpdateDisplay("500x500,400x400");
2288bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2298bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt  gfx::Display* secondary_display =
2308bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt      Shell::GetInstance()->display_manager()->GetDisplayAt(1);
231564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  gfx::Insets insets(5, 5, 5, 5);
232564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  secondary_display->UpdateWorkAreaFromInsets(insets);
233564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt
234bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt  // Default layout is RIGHT.
235bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
236564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString());
237564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString());
23804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt
23904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  // Layout the secondary display to the bottom of the primary.
24004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
24104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
24204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2434a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString());
2444a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString());
2454a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt
2464a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  // Layout the secondary display to the left of the primary.
2474a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
2484a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
2494a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2504a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString());
2514a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString());
2524a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt
2534a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  // Layout the secondary display to the top of the primary.
2544a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  SetSecondaryDisplayLayout(DisplayLayout::TOP);
2554a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
2564a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2574a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString());
2584a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString());
2594a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt
2604a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  // Layout to the right with an offset.
2614a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
2624a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2634a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2644a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString());
2654a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt
26661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  // Keep the minimum 100.
26761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
26861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
26961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
27061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString());
27161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
27261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
27361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
27461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
27561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString());
27661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
27761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  //  Layout to the bottom with an offset.
27861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
27961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
28061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
28161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString());
28261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
28361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  // Keep the minimum 100.
28461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
28561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
28661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
28761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString());
28861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
28961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
29061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
29161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
29261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
29361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt}
29461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
29561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan EngelhardtTEST_F(DisplayControllerTest, BoundsUpdated) {
29661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  if (!SupportsMultipleDisplays())
29761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt    return;
29861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
29961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  TestObserver observer;
30061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  SetDefaultDisplayLayout(DisplayLayout::BOTTOM);
30161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("200x200,300x300");  // layout, resize and add.
30261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
30361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
30461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  internal::DisplayManager* display_manager =
30561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt      Shell::GetInstance()->display_manager();
30661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  gfx::Display* secondary_display = display_manager->GetDisplayAt(1);
30761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  gfx::Insets insets(5, 5, 5, 5);
30861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  secondary_display->UpdateWorkAreaFromInsets(insets);
30961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
31061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
31161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
31261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString());
31361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
31461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("400x400,200x200");
31561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());  // two resizes
31661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
31761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString());
31861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
31961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("400x400,300x300");
32061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
32161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
32261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString());
32361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
32461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("400x400");
32561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
32661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
32761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
32861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
32961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("400x500*2,300x300");
33061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
33161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
33261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
33361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
33461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt
33561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  // No change
33661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  UpdateDisplay("400x500*2,300x300");
33761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
338d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt
339d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  // Rotation
340d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  int64 primary_id = GetPrimaryDisplay().id();
341d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
342d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
343d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
344d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
345d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt
346d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  // UI scale is eanbled only on internal display.
347d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  int64 secondary_id = GetSecondaryDisplay().id();
348d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  gfx::Display::SetInternalDisplayId(secondary_id);
349d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
350d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(1, observer.CountAndReset());
351d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
352d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
353d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayUIScale(primary_id, 1.125f);
354d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
355d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  display_manager->SetDisplayUIScale(primary_id, 1.125f);
356d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
357d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt}
358d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt
359d25e217578492d17f7752bf77cfab5f2c2509795Jan EngelhardtTEST_F(DisplayControllerTest, MirroredLayout) {
360d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  if (!SupportsMultipleDisplays())
361d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt    return;
362d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt
363d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  DisplayController* display_controller =
364d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt      Shell::GetInstance()->display_controller();
365d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  UpdateDisplay("500x500,400x400");
36641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
36741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
36841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(
36941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
37041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
37141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  UpdateDisplay("500x500,1+0-500x500");
37241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored);
37341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
37441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(
37541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
37641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
37741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  UpdateDisplay("500x500,500x500");
37841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
37941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
38041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(
38141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
38241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt}
38341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
38441a4cea0f4109fb76762dca073c3c1217658ee06Jan EngelhardtTEST_F(DisplayControllerTest, InvertLayout) {
38541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("left, 0",
38641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
38741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("left, -100",
38841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString());
38941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("left, 50",
39041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString());
39141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
39241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("right, 0",
39341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString());
39441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("right, -90",
39541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString());
39641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("right, 60",
39741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString());
39841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt
39941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("bottom, 0",
40041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString());
40141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ("bottom, -80",
40241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt            DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString());
4032b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("bottom, 70",
4042b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString());
4052b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4062b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("top, 0",
4072b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString());
4082b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("top, -70",
4092b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString());
4102b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("top, 80",
4112b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString());
4122b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt}
4132b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4142b01f706e7ba48d72e57f8e47457a86d9ed44992Jan EngelhardtTEST_F(DisplayControllerTest, SwapPrimary) {
4152b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  if (!SupportsMultipleDisplays())
4162b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt    return;
4172b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4182b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  DisplayController* display_controller =
4192b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt      Shell::GetInstance()->display_controller();
4202b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4212b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  UpdateDisplay("200x200,300x300");
422d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
423d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
424d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt
4252b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
426d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  display_controller->SetLayoutForCurrentDisplays(display_layout);
4272b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4282b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_NE(primary_display.id(), secondary_display.id());
4292b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  aura::RootWindow* primary_root =
4302b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id());
4312b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  aura::RootWindow* secondary_root =
4322b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id());
4332b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_NE(primary_root, secondary_root);
4342b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  aura::Window* launcher_window =
4352b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
4362b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
4372b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_FALSE(secondary_root->Contains(launcher_window));
438d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ(primary_display.id(),
439d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt            Shell::GetScreen()->GetDisplayNearestPoint(
440d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt                gfx::Point(-100, -100)).id());
4412b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ(primary_display.id(),
4422b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
443d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt
444d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
4452b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
4462b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
4472b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
4482b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("right, 50",
4492b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            display_controller->GetCurrentDisplayLayout().ToString());
450d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt
4512b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  // Switch primary and secondary
4522b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  display_controller->SetPrimaryDisplay(secondary_display);
4532b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  const DisplayLayout& inverted_layout =
4542b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt      display_controller->GetCurrentDisplayLayout();
4552b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ("left, -50", inverted_layout.ToString());
4562b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt
4572b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ(secondary_display.id(),
4582b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            Shell::GetScreen()->GetPrimaryDisplay().id());
4592b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
4602b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ(secondary_display.id(),
461d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt            Shell::GetScreen()->GetDisplayNearestPoint(
462d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt                gfx::Point(-100, -100)).id());
4632b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt  EXPECT_EQ(secondary_display.id(),
4642b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
465b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
466b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ(
467b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      primary_root,
468b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
469b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ(
470b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      secondary_root,
471b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id()));
472b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
473b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_FALSE(secondary_root->Contains(launcher_window));
474b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
475b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  // Test if the bounds are correctly swapped.
476b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
477b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
478b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
479b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
480b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
481b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
482b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
483b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
484b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  aura::WindowTracker tracker;
485b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  tracker.Add(primary_root);
486b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  tracker.Add(secondary_root);
487b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
488b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  // Deleting 2nd display should move the primary to original primary display.
489b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  UpdateDisplay("200x200");
49044517bda3d8130638882f69478a8091316f30cbbJan Engelhardt  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
49144517bda3d8130638882f69478a8091316f30cbbJan Engelhardt  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
492b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
493b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_EQ(primary_display.id(),
494b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestPoint(
495b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt                gfx::Point(-100, -100)).id());
496d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ(primary_display.id(),
497d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
498b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_TRUE(tracker.Contains(primary_root));
499b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_FALSE(tracker.Contains(secondary_root));
500b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
501b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt}
502b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
503b8592fa3352018646b0befaa48f930f75c5b7d92Jan EngelhardtTEST_F(DisplayControllerTest, SwapPrimaryById) {
504b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  if (!SupportsMultipleDisplays())
505b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt    return;
506b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
507b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  DisplayController* display_controller =
508b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      Shell::GetInstance()->display_controller();
509b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
510b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  UpdateDisplay("200x200,300x300");
511b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
512b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
513b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
514b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
515f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  display_controller->SetLayoutForCurrentDisplays(display_layout);
516f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
517f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_NE(primary_display.id(), secondary_display.id());
518f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  aura::RootWindow* primary_root =
519f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id());
520f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  aura::RootWindow* secondary_root =
521f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id());
522f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  aura::Window* launcher_window =
523f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
524f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
525f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_FALSE(secondary_root->Contains(launcher_window));
526f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_NE(primary_root, secondary_root);
527f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(primary_display.id(),
528f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestPoint(
529f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt                gfx::Point(-100, -100)).id());
530f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(primary_display.id(),
531f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
532f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
533f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  // Switch primary and secondary by display ID.
534f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  TestObserver observer;
535f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  display_controller->SetPrimaryDisplayId(secondary_display.id());
536f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(secondary_display.id(),
537f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt            Shell::GetScreen()->GetPrimaryDisplay().id());
538f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
539f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_LT(0, observer.CountAndReset());
540f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
541f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(
542f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      primary_root,
543f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
544f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(
545f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      secondary_root,
546f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id()));
547f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
548f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_FALSE(secondary_root->Contains(launcher_window));
549f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
550f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  const DisplayLayout& inverted_layout =
551f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt      display_controller->GetCurrentDisplayLayout();
552f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
553f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ("left, -50", inverted_layout.ToString());
554f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
555f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  // Calling the same ID don't do anything.
556f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  display_controller->SetPrimaryDisplayId(secondary_display.id());
557f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(0, observer.CountAndReset());
558f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
559f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  aura::WindowTracker tracker;
560f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  tracker.Add(primary_root);
561f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  tracker.Add(secondary_root);
562f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt
563f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  // Deleting 2nd display should move the primary to original primary display.
564f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  UpdateDisplay("200x200");
565f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
566f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
567f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
568f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ(primary_display.id(),
569f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestPoint(
570d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt                gfx::Point(-100, -100)).id());
571d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ(primary_display.id(),
572fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
573d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_TRUE(tracker.Contains(primary_root));
574fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_FALSE(tracker.Contains(secondary_root));
575e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
576e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt
577fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  internal::DisplayManager* display_manager =
578e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      Shell::GetInstance()->display_manager();
579d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  // Adding 2nd display with the same ID.  The 2nd display should become primary
580d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  // since secondary id is still stored as desirable_primary_id.
581e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  std::vector<internal::DisplayInfo> display_info_list;
582e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  display_info_list.push_back(
583e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      display_manager->GetDisplayInfo(primary_display.id()));
584d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  display_info_list.push_back(
585e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      display_manager->GetDisplayInfo(secondary_display.id()));
586d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  display_manager->OnNativeDisplaysChanged(display_info_list);
587fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt
588fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
589fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(secondary_display.id(),
590fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt            Shell::GetScreen()->GetPrimaryDisplay().id());
591fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
592fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(
593fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt      primary_root,
594fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
595fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_NE(
596fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt      primary_root,
597fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id()));
598fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
599fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt
600fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
601e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  // display shouldn't become primary.
602d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  UpdateDisplay("200x200");
603fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  internal::DisplayInfo third_display_info(
604e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      secondary_display.id() + 1, std::string(), false);
605fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  third_display_info.SetBounds(secondary_display.bounds());
606fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  ASSERT_NE(primary_display.id(), third_display_info.id());
607e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt
608fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  const internal::DisplayInfo& primary_display_info =
609fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt      display_manager->GetDisplayInfo(primary_display.id());
610e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  std::vector<internal::DisplayInfo> display_info_list2;
611fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  display_info_list2.push_back(primary_display_info);
612fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  display_info_list2.push_back(third_display_info);
613e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  display_manager->OnNativeDisplaysChanged(display_info_list2);
614fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
615fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt  EXPECT_EQ(primary_display.id(),
616e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt            Shell::GetScreen()->GetPrimaryDisplay().id());
617e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id());
618e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  EXPECT_EQ(
619e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      primary_root,
620e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id()));
621e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  EXPECT_NE(
622e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      primary_root,
623e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt      display_controller->GetRootWindowForDisplayId(third_display_info.id()));
624e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  EXPECT_TRUE(primary_root->Contains(launcher_window));
62566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt}
62666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
62766266abd17adc9631f3769ef0b82968c0bac6f38Jan EngelhardtTEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
62866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  if (!SupportsMultipleDisplays())
62966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt    return;
63066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
63166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  DisplayController* display_controller =
63266266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt      Shell::GetInstance()->display_controller();
63366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
63466266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  UpdateDisplay("200x200,200x200*2");
63566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
63666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
63766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
63866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  aura::RootWindow* primary_root =
63966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt      display_controller->GetRootWindowForDisplayId(primary_display.id());
64066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  aura::RootWindow* secondary_root =
64166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt      display_controller->GetRootWindowForDisplayId(secondary_display.id());
64266266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  EXPECT_NE(primary_root, secondary_root);
64366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
64466266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
64566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt
64666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  EXPECT_EQ(1.0f,
64766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
64866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  primary_root->MoveCursorTo(gfx::Point(50, 50));
64966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
65066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  EXPECT_EQ(2.0f,
65166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
652aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  secondary_root->MoveCursorTo(gfx::Point(50, 50));
653dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
6540eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt
655a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt  // Switch primary and secondary
6568b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt  display_controller->SetPrimaryDisplay(secondary_display);
6578bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt
658564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt  // Cursor's device scale factor should be updated accroding to the swap of
65904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  // primary and secondary.
660bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt  EXPECT_EQ(1.0f,
661f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6624a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt  secondary_root->MoveCursorTo(gfx::Point(50, 50));
66361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
664d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt  primary_root->MoveCursorTo(gfx::Point(50, 50));
66541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  EXPECT_EQ(2.0f,
666d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
66766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
668b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt
669b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  // Deleting 2nd display.
670f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  UpdateDisplay("200x200");
671f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
672fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt
673e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  // Cursor's device scale factor should be updated even without moving cursor.
674aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
675aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
676aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  primary_root->MoveCursorTo(gfx::Point(50, 50));
677d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ(1.0f,
678d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
679d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
680d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt}
681dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt
6820eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt#if defined(OS_WIN)
683a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt// TODO(scottmg): RootWindow doesn't get resized on Windows
6848b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt// Ash. http://crbug.com/247916.
6858bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin
686564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt#else
68704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin
688bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt#endif
689f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt
6904a0a17620017c1f45946b2cde7139ef18ea3d93cJan EngelhardtTEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) {
69141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt  UpdateDisplay("100x200,300x400");
692d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
69366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt  Shell::RootWindowList root_windows =
694b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt      Shell::GetInstance()->GetAllRootWindows();
695b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt  ASSERT_EQ(2U, root_windows.size());
696f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString());
697f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
698e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt  // UpdateDisplay set the origin if it's not set.
699aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString());
700aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
701aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
702aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("100x200,200+300-300x400");
703aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
704aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString());
705aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
706aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString());
707aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
708aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
709aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("400+500-200x300,300x400");
710aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
711aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString());
712aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString());
713aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString());
714aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
715aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
716aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("100+200-100x200,300+500-200x300");
717aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
718aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString());
719aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
720aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString());
721aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString());
722aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
723aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
724aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, OverscanInsets) {
725aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  if (!SupportsMultipleDisplays())
726aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    return;
727aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
728aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DisplayController* display_controller =
729aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetInstance()->display_controller();
730aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  TestEventHandler event_handler;
731aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
732aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
733aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("120x200,300x400*2");
734aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
735aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
736aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
737aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_controller->SetOverscanInsets(display1.id(),
738aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                                        gfx::Insets(10, 15, 20, 25));
739aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
740aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
741aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("80,0 150x200",
742aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
743aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
744aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::test::EventGenerator generator(root_windows[0]);
745aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator.MoveMouseToInHost(20, 25);
746aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
747aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
748aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
749aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
750aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("120,0 150x200",
751aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
752aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
753269cbfd30aac18c1fd251be83430dabc60abee0cJan Engelhardt  generator.MoveMouseToInHost(30, 20);
754269cbfd30aac18c1fd251be83430dabc60abee0cJan Engelhardt  EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
755aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
756aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // Make sure the root window transformer uses correct scale
757aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // factor when swapping display. Test crbug.com/253690.
758aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("400x300*2,600x400/o");
75904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  root_windows = Shell::GetAllRootWindows();
76004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt  gfx::Point point;
761aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
762aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("15,10", point.ToString());
763aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
764aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_controller->SwapPrimaryDisplay();
765aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  point.SetPoint(0, 0);
766aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
767aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("15,10", point.ToString());
768aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
769aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
770aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
771aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
772aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, Rotate) {
773aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  if (!SupportsMultipleDisplays())
774aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    return;
775aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
776aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DisplayController* display_controller =
777aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetInstance()->display_controller();
778aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  internal::DisplayManager* display_manager =
779aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetInstance()->display_manager();
780aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  TestEventHandler event_handler;
781aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
782aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
783aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("120x200,300x400*2");
784aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
785aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  int64 display2_id = ScreenAsh::GetSecondaryDisplay().id();
786aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
787aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::test::EventGenerator generator1(root_windows[0]);
788aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
789aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
790aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
791aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("120,0 150x200",
792aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
793aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator1.MoveMouseToInHost(50, 40);
794aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
795aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
796aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
797aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
798aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_manager->SetDisplayRotation(display1.id(),
799aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                                      gfx::Display::ROTATE_90);
800aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
801aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
802aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200,0 150x200",
803aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
804aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator1.MoveMouseToInHost(50, 40);
805aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
806aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
807aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
808aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
809aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
81033d180871bea281a448efd0c1a49517318162382Jan Engelhardt  display_controller->SetLayoutForCurrentDisplays(display_layout);
811aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("50,120 150x200",
812aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
813aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
814aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_manager->SetDisplayRotation(display2_id,
815aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                                      gfx::Display::ROTATE_270);
816aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
817aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
818aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("50,120 200x150",
819aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
820aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
821aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
822aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
823aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#if !defined(OS_WIN)
824aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::test::EventGenerator generator2(root_windows[1]);
825aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator2.MoveMouseToInHost(50, 40);
826aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
827aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_manager->SetDisplayRotation(display1.id(),
828aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                                      gfx::Display::ROTATE_180);
829aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
830aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
831aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
832aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // Dislay must share at least 100, so the x's offset becomes 20.
833aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("20,200 200x150",
834aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
835aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
836aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
837aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
838aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator1.MoveMouseToInHost(50, 40);
839aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
840aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#endif
841aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
842aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
843aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
84433d180871bea281a448efd0c1a49517318162382Jan Engelhardt
845aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, ScaleRootWindow) {
846aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  if (!SupportsMultipleDisplays())
847aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    return;
848aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
849aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  TestEventHandler event_handler;
850aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
851aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
852aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("600x400*2@1.5,500x300");
853aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
854aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
855aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display::SetInternalDisplayId(display1.id());
856aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
857aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display display2 = ScreenAsh::GetSecondaryDisplay();
858aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
859aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
860aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
861aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
862aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
863aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
864aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
865aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::test::EventGenerator generator(root_windows[0]);
866aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator.MoveMouseToInHost(599, 200);
867aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
868aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
869aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  internal::DisplayManager* display_manager =
870aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt      Shell::GetInstance()->display_manager();
871aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display_manager->SetDisplayUIScale(display1.id(), 1.25f);
872aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display1 = Shell::GetScreen()->GetPrimaryDisplay();
873aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  display2 = ScreenAsh::GetSecondaryDisplay();
874aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
875aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
876aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
877aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(1.25f, GetStoredUIScale(display1.id()));
878aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
879aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
880aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
881aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
882aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
883aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, TouchScale) {
884aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  if (!SupportsMultipleDisplays())
885aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt    return;
886aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
887aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  TestEventHandler event_handler;
888aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
889aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
890aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  UpdateDisplay("200x200*2");
891aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
892aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
893aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::RootWindow* root_window = root_windows[0];
894aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  aura::test::EventGenerator generator(root_window);
895aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
896aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator.PressMoveAndReleaseTouchTo(50, 50);
897aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // Default test touches have radius_x/y = 1.0, with device scale
898aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // factor = 2, the scaled radius_x/y should be 0.5.
899aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(0.5, event_handler.touch_radius_x());
900aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(0.5, event_handler.touch_radius_y());
901aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
902aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  generator.ScrollSequence(gfx::Point(0,0),
903aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                           base::TimeDelta::FromMilliseconds(100),
904aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt                           10.0, 1.0, 5, 1);
905aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
906aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  // With device scale factor = 2, ordinal_offset * 2 = offset.
907aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(event_handler.scroll_x_offset(),
908aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            event_handler.scroll_x_offset_ordinal() * 2);
909aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  EXPECT_EQ(event_handler.scroll_y_offset(),
910aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt            event_handler.scroll_y_offset_ordinal() * 2);
911aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt
912aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
913aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}
9143af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9153af739b0e7c3b6dcc986645c57c982d0add5006bJan EngelhardtTEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
9163af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  if (!SupportsMultipleDisplays())
9173af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt    return;
9183af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9193af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  TestEventHandler event_handler;
9203af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
9213af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9223af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  UpdateDisplay("600x400*2/r@1.5");
9233af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9243af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
9253af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
9263af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
9273af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
9283af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
9293af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9303af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  aura::test::EventGenerator generator(root_windows[0]);
9313af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(0, 0);
9323af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
9333af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(599, 0);
9343af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
9353af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(599, 399);
9363af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
9373af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(0, 399);
9383af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
9393af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9403af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  UpdateDisplay("600x400*2/u@1.5");
9413af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  display1 = Shell::GetScreen()->GetPrimaryDisplay();
9423af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  root_windows = Shell::GetAllRootWindows();
9433af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
9443af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
9453af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
9463af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt
9473af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(0, 0);
9483af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("449,299", event_handler.GetLocationAndReset());
9493af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(599, 0);
9503af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,299", event_handler.GetLocationAndReset());
9513af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(599, 399);
9523af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
9533af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt  generator.MoveMouseToInHost(0, 399);
9542e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("449,0", event_handler.GetLocationAndReset());
9552e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9562e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  UpdateDisplay("600x400*2/l@1.5");
9572e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  display1 = Shell::GetScreen()->GetPrimaryDisplay();
9582e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  root_windows = Shell::GetAllRootWindows();
9592e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
9602e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
9612e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
9622e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9632e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  generator.MoveMouseToInHost(0, 0);
9642e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
9652e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  generator.MoveMouseToInHost(599, 0);
9662e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
9672e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  generator.MoveMouseToInHost(599, 399);
9682e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
9692e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  generator.MoveMouseToInHost(0, 399);
9702e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
9712e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9722e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
9732e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt}
9742e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9752e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#if defined(USE_X11)
9762e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan EngelhardtTEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
9772e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
9782e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9792e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  // Multiple display.
9802e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  UpdateDisplay("200x200,300x300");
9812e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  aura::RootWindow* primary, *secondary;
9822e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  GetPrimaryAndSeconary(&primary, &secondary);
9832e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
9842e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
9852e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9862e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  // Swap primary.
9872e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  primary = secondary = NULL;
9882e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
9892e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  GetPrimaryAndSeconary(&primary, &secondary);
9902e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
9912e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
9922e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9932e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  // Switching back to single display.
9942e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  UpdateDisplay("300x400");
9952e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
9962e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt}
9972e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#endif
9982e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt
9992e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt}  // namespace test
10002e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt}  // namespace ash
10012e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt