display_controller_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ash/ash_switches.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_info.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_layout_store.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/cursor_manager_test_api.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/test/display_manager_test_api.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/wm/window_state.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/activation_change_observer.h"
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/activation_client.h"
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/focus_change_observer.h"
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h"
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <X11/Xlib.h>
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#undef RootWindow
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDesktopBackgroundView[] = "DesktopBackgroundView";
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template<typename T>
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class Resetter {
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  explicit Resetter(T* value) : value_(*value) {
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    *value = 0;
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ~Resetter() { }
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  T value() { return value_; }
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  T value_;
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Resetter);
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass TestObserver : public DisplayController::Observer,
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     public gfx::DisplayObserver,
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     public aura::client::FocusChangeObserver,
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     public aura::client::ActivationChangeObserver {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  TestObserver()
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      : changing_count_(0),
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        changed_count_(0),
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        bounds_changed_count_(0),
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        changed_display_id_(0),
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        focus_changed_count_(0),
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        activation_changed_count_(0) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->display_controller()->AddObserver(this);
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Shell::GetScreen()->AddObserver(this);
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    aura::client::GetFocusClient(Shell::GetPrimaryRootWindow())->
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AddObserver(this);
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AddObserver(this);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestObserver() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Shell::GetInstance()->display_controller()->RemoveObserver(this);
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Shell::GetScreen()->RemoveObserver(this);
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    aura::client::GetFocusClient(Shell::GetPrimaryRootWindow())->
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        RemoveObserver(this);
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        RemoveObserver(this);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Overridden from DisplayController::Observer
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDisplayConfigurationChanging() OVERRIDE {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++changing_count_;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayConfigurationChanged() OVERRIDE {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++changed_count_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Overrideen from gfx::DisplayObserver
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    changed_display_id_ = display.id();
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bounds_changed_count_ ++;
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overridden from aura::client::FocusChangeObserver
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnWindowFocused(aura::Window* gained_focus,
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                               aura::Window* lost_focus) OVERRIDE {
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    focus_changed_count_++;
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE {
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    activation_changed_count_++;
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnAttemptToReactivateWindow(
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      aura::Window* request_active,
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      aura::Window* actual_active) OVERRIDE {
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CountAndReset() {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(changing_count_, changed_count_);
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    changed_count_ = 0;
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return Resetter<int>(&changing_count_).value();
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int64 GetBoundsChangedCountAndReset() {
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return Resetter<int>(&bounds_changed_count_).value();
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int64 GetChangedDisplayIdAndReset() {
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return Resetter<int64>(&changed_display_id_).value();
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int GetFocusChangedCountAndReset() {
136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return Resetter<int>(&focus_changed_count_).value();
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int GetActivationChangedCountAndReset() {
140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return Resetter<int>(&activation_changed_count_).value();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int changing_count_;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int changed_count_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int bounds_changed_count_;
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int64 changed_display_id_;
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int focus_changed_count_;
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int activation_changed_count_;
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestObserver);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetPrimaryDisplay() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetScreen()->GetDisplayNearestWindow(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetAllRootWindows()[0]);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetSecondaryDisplay() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetScreen()->GetDisplayNearestWindow(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetAllRootWindows()[1]);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int offset) {
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisplayLayout layout(position, offset);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Shell::GetInstance()->display_manager()->
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SetLayoutForCurrentDisplays(layout);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(position, 0);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetDefaultDisplayLayout(DisplayLayout::Position position) {
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Shell::GetInstance()->display_manager()->layout_store()->
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetDefaultDisplayLayout(DisplayLayout(position, 0));
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayControllerShutdownTest : public test::AshTestBase {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::AshTestBase::TearDown();
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!SupportsMultipleDisplays())
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return;
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure that primary display is accessible after shutdown.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("0,0 444x333", primary.bounds().ToString());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestEventHandler : public ui::EventHandler {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler() : target_root_(NULL),
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       touch_radius_x_(0.0),
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       touch_radius_y_(0.0),
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_x_offset_(0.0),
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_y_offset_(0.0),
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_x_offset_ordinal_(0.0),
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       scroll_y_offset_ordinal_(0.0) {}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestEventHandler() {}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (event->flags() & ui::EF_IS_SYNTHESIZED &&
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        event->type() != ui::ET_MOUSE_EXITED &&
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        event->type() != ui::ET_MOUSE_ENTERED) {
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mouse_location_ = event->root_location();
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_root_ = target->GetRootWindow();
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event->StopPropagation();
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only record when the target is the background which covers
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // entire root window.
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (target->name() != kDesktopBackgroundView)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_radius_x_ = event->radius_x();
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_radius_y_ = event->radius_y();
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event->StopPropagation();
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* target = static_cast<aura::Window*>(event->target());
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Only record when the target is the background which covers
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // entire root window.
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (target->name() != kDesktopBackgroundView)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (event->type() == ui::ET_SCROLL) {
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_x_offset_ = event->x_offset();
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_y_offset_ = event->y_offset();
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_x_offset_ordinal_ = event->x_offset_ordinal();
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scroll_y_offset_ordinal_ = event->y_offset_ordinal();
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event->StopPropagation();
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetLocationAndReset() {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string result = mouse_location_.ToString();
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mouse_location_.SetPoint(0, 0);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target_root_ = NULL;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_x() { return touch_radius_x_; }
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_y() { return touch_radius_y_; }
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset() { return scroll_x_offset_; }
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset() { return scroll_y_offset_; }
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; }
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; }
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Point mouse_location_;
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* target_root_;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_x_;
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float touch_radius_y_;
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_;
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_x_offset_ordinal_;
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float scroll_y_offset_ordinal_;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetStoredRotation(int64 id) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation();
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float GetStoredUIScale(int64 id) {
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetEffectiveUIScale();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GetPrimaryAndSeconary(aura::Window** primary,
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           aura::Window** secondary) {
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  *primary = Shell::GetPrimaryRootWindow();
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0];
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetXWindowName(aura::RootWindow* window) {
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char* name = NULL;
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  XFetchName(gfx::GetXDisplay(), window->host()->GetAcceleratedWidget(), &name);
295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string ret(name);
296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  XFree(name);
297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return ret;
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef test::AshTestBase DisplayControllerTest;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerShutdownTest, Shutdown) {
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("444x333, 200x200");
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, SecondaryDisplayLayout) {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Creates windows to catch activation change event.
317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1));
318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  w1->Focus();
319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("500x500,400x400");
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
325d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets(5, 5, 5, 5);
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 secondary_display_id = ScreenUtil::GetSecondaryDisplay().id();
328ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Shell::GetInstance()->display_manager()->UpdateWorkAreaOfDisplay(
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      secondary_display_id, insets);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default layout is RIGHT.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString());
335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
336d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the bottom of the primary.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the left of the primary.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::LEFT);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout the secondary display to the top of the primary.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayout(DisplayLayout::TOP);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
365d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout to the right with an offset.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the minimum 100.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400);
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  Layout to the bottom with an offset.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200);
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the minimum 100.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490);
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset());
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // resize and add
424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Setting the same layout shouldn't invoke observers.
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400);
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset());
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset());
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(0, observer.CountAndReset());  // resize and add
434d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString());
437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString());
438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
439d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  UpdateDisplay("500x500");
440d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_LE(1, observer.GetFocusChangedCountAndReset());
441d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_LE(1, observer.GetActivationChangedCountAndReset());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)internal::DisplayInfo CreateDisplayInfo(int64 id,
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                        const gfx::Rect& bounds,
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                        float device_scale_factor) {
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::DisplayInfo info(id, "", false);
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.SetBounds(bounds);
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.set_device_scale_factor(device_scale_factor);
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return info;
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DisplayControllerTest, MirrorToDockedWithFullscreen) {
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Creates windows to catch activation change event.
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1));
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  w1->Focus();
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Docked mode.
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::DisplayManager* display_manager =
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Shell::GetInstance()->display_manager();
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const internal::DisplayInfo internal_display_info =
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateDisplayInfo(1, gfx::Rect(0, 0, 500, 500), 2.0f);
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const internal::DisplayInfo external_display_info =
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateDisplayInfo(2, gfx::Rect(0, 0, 500, 500), 1.0f);
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list;
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Mirror.
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(external_display_info);
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int64 internal_display_id =
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test::DisplayManagerTestApi(display_manager).
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetFirstDisplayAsInternalDisplay();
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, internal_display_id);
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, display_manager->num_connected_displays());
481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, display_manager->GetNumDisplays());
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(w1.get());
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_state->ToggleFullscreen();
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("0,0 250x250", w1->bounds().ToString());
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Dock mode.
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestObserver observer;
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.clear();
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(external_display_info);
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, display_manager->GetNumDisplays());
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, display_manager->num_connected_displays());
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset());
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset());
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("0,0 500x500", w1->bounds().ToString());
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, BoundsUpdated) {
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
508d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Creates windows to catch activation change event.
509d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1));
510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  w1->Focus();
511d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetDefaultDisplayLayout(DisplayLayout::BOTTOM);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");  // layout, resize and add.
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
516d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets(5, 5, 5, 5);
522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  display_manager->UpdateWorkAreaOfDisplay(
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay().id(), insets);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400,200x200");
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());  // two resizes
531d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
532d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400,300x300");
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString());
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("400x400");
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_LE(1, observer.GetFocusChangedCountAndReset());
546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_LE(1, observer.GetActivationChangedCountAndReset());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("400x500*2,300x300");
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No change
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("400x500*2,300x300");
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Rotation
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 primary_id = GetPrimaryDisplay().id();
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
569d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // UI scale is eanbled only on internal display.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 secondary_id = GetSecondaryDisplay().id();
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(secondary_id);
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer.CountAndReset());
580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(secondary_id, 1.125f);
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(primary_id, 1.125f);
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(primary_id, 1.125f);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetFocusChangedCountAndReset());
593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, observer.GetActivationChangedCountAndReset());
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimary) {
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  internal::DisplayManager* display_manager =
6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Shell::GetInstance()->display_manager();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  display_manager->SetLayoutForCurrentDisplays(display_layout);
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* primary_root =
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* secondary_root =
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* shelf_window =
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shelf::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(primary_display.id(),
62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                gfx::Point(-100, -100)).id());
62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(primary_display.id(),
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 200x153", primary_display.work_area().ToString());
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("200,0 300x253", secondary_display.work_area().ToString());
63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("right, 50",
63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            display_manager->GetCurrentDisplayLayout().ToString());
63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Switch primary and secondary
63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  display_controller->SetPrimaryDisplay(secondary_display);
63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const DisplayLayout& inverted_layout =
63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_manager->GetCurrentDisplayLayout();
63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("left, -50", inverted_layout.ToString());
64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                gfx::Point(-100, -100)).id());
64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      primary_root,
65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(
65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      secondary_root,
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Test if the bounds are correctly swapped.
66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display swapped_secondary = ScreenUtil::GetSecondaryDisplay();
66258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
66358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("0,0 300x253", swapped_primary.work_area().ToString());
66458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("-200,-50 200x153", swapped_secondary.work_area().ToString());
66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::WindowTracker tracker;
66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tracker.Add(primary_root);
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tracker.Add(secondary_root);
67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Deleting 2nd display should move the primary to original primary display.
67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UpdateDisplay("200x200");
67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(primary_display.id(),
67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                gfx::Point(-100, -100)).id());
68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(primary_display.id(),
68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(tracker.Contains(primary_root));
68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tracker.Contains(secondary_root));
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DisplayControllerTest, FindNearestDisplay) {
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!SupportsMultipleDisplays())
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayController* display_controller =
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shell::GetInstance()->display_controller();
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  internal::DisplayManager* display_manager =
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shell::GetInstance()->display_manager();
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("200x200,300x300");
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_manager->SetLayoutForCurrentDisplays(display_layout);
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* primary_root =
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* secondary_root =
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Test that points outside of any display return the nearest display.
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(-100, 0)).id());
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(0, -100)).id());
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(100, 100)).id());
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(224, 25)).id());
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(226, 25)).id());
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(600, 100)).id());
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(174, 225)).id());
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(176, 225)).id());
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(), Shell::GetScreen()->GetDisplayNearestPoint(
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Point(300, 400)).id());
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimaryForLegacyShelfLayout) {
73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!SupportsMultipleDisplays())
73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ash::switches::kAshDisableAlternateShelfLayout);
73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DisplayController* display_controller =
73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Shell::GetInstance()->display_controller();
73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  internal::DisplayManager* display_manager =
74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Shell::GetInstance()->display_manager();
74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UpdateDisplay("200x200,300x300");
74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
7478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  display_manager->SetLayoutForCurrentDisplays(display_layout);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
7501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* primary_root =
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* secondary_root =
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* shelf_window =
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shelf::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString());
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
768b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("right, 50",
7703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            display_manager->GetCurrentDisplayLayout().ToString());
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplay(secondary_display);
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayLayout& inverted_layout =
7753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      display_manager->GetCurrentDisplayLayout();
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("left, -50", inverted_layout.ToString());
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      secondary_root,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test if the bounds are correctly swapped.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay();
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display swapped_secondary = ScreenUtil::GetSecondaryDisplay();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
803b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString());
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::WindowTracker tracker;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(primary_root);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(secondary_root);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display should move the primary to original primary display.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tracker.Contains(primary_root));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tracker.Contains(secondary_root));
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimaryById) {
8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  internal::DisplayManager* display_manager =
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      Shell::GetInstance()->display_manager();
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,300x300");
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::RIGHT, 50);
8388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  display_manager->SetLayoutForCurrentDisplays(display_layout);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_display.id(), secondary_display.id());
8411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* primary_root =
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
8431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* secondary_root =
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* shelf_window =
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shelf::ForPrimaryDisplay()->shelf_widget()->GetNativeView();
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary by display ID.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplayId(secondary_display.id());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(0, observer.CountAndReset());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      secondary_root,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(secondary_root->Contains(shelf_window));
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DisplayLayout& inverted_layout =
8743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      display_manager->GetCurrentDisplayLayout();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("left, -50", inverted_layout.ToString());
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling the same ID don't do anything.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplayId(secondary_display.id());
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, observer.CountAndReset());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::WindowTracker tracker;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(primary_root);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker.Add(secondary_root);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display should move the primary to original primary display.
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id());
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestPoint(
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                gfx::Point(-100, -100)).id());
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetDisplayNearestWindow(NULL).id());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(tracker.Contains(primary_root));
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(tracker.Contains(secondary_root));
8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding 2nd display with the same ID.  The 2nd display should become primary
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since secondary id is still stored as desirable_primary_id.
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list;
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(primary_display.id()));
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(secondary_display.id()));
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_display.id(),
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(primary_display.id(), ScreenUtil::GetSecondaryDisplay().id());
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id()));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display and adding 2nd display with a different ID.  The 2nd
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // display shouldn't become primary.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayInfo third_display_info(
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      secondary_display.id() + 1, std::string(), false);
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  third_display_info.SetBounds(secondary_display.bounds());
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(primary_display.id(), third_display_info.id());
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const internal::DisplayInfo& primary_display_info =
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_manager->GetDisplayInfo(primary_display.id());
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list2;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list2.push_back(primary_display_info);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list2.push_back(third_display_info);
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list2);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_display.id(),
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().id());
9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(third_display_info.id(), ScreenUtil::GetSecondaryDisplay().id());
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id()));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_root,
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_controller->GetRootWindowForDisplayId(third_display_info.id()));
9455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(primary_root->Contains(shelf_window));
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) {
9497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
9507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
9517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplayController* display_controller =
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Shell::GetInstance()->display_controller();
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200,200x200*2");
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay();
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* primary_root =
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(primary_display.id());
9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* secondary_root =
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      display_controller->GetRootWindowForDisplayId(secondary_display.id());
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(primary_root, secondary_root);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1.0f, primary_root->GetDispatcher()->host()->compositor()->
9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_scale_factor());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2.0f, secondary_root->GetDispatcher()->host()->compositor()->
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_scale_factor());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_root->MoveCursorTo(gfx::Point(50, 50));
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch primary and secondary
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  display_controller->SetPrimaryDisplay(secondary_display);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cursor's device scale factor should be updated accroding to the swap of
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // primary and secondary.
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1.0f, secondary_root->GetDispatcher()->host()->compositor()->
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_scale_factor());
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  secondary_root->MoveCursorTo(gfx::Point(50, 50));
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2.0f, primary_root->GetDispatcher()->host()->compositor()->
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_scale_factor());
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor());
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting 2nd display.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateDisplay("200x200");
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // RootWindow is deleted in a posted task.
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cursor's device scale factor should be updated even without moving cursor.
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  primary_root->MoveCursorTo(gfx::Point(50, 50));
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1.0f, primary_root->GetDispatcher()->host()->compositor()->
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_scale_factor());
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, OverscanInsets) {
10047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
10057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayController* display_controller =
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_controller();
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("120x200,300x400*2");
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
1014f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_controller->SetOverscanInsets(display1.id(),
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gfx::Insets(10, 15, 20, 25));
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString());
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("80,0 150x200",
10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(20, 25);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("5,15", event_handler.GetLocationAndReset());
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1027eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  display_controller->SetOverscanInsets(display1.id(), gfx::Insets());
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString());
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120,0 150x200",
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(30, 20);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("30,20", event_handler.GetLocationAndReset());
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Make sure the root window transformer uses correct scale
1036eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // factor when swapping display. Test crbug.com/253690.
1037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("400x300*2,600x400/o");
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  root_windows = Shell::GetAllRootWindows();
1039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Point point;
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell::GetAllRootWindows()[1]->GetDispatcher()->host()->
1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRootTransform().TransformPoint(&point);
1042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("15,10", point.ToString());
1043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1044eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  display_controller->SwapPrimaryDisplay();
1045eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  point.SetPoint(0, 0);
10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell::GetAllRootWindows()[1]->GetDispatcher()->host()->
1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetRootTransform().TransformPoint(&point);
1048eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("15,10", point.ToString());
1049eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, Rotate) {
10547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("120x200,300x400*2");
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int64 display2_id = ScreenUtil::GetSecondaryDisplay().id();
1065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator1(root_windows[0]);
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120,0 150x200",
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,40", event_handler.GetLocationAndReset());
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id()));
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display1.id(),
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_90);
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString());
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200,0 150x200",
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("40,69", event_handler.GetLocationAndReset());
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id));
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayLayout display_layout(DisplayLayout::BOTTOM, 50);
10898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  display_manager->SetLayoutForCurrentDisplays(display_layout);
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,120 150x200",
10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display2_id,
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_270);
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString());
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("50,120 200x150",
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id()));
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_WIN)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator2(root_windows[1]);
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator2.MoveMouseToInHost(50, 40);
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("179,25", event_handler.GetLocationAndReset());
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager->SetDisplayRotation(display1.id(),
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      gfx::Display::ROTATE_180);
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString());
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString());
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dislay must share at least 100, so the x's offset becomes 20.
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("20,200 200x150",
11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id()));
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id));
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(50, 40);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("69,159", event_handler.GetLocationAndReset());
1119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ScaleRootWindow) {
11257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
11267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
11277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestEventHandler event_handler;
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("600x400*2@1.5,500x300");
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(display1.id());
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Display display2 = ScreenUtil::GetSecondaryDisplay();
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("450,0 500x300", display2.bounds().ToString());
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 200);
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("449,150", event_handler.GetLocationAndReset());
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  internal::DisplayManager* display_manager =
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->display_manager();
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager->SetDisplayUIScale(display1.id(), 1.25f);
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display2 = ScreenUtil::GetSecondaryDisplay();
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 375x250", display1.bounds().ToString());
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString());
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("375,0 500x300", display2.bounds().ToString());
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.25f, GetStoredUIScale(display1.id()));
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1.0f, GetStoredUIScale(display2.id()));
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, TouchScale) {
11637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
11647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
11657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler event_handler;
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("200x200*2");
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
1171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window = root_windows[0];
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(root_window);
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.PressMoveAndReleaseTouchTo(50, 50);
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Default test touches have radius_x/y = 1.0, with device scale
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // factor = 2, the scaled radius_x/y should be 0.5.
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0.5, event_handler.touch_radius_x());
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0.5, event_handler.touch_radius_y());
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.ScrollSequence(gfx::Point(0,0),
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           base::TimeDelta::FromMilliseconds(100),
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           10.0, 1.0, 5, 1);
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ordinal_offset is invariant to the device scale factor.
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(event_handler.scroll_x_offset(),
11874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            event_handler.scroll_x_offset_ordinal());
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(event_handler.scroll_y_offset(),
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            event_handler.scroll_y_offset_ordinal());
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ConvertHostToRootCoords) {
11957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
11967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
11977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestEventHandler event_handler;
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(&event_handler);
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/r@1.5");
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay();
1204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::test::EventGenerator generator(root_windows[0]);
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/u@1.5");
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_windows = Shell::GetAllRootWindows();
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", display1.bounds().ToString());
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString());
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("449,299", event_handler.GetLocationAndReset());
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,299", event_handler.GetLocationAndReset());
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("449,0", event_handler.GetLocationAndReset());
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2/l@1.5");
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display1 = Shell::GetScreen()->GetPrimaryDisplay();
1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root_windows = Shell::GetAllRootWindows();
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", display1.bounds().ToString());
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString());
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1.5f, GetStoredUIScale(display1.id()));
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 0);
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,0", event_handler.GetLocationAndReset());
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 0);
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("299,449", event_handler.GetLocationAndReset());
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(599, 399);
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,449", event_handler.GetLocationAndReset());
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(0, 399);
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("0,0", event_handler.GetLocationAndReset());
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(&event_handler);
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)internal::DisplayInfo CreateDisplayInfo(int64 id,
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                        int y,
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                        gfx::Display::Rotation rotation) {
1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::DisplayInfo info(id, "", false);
1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.SetBounds(gfx::Rect(0, y, 500, 500));
1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  info.set_rotation(rotation);
1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return info;
1263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
1266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Make sure that the compositor based mirroring can switch
1268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// from/to dock mode.
1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(DisplayControllerTest, DockToSingle) {
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!SupportsMultipleDisplays())
1271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  internal::DisplayManager* display_manager =
1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Shell::GetInstance()->display_manager();
1275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int64 internal_id = 1;
1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const internal::DisplayInfo internal_display_info =
1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateDisplayInfo(internal_id, 0, gfx::Display::ROTATE_0);
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const internal::DisplayInfo external_display_info =
1281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateDisplayInfo(2, 1, gfx::Display::ROTATE_90);
1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<internal::DisplayInfo> display_info_list;
1284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Extended
1285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(external_display_info);
1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
1288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int64 internal_display_id =
1289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      test::DisplayManagerTestApi(display_manager).
1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetFirstDisplayAsInternalDisplay();
1291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(internal_id, internal_display_id);
1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2U, display_manager->GetNumDisplays());
1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Dock mode.
1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.clear();
1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(external_display_info);
1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
1298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, display_manager->GetNumDisplays());
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(Shell::GetPrimaryRootWindow()->GetDispatcher()->host()->
1300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               GetRootTransform().IsIdentityOrIntegerTranslation());
1301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Switch to single mode and make sure the transform is the one
1303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // for the internal display.
1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.clear();
1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
1306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager->OnNativeDisplaysChanged(display_info_list);
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(Shell::GetPrimaryRootWindow()->GetDispatcher()->host()->
1308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              GetRootTransform().IsIdentityOrIntegerTranslation());
1309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11)
1312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DisplayControllerTest, XWidowNameForRootWindow) {
13131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_0", GetXWindowName(
13141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetPrimaryRootWindow()->GetDispatcher()));
1315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Multiple display.
1317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("200x200,300x300");
13181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* primary, *secondary;
1319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetPrimaryAndSeconary(&primary, &secondary);
13201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher()));
13211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher()));
1322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Swap primary.
1324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  primary = secondary = NULL;
1325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Shell::GetInstance()->display_controller()->SwapPrimaryDisplay();
1326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetPrimaryAndSeconary(&primary, &secondary);
13271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher()));
13281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher()));
1329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Switching back to single display.
1331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("300x400");
13321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("aura_root_0", GetXWindowName(
13331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Shell::GetPrimaryRootWindow()->GetDispatcher()));
1334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
1336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1338