display_controller_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_info.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_layout_store.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/cursor_manager_test_api.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/events/event_handler.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/x/x11_util.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <X11/Xlib.h>
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#undef RootWindow
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDesktopBackgroundView[] = "DesktopBackgroundView";
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestObserver : public DisplayController::Observer {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestObserver() : changing_count_(0), changed_count_(0) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->display_controller()->AddObserver(this);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestObserver() {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->display_controller()->RemoveObserver(this);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDisplayConfigurationChanging() OVERRIDE {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++changing_count_;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayConfigurationChanged() OVERRIDE {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++changed_count_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CountAndReset() {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(changing_count_, changed_count_);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int c = changing_count_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changing_count_ = changed_count_ = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return c;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int changing_count_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int changed_count_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestObserver);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetPrimaryDisplay() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetScreen()->GetDisplayNearestWindow(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetAllRootWindows()[0]);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetSecondaryDisplay() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetScreen()->GetDisplayNearestWindow(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetAllRootWindows()[1]);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int offset) {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisplayLayout layout(position, offset);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Shell::GetInstance()->display_controller()->
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SetLayoutForCurrentDisplays(layout);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(position, 0);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetDefaultDisplayLayout(DisplayLayout::Position position) {
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Shell::GetInstance()->display_manager()->layout_store()->
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetDefaultDisplayLayout(DisplayLayout(position, 0));
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayControllerShutdownTest : public test::AshTestBase {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::AshTestBase::TearDown();
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!SupportsMultipleDisplays())
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return;
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure that primary display is accessible after shutdown.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestEventHandler : public ui::EventHandler {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler() : target_root_(NULL),
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       touch_radius_x_(0.0),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       touch_radius_y_(0.0),
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_x_offset_(0.0),
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_y_offset_(0.0),
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_x_offset_ordinal_(0.0),
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_y_offset_ordinal_(0.0) {}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestEventHandler() {}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (event->flags() & ui::EF_IS_SYNTHESIZED &&
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        event->type() != ui::ET_MOUSE_EXITED &&
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        event->type() != ui::ET_MOUSE_ENTERED) {
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mouse_location_ = event->root_location();
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_root_ = target->GetRootWindow();
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event->StopPropagation();
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only record when the target is the background which covers
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // entire root window.
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (target->name() != kDesktopBackgroundView)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_radius_x_ = event->radius_x();
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_radius_y_ = event->radius_y();
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event->StopPropagation();
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Only record when the target is the background which covers
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // entire root window.
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (target->name() != kDesktopBackgroundView)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (event->type() == ui::ET_SCROLL) {
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_x_offset_ = event->x_offset();
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_y_offset_ = event->y_offset();
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_x_offset_ordinal_ = event->x_offset_ordinal();
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_y_offset_ordinal_ = event->y_offset_ordinal();
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetLocationAndReset() {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string result = mouse_location_.ToString();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mouse_location_.SetPoint(0, 0);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_root_ = NULL;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_x() { return touch_radius_x_; }
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_y() { return touch_radius_y_; }
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset() { return scroll_x_offset_; }
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset() { return scroll_y_offset_; }
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; }
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; }
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point mouse_location_;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* target_root_;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_x_;
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_y_;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_;
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_;
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_ordinal_;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_ordinal_;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetStoredRotation(int64 id) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float GetStoredUIScale(int64 id) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GetPrimaryAndSeconary(aura::RootWindow** primary,
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           aura::RootWindow** secondary) {
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  *primary = Shell::GetPrimaryRootWindow();
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetXWindowName(aura::RootWindow* window) {
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char* name = NULL;
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name);
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return std::string(name);
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef test::AshTestBase DisplayControllerTest;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerShutdownTest, Shutdown) {
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("444x333, 200x200");
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x500,400x400");
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display* secondary_display =
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager()->GetDisplayAt(1);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets(5, 5, 5, 5);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_display->UpdateWorkAreaFromInsets(insets);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default layout is RIGHT.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the bottom of the primary.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the left of the primary.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the top of the primary.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::TOP);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout to the right with an offset.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the minimum 100.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  Layout to the bottom with an offset.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the minimum 100.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, BoundsUpdated) {
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetDefaultDisplayLayout(DisplayLayout::BOTTOM);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");  // layout, resize and add.
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display* secondary_display = display_manager->GetDisplayAt(1);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets(5, 5, 5, 5);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_display->UpdateWorkAreaFromInsets(insets);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400,200x200");
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // two resizes
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400,300x300");
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400");
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("400x500*2,300x300");
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No change
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("400x500*2,300x300");
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Rotation
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 primary_id = GetPrimaryDisplay().id();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UI scale is eanbled only on internal display.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 secondary_id = GetSecondaryDisplay().id();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(secondary_id);
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(primary_id, 1.125f);
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(primary_id, 1.125f);
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, MirroredLayout) {
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayController* display_controller =
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_controller();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("500x500,400x400");
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateDisplay("1+0-500x500,1+0-500x500");
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("500x500,500x500");
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2U, Shell::GetInstance()->display_manager()->num_connected_displays());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisplayControllerTest, InvertLayout) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("left, 0",
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("left, -100",
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("left, 50",
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("right, 0",
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("right, -90",
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("right, 60",
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bottom, 0",
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bottom, -80",
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bottom, 70",
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("top, 0",
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("top, -70",
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("top, 80",
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimary) {
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_controller->SetLayoutForCurrentDisplays(display_layout);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* primary_root =
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* secondary_root =
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* launcher_window =
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(launcher_window));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
447b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("right, 50",
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_controller->GetCurrentDisplayLayout().ToString());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplay(secondary_display);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayLayout& inverted_layout =
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_controller->GetCurrentDisplayLayout();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("left, -50", inverted_layout.ToString());
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      secondary_root,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(launcher_window));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test if the bounds are correctly swapped.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::WindowTracker tracker;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(primary_root);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(secondary_root);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display should move the primary to original primary display.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tracker.Contains(primary_root));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tracker.Contains(secondary_root));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimaryById) {
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_controller->SetLayoutForCurrentDisplays(display_layout);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* primary_root =
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* secondary_root =
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* launcher_window =
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(launcher_window));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary by display ID.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplayId(secondary_display.id());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0, observer.CountAndReset());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      secondary_root,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(launcher_window));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DisplayLayout& inverted_layout =
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_controller->GetCurrentDisplayLayout();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("left, -50", inverted_layout.ToString());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling the same ID don't do anything.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplayId(secondary_display.id());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::WindowTracker tracker;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(primary_root);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(secondary_root);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display should move the primary to original primary display.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tracker.Contains(primary_root));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tracker.Contains(secondary_root));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding 2nd display with the same ID.  The 2nd display should become primary
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since secondary id is still stored as desirable_primary_id.
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(primary_display.id()));
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(secondary_display.id()));
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display shouldn't become primary.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayInfo third_display_info(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      secondary_display.id() + 1, std::string(), false);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  third_display_info.SetBounds(secondary_display.bounds());
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(primary_display.id(), third_display_info.id());
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const internal::DisplayInfo& primary_display_info =
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(primary_display.id());
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list2;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list2.push_back(primary_display_info);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list2.push_back(third_display_info);
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list2);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(third_display_info.id()));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(launcher_window));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,200x200*2");
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* primary_root =
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* secondary_root =
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f,
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2.0f,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_root->MoveCursorTo(gfx::Point(50, 50));
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplay(secondary_display);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cursor's device scale factor should be updated accroding to the swap of
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // primary and secondary.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_root->MoveCursorTo(gfx::Point(50, 50));
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2.0f,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cursor's device scale factor should be updated even without moving cursor.
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0f,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor());
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(scottmg): RootWindow doesn't get resized on Windows
6847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Ash. http://crbug.com/247916.
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x200,300x400");
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::RootWindowList root_windows =
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->GetAllRootWindows();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateDisplay set the origin if it's not set.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString());
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100x200,200+300-300x400");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString());
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400+500-200x300,300x400");
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString());
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("100+200-100x200,300+500-200x300");
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString());
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, OverscanInsets) {
7257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
7267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayController* display_controller =
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_controller();
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("120x200,300x400*2");
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_controller->SetOverscanInsets(display1.id(),
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gfx::Insets(10, 15, 20, 25));
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("80,0 150x200",
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(20, 25);
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120,0 150x200",
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(30, 20);
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make sure the root window transformer uses correct scale
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // factor when swapping display. Test crbug.com/253690.
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("400x300*2,600x400/o");
759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  root_windows = Shell::GetAllRootWindows();
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Point point;
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("15,10", point.ToString());
763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  display_controller->SwapPrimaryDisplay();
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  point.SetPoint(0, 0);
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point);
767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("15,10", point.ToString());
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, Rotate) {
7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayController* display_controller =
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_controller();
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("120x200,300x400*2");
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 display2_id = ScreenAsh::GetSecondaryDisplay().id();
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator1(root_windows[0]);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120,0 150x200",
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display1.id(),
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_90);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200,0 150x200",
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_controller->SetLayoutForCurrentDisplays(display_layout);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,120 150x200",
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display2_id,
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_270);
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,120 200x150",
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_WIN)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator2(root_windows[1]);
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator2.MoveMouseToInHost(50, 40);
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display1.id(),
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_180);
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dislay must share at least 100, so the x's offset becomes 20.
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("20,200 200x150",
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ScreenAsh::GetSecondaryDisplay().bounds().ToString());
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ScaleRootWindow) {
8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x400*2@1.5,500x300");
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(display1.id());
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display2 = ScreenAsh::GetSecondaryDisplay();
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 200);
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(display1.id(), 1.25f);
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display2 = ScreenAsh::GetSecondaryDisplay();
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.25f, GetStoredUIScale(display1.id()));
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, TouchScale) {
8847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler event_handler;
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("200x200*2");
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::RootWindow* root_window = root_windows[0];
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(root_window);
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.PressMoveAndReleaseTouchTo(50, 50);
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Default test touches have radius_x/y = 1.0, with device scale
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // factor = 2, the scaled radius_x/y should be 0.5.
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0.5, event_handler.touch_radius_x());
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0.5, event_handler.touch_radius_y());
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.ScrollSequence(gfx::Point(0,0),
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           base::TimeDelta::FromMilliseconds(100),
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           10.0, 1.0, 5, 1);
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // With device scale factor = 2, ordinal_offset * 2 = offset.
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(event_handler.scroll_x_offset(),
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            event_handler.scroll_x_offset_ordinal() * 2);
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(event_handler.scroll_y_offset(),
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            event_handler.scroll_y_offset_ordinal() * 2);
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
9167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
9177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
9187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler event_handler;
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/r@1.5");
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/u@1.5");
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_windows = Shell::GetAllRootWindows();
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("449,299", event_handler.GetLocationAndReset());
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,299", event_handler.GetLocationAndReset());
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("449,0", event_handler.GetLocationAndReset());
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/l@1.5");
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_windows = Shell::GetAllRootWindows();
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Multiple display.
980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("200x200,300x300");
981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  aura::RootWindow* primary, *secondary;
982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetPrimaryAndSeconary(&primary, &secondary);
983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Swap primary.
987eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  primary = secondary = NULL;
988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetPrimaryAndSeconary(&primary, &secondary);
990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_0", GetXWindowName(primary));
991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_x", GetXWindowName(secondary));
992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Switching back to single display.
994eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("300x400");
995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow()));
996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1001