12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ash/ash_switches.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_controller.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ash/display/display_info.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_layout_store.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/screen_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/ash_test_base.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/display_manager_test_api.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/test/mirror_window_test_api.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/command_line.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_number_conversions.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/env.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/display_observer.h"
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/gfx/font_render_params.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/screen.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/screen_type_delegate.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::vector;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::string;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::StringPrintf;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string ToDisplayName(int64 id) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return "x-" + base::Int64ToString(id);
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayManagerTest : public test::AshTestBase,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public gfx::DisplayObserver,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public aura::WindowObserver {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayManagerTest()
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : removed_count_(0U),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_window_destroyed_(false) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DisplayManagerTest() {}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AshTestBase::SetUp();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetScreen()->AddObserver(this);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetPrimaryRootWindow()->AddObserver(this);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetPrimaryRootWindow()->RemoveObserver(this);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetScreen()->RemoveObserver(this);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AshTestBase::TearDown();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayManager* display_manager() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Shell::GetInstance()->display_manager();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const vector<gfx::Display>& changed() const { return changed_; }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const vector<gfx::Display>& added() const { return added_; }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string GetCountSummary() const {
73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return StringPrintf("%" PRIuS " %" PRIuS " %" PRIuS,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        changed_.size(), added_.size(), removed_count_);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void reset() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed_.clear();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    added_.clear();
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    removed_count_ = 0U;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window_destroyed_ = false;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool root_window_destroyed() const {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return root_window_destroyed_;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo& GetDisplayInfo(const gfx::Display& display) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return display_manager()->GetDisplayInfo(display.id());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo& GetDisplayInfoAt(int index) {
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return GetDisplayInfo(display_manager()->GetDisplayAt(index));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const gfx::Display& GetDisplayForId(int64 id) {
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return display_manager()->GetDisplayForId(id);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const DisplayInfo& GetDisplayInfoForId(int64 id) {
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return GetDisplayInfo(display_manager()->GetDisplayForId(id));
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aura::DisplayObserver overrides:
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       uint32_t) OVERRIDE {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed_.push_back(display);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    added_.push_back(new_display);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++removed_count_;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aura::WindowObserver overrides:
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(Shell::GetPrimaryRootWindow(), window);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window_destroyed_ = true;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vector<gfx::Display> changed_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vector<gfx::Display> added_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t removed_count_;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool root_window_destroyed_;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DisplayManagerTest);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DisplayManagerTest, UpdateDisplayTest) {
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update primary and add seconary.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("100+0-500x500,0+501-400x400");
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(0).bounds().ToString());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1 1 0", GetCountSummary());
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(display_manager()->GetDisplayAt(0).id(), changed()[0].id());
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(display_manager()->GetDisplayAt(1).id(), added()[0].id());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500", changed()[0].bounds().ToString());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Secondary display is on right.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("500,0 400x400", added()[0].bounds().ToString());
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfo(added()[0]).bounds_in_native().ToString());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delete secondary.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("100+0-500x500");
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 0 1", GetCountSummary());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Change primary.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1+1-1000x600");
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(display_manager()->GetDisplayAt(0).id(), changed()[0].id());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 1000x600", changed()[0].bounds().ToString());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add secondary.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1+1-1000x600,1002+0-600x400");
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 1 0", GetCountSummary());
169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(display_manager()->GetDisplayAt(1).id(), added()[0].id());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Secondary display is on right.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1000,0 600x400", added()[0].bounds().ToString());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1002,0 600x400",
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfo(added()[0]).bounds_in_native().ToString());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Secondary removed, primary changed.
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1+1-800x300");
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1 0 1", GetCountSummary());
180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(display_manager()->GetDisplayAt(0).id(), changed()[0].id());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 800x300", changed()[0].bounds().ToString());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // # of display can go to zero when screen is off.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const vector<DisplayInfo> empty;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(empty);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 0 0", GetCountSummary());
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(root_window_destroyed());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Display configuration stays the same
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 800x300",
192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(0).bounds().ToString());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Connect to display again
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("100+100-500x400");
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(root_window_destroyed());
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x400", changed()[0].bounds().ToString());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100,100 500x400",
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfo(changed()[0]).bounds_in_native().ToString());
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Go back to zero and wake up with multiple displays.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(empty);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(root_window_destroyed());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add secondary.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-1000x600,1000+1000-600x400");
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 1000x600",
215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(0).bounds().ToString());
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Secondary display is on right.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1000,0 600x400",
218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(1).bounds().ToString());
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1000,1000 600x400",
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(1).bounds_in_native().ToString());
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Changing primary will update secondary as well.
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("0+0-800x600,1000+1000-600x400");
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("2 0 0", GetCountSummary());
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  reset();
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("0,0 800x600",
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(0).bounds().ToString());
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("800,0 600x400",
230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(1).bounds().ToString());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test in emulation mode (use_fullscreen_host_window=false)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, EmulatorTest) {
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  display_manager()->AddRemoveDisplay();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update primary and add seconary.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 1 0", GetCountSummary());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  display_manager()->AddRemoveDisplay();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 0 1", GetCountSummary());
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  display_manager()->AddRemoveDisplay();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0 1 0", GetCountSummary());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, OverscanInsetsTest) {
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500,0+501-400x400");
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, display_manager()->GetNumDisplays());
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo& display_info1 = GetDisplayInfoAt(0);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo& display_info2 = GetDisplayInfoAt(1);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_info2.id(), gfx::Insets(13, 12, 11, 10));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<gfx::Display> changed_displays = changed();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, changed_displays.size());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(display_info2.id(), changed_displays[0].id());
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DisplayInfo updated_display_info2 = GetDisplayInfoAt(1);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            updated_display_info2.bounds_in_native().ToString());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("378x376",
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.size_in_pixel().ToString());
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("13,12,11,10",
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.overscan_insets_in_dip().ToString());
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("500,0 378x376",
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that SetOverscanInsets() is idempotent.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(display_info1.id(), gfx::Insets());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_info2.id(), gfx::Insets(13, 12, 11, 10));
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updated_display_info2 = GetDisplayInfoAt(1);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            updated_display_info2.bounds_in_native().ToString());
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("378x376",
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.size_in_pixel().ToString());
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("13,12,11,10",
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.overscan_insets_in_dip().ToString());
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      display_info2.id(), gfx::Insets(10, 11, 12, 13));
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("376x378",
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(1).size_in_pixel().ToString());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("10,11,12,13",
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(1).overscan_insets_in_dip().ToString());
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Recreate a new 2nd display. It won't apply the overscan inset because the
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // new display has a different ID.
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500");
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500,0+501-400x400");
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(1).bounds_in_native().ToString());
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Recreate the displays with the same ID.  It should apply the overscan
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // inset.
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500");
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(display_info1);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(display_info2);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 500x500",
32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updated_display_info2 = GetDisplayInfoAt(1);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("376x378",
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.size_in_pixel().ToString());
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("10,11,12,13",
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.overscan_insets_in_dip().ToString());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // HiDPI but overscan display. The specified insets size should be doubled.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500,0+501-400x400*2");
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(
334ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      display_manager()->GetDisplayAt(1).id(), gfx::Insets(4, 5, 6, 7));
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updated_display_info2 = GetDisplayInfoAt(1);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            updated_display_info2.bounds_in_native().ToString());
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("376x380",
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.size_in_pixel().ToString());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("4,5,6,7",
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.overscan_insets_in_dip().ToString());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("8,10,12,14",
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            updated_display_info2.GetOverscanInsetsInPixel().ToString());
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure switching primary display applies the overscan offset only once.
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->display_controller()->SetPrimaryDisplay(
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScreenUtil::GetSecondaryDisplay());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-500,0 500x500",
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetDisplayInfo(ScreenUtil::GetSecondaryDisplay()).
35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            bounds_in_native().ToString());
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,501 400x400",
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfo(Shell::GetScreen()->GetPrimaryDisplay()).
35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            bounds_in_native().ToString());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 188x190",
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().bounds().ToString());
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, ZeroOverscanInsets) {
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the display change events is emitted for overscan inset changes.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("0+0-500x500,0+501-400x400");
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, display_manager()->GetNumDisplays());
369ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int64 display2_id = display_manager()->GetDisplayAt(1).id();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(display2_id, gfx::Insets(0, 0, 0, 0));
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, changed().size());
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(display2_id, gfx::Insets(1, 0, 0, 0));
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, changed().size());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(display2_id, changed()[0].id());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reset();
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->SetOverscanInsets(display2_id, gfx::Insets(0, 0, 0, 0));
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, changed().size());
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(display2_id, changed()[0].id());
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, TestDeviceScaleOnlyChange) {
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!SupportsHostWindowResize())
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1000x600");
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = Shell::GetPrimaryRootWindow()->GetHost();
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, host->compositor()->device_scale_factor());
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1000x600",
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Shell::GetPrimaryRootWindow()->bounds().size().ToString());
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("1000x600*2");
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, host->compositor()->device_scale_factor());
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("2 0 0", GetCountSummary());
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("500x300",
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Shell::GetPrimaryRootWindow()->bounds().size().ToString());
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DisplayInfo CreateDisplayInfo(int64 id, const gfx::Rect& bounds) {
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DisplayInfo info(id, ToDisplayName(id), false);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.SetBounds(bounds);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return info;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayManagerTest, TestNativeDisplaysChanged) {
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int64 internal_display_id =
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test::DisplayManagerTestApi(display_manager()).
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetFirstDisplayAsInternalDisplay();
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int external_id = 10;
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int mirror_id = 11;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 invalid_id = gfx::Display::kInvalidDisplayID;
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const DisplayInfo internal_display_info =
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 500, 500));
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo external_display_info =
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateDisplayInfo(external_id, gfx::Rect(1, 1, 100, 100));
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo mirrored_display_info =
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateDisplayInfo(mirror_id, gfx::Rect(0, 0, 500, 500));
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string default_bounds =
427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      display_manager()->GetDisplayAt(0).bounds().ToString();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Primary disconnected.
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_bounds,
434ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            display_manager()->GetDisplayAt(0).bounds().ToString());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // External connected while primary was disconnected.
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(external_display_info);
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
446ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(invalid_id, GetDisplayForId(internal_display_id).id());
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x100",
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoForId(external_id).bounds_in_native().ToString());
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
4501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(external_id, Shell::GetScreen()->GetPrimaryDisplay().id());
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(internal_display_id, gfx::Display::InternalDisplayId());
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Primary connected, with different bounds.
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.clear();
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(external_display_info);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(internal_display_id, Shell::GetScreen()->GetPrimaryDisplay().id());
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This combinatino is new, so internal display becomes primary.
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
465ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x100",
46768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoForId(10).bounds_in_native().ToString());
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ToDisplayName(internal_display_id),
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_manager()->GetDisplayNameForId(internal_display_id));
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Emulate suspend.
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.clear();
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
478ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x100",
48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoForId(10).bounds_in_native().ToString());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ToDisplayName(internal_display_id),
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_manager()->GetDisplayNameForId(internal_display_id));
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // External display has disconnected then resumed.
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
4931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // External display was changed during suspend.
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(external_display_info);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // suspend...
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.clear();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and resume with different external display.
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(CreateDisplayInfo(12, gfx::Rect(1, 1, 100, 100)));
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // mirrored...
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.clear();
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(mirrored_display_info);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
525ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(11U, display_manager()->mirrored_display_id());
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(display_manager()->IsMirrored());
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test display name.
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ToDisplayName(internal_display_id),
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_manager()->GetDisplayNameForId(internal_display_id));
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("x-10", display_manager()->GetDisplayNameForId(10));
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("x-11", display_manager()->GetDisplayNameForId(11));
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("x-12", display_manager()->GetDisplayNameForId(12));
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Default name for the id that doesn't exist.
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("Display 100", display_manager()->GetDisplayNameForId(100));
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and exit mirroring.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.clear();
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(external_display_info);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->num_connected_displays());
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
548ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("500,0 100x100",
550ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(10).bounds().ToString());
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Turn off internal
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.clear();
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(external_display_info);
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
557ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(invalid_id, GetDisplayForId(internal_display_id).id());
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("1,1 100x100",
55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoForId(external_id).bounds_in_native().ToString());
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Switched to another display
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.clear();
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_info_list.push_back(internal_display_info);
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "0,0 500x500",
57068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      GetDisplayInfoForId(internal_display_id).bounds_in_native().ToString());
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->num_connected_displays());
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(display_manager()->IsMirrored());
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5751675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch// Make sure crash does not happen if add and remove happens at the same time.
5761675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch// See: crbug.com/414394
5771675a649fd7a8b3cb80ffddae2dc181f122353c5Ben MurdochTEST_F(DisplayManagerTest, DisplayAddRemoveAtTheSameTime) {
5781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (!SupportsMultipleDisplays())
5791675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    return;
5801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  UpdateDisplay("100+0-500x500,0+501-400x400");
5821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  const int64 primary_id = DisplayController::GetPrimaryDisplayId();
5841675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  const int64 secondary_id = ScreenUtil::GetSecondaryDisplay().id();
5851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5861675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  DisplayInfo primary_info = display_manager()->GetDisplayInfo(primary_id);
5871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  DisplayInfo secondary_info = display_manager()->GetDisplayInfo(secondary_id);
5881675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5891675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  // An id which is different from primary and secondary.
5901675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  const int64 third_id = primary_id + secondary_id;
5911675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5921675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  DisplayInfo third_info =
5931675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      CreateDisplayInfo(third_id, gfx::Rect(0, 0, 600, 600));
5941675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
5951675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  std::vector<DisplayInfo> display_info_list;
5961675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  display_info_list.push_back(third_info);
5971675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  display_info_list.push_back(secondary_info);
5981675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  display_manager()->OnNativeDisplaysChanged(display_info_list);
5991675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
6001675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  EXPECT_EQ(third_id, DisplayController::GetPrimaryDisplayId());
6011675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  EXPECT_EQ("600x600", GetDisplayForId(third_id).size().ToString());
6021675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  EXPECT_EQ(secondary_id, ScreenUtil::GetSecondaryDisplay().id());
6031675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
6041675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(scottmg): RootWindow doesn't get resized on Windows
6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Ash. http://crbug.com/247916.
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestNativeDisplaysChangedNoInternal \
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DISABLED_TestNativeDisplaysChangedNoInternal
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestNativeDisplaysChangedNoInternal \
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestNativeDisplaysChangedNoInternal
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, MAYBE_TestNativeDisplaysChangedNoInternal) {
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't change the display info if all displays are disconnected.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Connect another display which will become primary.
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo external_display_info =
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateDisplayInfo(10, gfx::Rect(1, 1, 100, 100));
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(external_display_info);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, display_manager()->GetNumDisplays());
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x100",
63068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoForId(10).bounds_in_native().ToString());
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("100x100", ash::Shell::GetPrimaryRootWindow()->GetHost()->
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetBounds().size().ToString());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN)
6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests that rely on the actual host size/location does not work on windows.
6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_EnsurePointerInDisplays DISABLED_EnsurePointerInDisplays
6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_EnsurePointerInDisplays_2ndOnLeft DISABLED_EnsurePointerInDisplays_2ndOnLeft
6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_EnsurePointerInDisplays EnsurePointerInDisplays
6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_EnsurePointerInDisplays_2ndOnLeft EnsurePointerInDisplays_2ndOnLeft
6427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DisplayManagerTest, MAYBE_EnsurePointerInDisplays) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("200x200,300x300");
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Env* env = aura::Env::GetInstance();
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator(root_windows[0]);
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the initial position.
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(350, 150);
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,150", env->last_mouse_location().ToString());
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // A mouse pointer will stay in the 2nd display.
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300,200x200");
6587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("450,50", env->last_mouse_location().ToString());
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A mouse pointer will be outside of displays and move to the
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // center of 2nd display.
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300,100x100");
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("350,50", env->last_mouse_location().ToString());
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // 2nd display was disconnected, and the cursor is
6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // now in the 1st display.
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("400x400");
6687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("50,350", env->last_mouse_location().ToString());
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1st display's resolution has changed, and the mouse pointer is
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // now outside. Move the mouse pointer to the center of 1st display.
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300");
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150,150", env->last_mouse_location().ToString());
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move the mouse pointer to the bottom of 1st display.
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator.MoveMouseToInHost(150, 290);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150,290", env->last_mouse_location().ToString());
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The mouse pointer is now on 2nd display.
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x280,200x200");
6817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("450,10", env->last_mouse_location().ToString());
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DisplayManagerTest, MAYBE_EnsurePointerInDisplays_2ndOnLeft) {
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the 2nd display on the left.
6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayLayoutStore* layout_store =
6877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      Shell::GetInstance()->display_manager()->layout_store();
6887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DisplayLayout layout = layout_store->default_display_layout();
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout.position = DisplayLayout::LEFT;
6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  layout_store->SetDefaultDisplayLayout(layout);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("200x200,300x300");
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-300,0 300x300",
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ScreenUtil::GetSecondaryDisplay().bounds().ToString());
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Env* env = aura::Env::GetInstance();
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the initial position.
7017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  root_windows[0]->MoveCursorTo(gfx::Point(-150, 250));
7027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("-150,250", env->last_mouse_location().ToString());
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // A mouse pointer will stay in 2nd display.
7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateDisplay("300x300,200x300");
7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("-50,150", env->last_mouse_location().ToString());
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A mouse pointer will be outside of displays and move to the
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // center of 2nd display.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300,200x100");
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-100,50", env->last_mouse_location().ToString());
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2nd display was disconnected. Mouse pointer should move to
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1st display.
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("300x300");
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("150,150", env->last_mouse_location().ToString());
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayManagerTest, NativeDisplaysChangedAfterPrimaryChange) {
7207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
7227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 internal_display_id =
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test::DisplayManagerTestApi(display_manager()).
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetFirstDisplayAsInternalDisplay();
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo native_display_info =
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 500, 500));
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const DisplayInfo secondary_display_info =
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateDisplayInfo(10, gfx::Rect(1, 1, 100, 100));
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(native_display_info);
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_info_list.push_back(secondary_display_info);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, display_manager()->GetNumDisplays());
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 500x500",
737ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
738ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("500,0 100x100", GetDisplayForId(10).bounds().ToString());
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->display_controller()->SetPrimaryDisplay(
741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetDisplayForId(secondary_display_info.id()));
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-500,0 500x500",
743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
744ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("0,0 100x100", GetDisplayForId(10).bounds().ToString());
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnNativeDisplaysChanged may change the display bounds.  Here makes sure
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // nothing changed if the exactly same displays are specified.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-500,0 500x500",
750ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            GetDisplayForId(internal_display_id).bounds().ToString());
751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ("0,0 100x100", GetDisplayForId(10).bounds().ToString());
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(DisplayManagerTest, DontRememberBestResolution) {
7553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int display_id = 1000;
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DisplayInfo native_display_info =
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateDisplayInfo(display_id, gfx::Rect(0, 0, 1000, 500));
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<DisplayMode> display_modes;
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(1000, 500), 58.0f, false, true));
7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(800, 300), 59.0f, false, false));
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(400, 500), 60.0f, false, false));
7653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  native_display_info.set_display_modes(display_modes);
7673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
7693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  display_info_list.push_back(native_display_info);
7703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
7713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayMode mode;
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayMode expected_mode;
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.size = gfx::Size(1000, 500);
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
7793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Unsupported resolution.
7813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 4000));
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
7863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Supported resolution.
7883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 300));
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("800x300", mode.size.ToString());
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(59.0f, mode.refresh_rate);
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(mode.native);
7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.size = gfx::Size(800, 300);
7955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
7965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
7973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Best resolution.
7993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  display_manager()->SetDisplayResolution(display_id, gfx::Size(1000, 500));
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("1000x500", mode.size.ToString());
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(58.0f, mode.refresh_rate);
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(mode.native);
8055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.size = gfx::Size(1000, 500);
8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DisplayManagerTest, ResolutionFallback) {
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int display_id = 1000;
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayInfo native_display_info =
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateDisplayInfo(display_id, gfx::Rect(0, 0, 1000, 500));
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<DisplayMode> display_modes;
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(1000, 500), 58.0f, false, true));
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(800, 300), 59.0f, false, false));
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_modes.push_back(
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DisplayMode(gfx::Size(400, 500), 60.0f, false, false));
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<DisplayMode> copy = display_modes;
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  native_display_info.set_display_modes(copy);
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_info_list.push_back(native_display_info);
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 300));
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DisplayInfo new_native_display_info =
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateDisplayInfo(display_id, gfx::Rect(0, 0, 400, 500));
8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    copy = display_modes;
8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_native_display_info.set_display_modes(copy);
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<DisplayInfo> new_display_info_list;
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_display_info_list.push_back(new_native_display_info);
8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    display_manager()->OnNativeDisplaysChanged(new_display_info_list);
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DisplayMode mode;
8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("400x500", mode.size.ToString());
8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(60.0f, mode.refresh_rate);
8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(mode.native);
8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Best resolution should find itself on the resolutions list.
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 300));
8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DisplayInfo new_native_display_info =
8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateDisplayInfo(display_id, gfx::Rect(0, 0, 1000, 500));
8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<DisplayMode> copy = display_modes;
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_native_display_info.set_display_modes(copy);
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<DisplayInfo> new_display_info_list;
8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_display_info_list.push_back(new_native_display_info);
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    display_manager()->OnNativeDisplaysChanged(new_display_info_list);
8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DisplayMode mode;
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        display_manager()->GetSelectedModeForDisplayId(display_id, &mode));
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("1000x500", mode.size.ToString());
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(58.0f, mode.refresh_rate);
8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(mode.native);
8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayManagerTest, Rotate) {
8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("100x200/r,300x400/l");
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x200",
87168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("200x100",
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(0).size_in_pixel().ToString());
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,201 300x400",
87668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(1).bounds_in_native().ToString());
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("400x300",
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(1).size_in_pixel().ToString());
87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  reset();
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDisplay("100x200/b,300x400");
88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("2 0 0", GetCountSummary());
88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  reset();
88390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,1 100x200",
88568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(0).bounds_in_native().ToString());
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("100x200",
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(0).size_in_pixel().ToString());
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("1,201 300x400",
89068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            GetDisplayInfoAt(1).bounds_in_native().ToString());
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("300x400",
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetDisplayInfoAt(1).size_in_pixel().ToString());
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Just Rotating display will change the bounds on both display.
895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("100x200/l,300x400");
896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("2 0 0", GetCountSummary());
897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  reset();
898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Updating to the same configuration should report no changes.
900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateDisplay("100x200/l,300x400");
901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("0 0 0", GetCountSummary());
902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  reset();
903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Rotating 180 degrees should report one change.
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UpdateDisplay("100x200/r,300x400");
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  reset();
908eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateDisplay("200x200");
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("1 0 1", GetCountSummary());
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  reset();
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Rotating 180 degrees should report one change.
914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UpdateDisplay("200x200/u");
915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  reset();
917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateDisplay("200x200/l");
91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("1 0 0", GetCountSummary());
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DisplayManagerTest, UIScale) {
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo::SetUse125DSFForUIScaling(false);
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("1280x800");
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int64 display_id = Shell::GetScreen()->GetPrimaryDisplay().id();
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0, GetDisplayInfoAt(0).configured_ui_scale());
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(display_id);
937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.5f);
939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.25f);
941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.125f, GetDisplayInfoAt(0).configured_ui_scale());
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.6f);
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.5f);
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.5f, GetDisplayInfoAt(0).configured_ui_scale());
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("1366x768");
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.5f);
957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.25f);
959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.125f, GetDisplayInfoAt(0).configured_ui_scale());
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.125f, GetDisplayInfoAt(0).configured_ui_scale());
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.75f, GetDisplayInfoAt(0).configured_ui_scale());
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.6f);
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.6f, GetDisplayInfoAt(0).configured_ui_scale());
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.6f, GetDisplayInfoAt(0).configured_ui_scale());
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.5f);
971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.5f, GetDisplayInfoAt(0).configured_ui_scale());
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("1280x850*2");
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.5f);
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.5f, GetDisplayInfoAt(0).configured_ui_scale());
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.25f);
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.25f, GetDisplayInfoAt(0).configured_ui_scale());
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.125f, GetDisplayInfoAt(0).configured_ui_scale());
981f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.0f);
982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2.0f, display.device_scale_factor());
985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("640x425", display.bounds().size().ToString());
986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.6f);
994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.5f);
996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0.5f, GetDisplayInfoAt(0).configured_ui_scale());
997f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
998f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 2.0f);
999f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2.0f, GetDisplayInfoAt(0).configured_ui_scale());
1000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveUIScale());
1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display = Shell::GetScreen()->GetPrimaryDisplay();
1002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1.0f, display.device_scale_factor());
1003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("1280x850", display.bounds().size().ToString());
10045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // 1.25 ui scaling on 1.25 DSF device should use 1.0 DSF
10065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // on screen.
10075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateDisplay("1280x850*1.25");
10085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.25f);
10095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.25f, GetDisplayInfoAt(0).configured_ui_scale());
10105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveUIScale());
10115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display = Shell::GetScreen()->GetPrimaryDisplay();
10125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, display.device_scale_factor());
10135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1280x850", display.bounds().size().ToString());
10145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
10155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DisplayManagerTest, UIScaleWithDisplayMode) {
10175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int display_id = 1000;
10185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Setup the display modes with UI-scale.
10205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayInfo native_display_info =
10215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      CreateDisplayInfo(display_id, gfx::Rect(0, 0, 1280, 800));
10225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<DisplayMode> display_modes;
10235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const DisplayMode base_mode(gfx::Size(1280, 800), 60.0f, false, false);
10245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<float> scales =
10255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      DisplayManager::GetScalesForDisplay(native_display_info);
10265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (size_t i = 0; i < scales.size(); i++) {
10275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DisplayMode mode = base_mode;
10285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    mode.ui_scale = scales[i];
10295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    mode.native = (scales[i] == 1.0f);
10305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    display_modes.push_back(mode);
10315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
10325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  native_display_info.set_display_modes(display_modes);
10335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<DisplayInfo> display_info_list;
10345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_info_list.push_back(native_display_info);
10355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->OnNativeDisplaysChanged(display_info_list);
10365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DisplayMode expected_mode = base_mode;
10385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
10425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0, GetDisplayInfoAt(0).configured_ui_scale());
10435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
10465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
10475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
10505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
10515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
10545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
10555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Display::SetInternalDisplayId(display_id);
10595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.5f);
10615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
10625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.25f);
10655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).configured_ui_scale());
10665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 1.125f);
10695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1.125f, GetDisplayInfoAt(0).configured_ui_scale());
10705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.ui_scale = 1.125f;
10715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.8f);
10745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
10755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.ui_scale = 0.8f;
10765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.75f);
10795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0.8f, GetDisplayInfoAt(0).configured_ui_scale());
10805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.625f);
10835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
10845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.ui_scale = 0.625f;
10855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.6f);
10885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0.625f, GetDisplayInfoAt(0).configured_ui_scale());
10895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
10915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  display_manager()->SetDisplayUIScale(display_id, 0.5f);
10925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(0.5f, GetDisplayInfoAt(0).configured_ui_scale());
10935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  expected_mode.ui_scale = 0.5f;
10945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(expected_mode.IsEquivalent(
10955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      display_manager()->GetActiveModeForDisplayId(display_id)));
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DisplayManagerTest, Use125DSFRorUIScaling) {
1100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int64 display_id = Shell::GetScreen()->GetPrimaryDisplay().id();
1101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::Display::SetInternalDisplayId(display_id);
11021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo::SetUse125DSFForUIScaling(true);
1103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateDisplay("1920x1080*1.25");
1105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveDeviceScaleFactor());
11061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveUIScale());
11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager()->SetDisplayUIScale(display_id, 0.8f);
11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1.25f, GetDisplayInfoAt(0).GetEffectiveDeviceScaleFactor());
11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveUIScale());
11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("1536x864", GetDisplayForId(display_id).size().ToString());
1112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  display_manager()->SetDisplayUIScale(display_id, 0.5f);
1114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveDeviceScaleFactor());
1115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(0.5f, GetDisplayInfoAt(0).GetEffectiveUIScale());
1116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ("960x540", GetDisplayForId(display_id).size().ToString());
1117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager()->SetDisplayUIScale(display_id, 1.25f);
1119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1.0f, GetDisplayInfoAt(0).GetEffectiveDeviceScaleFactor());
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1.25f, GetDisplayInfoAt(0).GetEffectiveUIScale());
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ("2400x1350", GetDisplayForId(display_id).size().ToString());
1122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo::SetUse125DSFForUIScaling(false);
1124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN)
11277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(scottmg): RootWindow doesn't get resized on Windows
11287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Ash. http://crbug.com/247916.
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_UpdateMouseCursorAfterRotateZoom DISABLED_UpdateMouseCursorAfterRotateZoom
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_UpdateMouseCursorAfterRotateZoom UpdateMouseCursorAfterRotateZoom
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DisplayManagerTest, MAYBE_UpdateMouseCursorAfterRotateZoom) {
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Make sure just rotating will not change native location.
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("300x200,200x150");
1137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Env* env = aura::Env::GetInstance();
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator1(root_windows[0]);
11415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator generator2(root_windows[1]);
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test on 1st display.
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(150, 50);
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("150,50", env->last_mouse_location().ToString());
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("300x200/r,200x150");
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("50,149", env->last_mouse_location().ToString());
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test on 2nd display.
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator2.MoveMouseToInHost(50, 100);
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("250,100", env->last_mouse_location().ToString());
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("300x200/r,200x150/l");
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("249,50", env->last_mouse_location().ToString());
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The native location is now outside, so move to the center
11567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // of closest display.
11577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateDisplay("300x200/r,100x50/l");
11587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("225,50", env->last_mouse_location().ToString());
11597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Make sure just zooming will not change native location.
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2,400x300");
1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test on 1st display.
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  generator1.MoveMouseToInHost(200, 300);
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("100,150", env->last_mouse_location().ToString());
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400*2@1.5,400x300");
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("150,225", env->last_mouse_location().ToString());
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test on 2nd display.
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400,400x300*2");
11717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  generator2.MoveMouseToInHost(200, 250);
11727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("700,125", env->last_mouse_location().ToString());
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateDisplay("600x400,400x300*2@1.5");
11747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ("750,187", env->last_mouse_location().ToString());
11757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The native location is now outside, so move to the
11777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // center of closest display.
11787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  UpdateDisplay("600x400,400x200*2@1.5");
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("750,75", env->last_mouse_location().ToString());
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TestDisplayObserver : public gfx::DisplayObserver {
1183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestDisplayObserver() : changed_(false) {}
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~TestDisplayObserver() {}
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // gfx::DisplayObserver overrides:
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDisplayMetricsChanged(const gfx::Display&,uint32_t) OVERRIDE {}
1189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Mirror window should already be delete before restoring
1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // the external display.
1192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(test_api.GetHost());
1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    changed_ = true;
1194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Mirror window should not be created until the external display
1197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // is removed.
1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(test_api.GetHost());
1199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    changed_ = true;
1200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool changed_and_reset() {
1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool changed = changed_;
1204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    changed_ = false;
1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return changed;
1206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  test::MirrorWindowTestApi test_api;
1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool changed_;
1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestDisplayObserver);
1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
12157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayManagerTest, SoftwareMirroring) {
12167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!SupportsMultipleDisplays())
12177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
12187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateDisplay("300x400,400x500");
122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::MirrorWindowTestApi test_api;
1222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, test_api.GetHost());
122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestDisplayObserver display_observer;
1225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetScreen()->AddObserver(&display_observer);
1226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
12281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  display_manager->SetSecondDisplayMode(DisplayManager::MIRRORING);
122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  display_manager->UpdateDisplays();
1230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(display_observer.changed_and_reset());
123190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, display_manager->GetNumDisplays());
123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("0,0 300x400",
123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            Shell::GetScreen()->GetPrimaryDisplay().bounds().ToString());
1234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("400x500", test_api.GetHost()->GetBounds().size().ToString());
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("300x400",
1236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
123790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(display_manager->IsMirrored());
123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  display_manager->SetMirrorMode(false);
1240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(display_observer.changed_and_reset());
1241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, test_api.GetHost());
124290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(2U, display_manager->GetNumDisplays());
124390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(display_manager->IsMirrored());
1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Make sure the mirror window has the pixel size of the
1246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // source display.
1247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  display_manager->SetMirrorMode(true);
1248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(display_observer.changed_and_reset());
1249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateDisplay("300x400@0.5,400x500");
1251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(display_observer.changed_and_reset());
1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("300x400",
1253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
1254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateDisplay("310x410*2,400x500");
1256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(display_observer.changed_and_reset());
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("310x410",
1258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
1259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateDisplay("320x420/r,400x500");
1261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(display_observer.changed_and_reset());
1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("320x420",
1263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
1264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateDisplay("330x440/r,400x500");
1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(display_observer.changed_and_reset());
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("330x440",
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overscan insets are ignored.
1271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UpdateDisplay("400x600/o,600x800/o");
1272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(display_observer.changed_and_reset());
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("400x600",
1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            test_api.GetHost()->window()->bounds().size().ToString());
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell::GetScreen()->RemoveObserver(&display_observer);
127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
12801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Make sure this does not cause any crashes. See http://crbug.com/412910
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This test is limited to OS_CHROMEOS because CursorCompositingEnabled is only
12821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// for ChromeOS.
12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DisplayManagerTest, SoftwareMirroringWithCompositingCursor) {
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!SupportsMultipleDisplays())
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateDisplay("300x400,400x500");
12881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test::MirrorWindowTestApi test_api;
12901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(NULL, test_api.GetHost());
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
12931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo secondary_info = display_manager->GetDisplayInfo(
12941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ScreenUtil::GetSecondaryDisplay().id());
12951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager->SetSoftwareMirroring(true);
12971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager->UpdateDisplays();
12981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(root_windows[0]->Contains(test_api.GetCursorWindow()));
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell::GetInstance()->SetCursorCompositingEnabled(true);
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(root_windows[0]->Contains(test_api.GetCursorWindow()));
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Removes the first display and keeps the second one.
13071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager->SetSoftwareMirroring(false);
13081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<DisplayInfo> new_info_list;
13091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_info_list.push_back(secondary_info);
13101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  display_manager->OnNativeDisplaysChanged(new_info_list);
13111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  root_windows = Shell::GetAllRootWindows();
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(root_windows[0]->Contains(test_api.GetCursorWindow()));
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell::GetInstance()->SetCursorCompositingEnabled(false);
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_CHROMEOS
13181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(DisplayManagerTest, MirroredLayout) {
13203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!SupportsMultipleDisplays())
13213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
13223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DisplayManager* display_manager = Shell::GetInstance()->display_manager();
13243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  UpdateDisplay("500x500,400x400");
13253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(display_manager->GetCurrentDisplayLayout().mirrored);
13263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
13273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2U, display_manager->num_connected_displays());
13283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  UpdateDisplay("1+0-500x500,1+0-500x500");
13303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(display_manager->GetCurrentDisplayLayout().mirrored);
13313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
13323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2U, display_manager->num_connected_displays());
13333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  UpdateDisplay("500x500,500x500");
13353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(display_manager->GetCurrentDisplayLayout().mirrored);
13363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
13373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2U, display_manager->num_connected_displays());
13383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
13393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DisplayManagerTest, InvertLayout) {
13418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("left, 0",
13428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
13438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("left, -100",
13448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString());
13458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("left, 50",
13468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString());
13478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("right, 0",
13498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString());
13508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("right, -90",
13518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString());
13528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("right, 60",
13538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString());
13548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("bottom, 0",
13568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString());
13578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("bottom, -80",
13588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString());
13598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("bottom, 70",
13608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString());
13618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("top, 0",
13638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString());
13648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("top, -70",
13658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString());
13668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("top, 80",
13678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString());
13688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
13698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_WIN)
13718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// TODO(scottmg): RootWindow doesn't get resized on Windows
13728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Ash. http://crbug.com/247916.
13738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin
13748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
13758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin
13768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
13778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(DisplayManagerTest, MAYBE_UpdateDisplayWithHostOrigin) {
13798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UpdateDisplay("100x200,300x400");
13808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows =
13828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Shell::GetInstance()->GetAllRootWindows();
13838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2U, root_windows.size());
1384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host0 = root_windows[0]->GetHost();
1385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host1 = root_windows[1]->GetHost();
1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("1,1", host0->GetBounds().origin().ToString());
1388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("100x200", host0->GetBounds().size().ToString());
13898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // UpdateDisplay set the origin if it's not set.
1390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_NE("1,1", host1->GetBounds().origin().ToString());
1391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("300x400", host1->GetBounds().size().ToString());
13928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UpdateDisplay("100x200,200+300-300x400");
13948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("0,0", host0->GetBounds().origin().ToString());
1396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("100x200", host0->GetBounds().size().ToString());
1397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("200,300", host1->GetBounds().origin().ToString());
1398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("300x400", host1->GetBounds().size().ToString());
13998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UpdateDisplay("400+500-200x300,300x400");
14018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("400,500", host0->GetBounds().origin().ToString());
1403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("200x300", host0->GetBounds().size().ToString());
1404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("0,0", host1->GetBounds().origin().ToString());
1405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("300x400", host1->GetBounds().size().ToString());
14068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UpdateDisplay("100+200-100x200,300+500-200x300");
14088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("100,200", host0->GetBounds().origin().ToString());
1410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("100x200", host0->GetBounds().size().ToString());
1411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("300,500", host1->GetBounds().origin().ToString());
1412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("200x300", host1->GetBounds().size().ToString());
14138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
14148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScreenShutdownTest : public test::AshTestBase {
14175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScreenShutdownTest() {
14195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
14205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~ScreenShutdownTest() {}
14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
14235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Screen* orig_screen =
14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE);
14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AshTestBase::TearDown();
14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!SupportsMultipleDisplays())
14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Screen* screen =
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE);
14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_NE(orig_screen, screen);
14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(2, screen->GetNumDisplays());
14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("500x300", screen->GetPrimaryDisplay().size().ToString());
14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<gfx::Display> all = screen->GetAllDisplays();
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("500x300", all[0].size().ToString());
14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("800x400", all[1].size().ToString());
14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScreenShutdownTest);
14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ScreenShutdownTest, ScreenAfterShutdown) {
14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!SupportsMultipleDisplays())
14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
14455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateDisplay("500x300,800x400");
14465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
14475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
144803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
144903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_CHROMEOS)
145003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
145103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
145203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// A helper class that sets the display configuration and starts ash.
145303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This is to make sure the font configuration happens during ash
145403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// initialization process.
145503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class FontTestHelper : public test::AshTestBase {
145603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
145703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  enum DisplayType {
145803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    INTERNAL,
145903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXTERNAL
146003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  };
146103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
146203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper(float scale, DisplayType display_type) {
146303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    gfx::ClearFontRenderParamsCacheForTest();
146403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
146503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (display_type == INTERNAL)
146603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      command_line->AppendSwitch(switches::kAshUseFirstDisplayAsInternal);
146703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kAshHostWindowBounds,
146803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    StringPrintf("1000x800*%f", scale));
146903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SetUp();
147003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
147103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
147203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ~FontTestHelper() {
147303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TearDown();
147403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
147503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
147603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // test::AshTestBase:
147703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void TestBody() OVERRIDE {
147803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    NOTREACHED();
147903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
148003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
148103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
148203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FontTestHelper);
148303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
148403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
148503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
148603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool IsTextSubpixelPositioningEnabled() {
148703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::FontRenderParams params =
148803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(false), NULL);
148903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return params.subpixel_positioning;
149003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
149103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
149203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
149303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
149403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef testing::Test DisplayManagerFontTest;
149503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
149603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf100Internal) {
149703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(1.0f, FontTestHelper::INTERNAL);
149803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
149903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      1.0f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
150003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(IsTextSubpixelPositioningEnabled());
150103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
150203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
150303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf125Internal) {
150403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(1.25f, FontTestHelper::INTERNAL);
150503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
150603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      1.25f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
150703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(IsTextSubpixelPositioningEnabled());
150803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
150903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
151003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf200Internal) {
151103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(2.0f, FontTestHelper::INTERNAL);
151203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
151303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      2.0f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
151403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(IsTextSubpixelPositioningEnabled());
151503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
151603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
151703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf100External) {
151803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(1.0f, FontTestHelper::EXTERNAL);
151903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
152003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      1.0f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
152103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(IsTextSubpixelPositioningEnabled());
152203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
152303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
152403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf125External) {
152503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(1.25f, FontTestHelper::EXTERNAL);
152603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
152703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      1.25f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
152803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(IsTextSubpixelPositioningEnabled());
152903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
153003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
153103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DisplayManagerFontTest, TextSubpixelPositioningWithDsf200External) {
153203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FontTestHelper helper(2.0f, FontTestHelper::EXTERNAL);
153303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_DOUBLE_EQ(
153403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      2.0f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
153503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(IsTextSubpixelPositioningEnabled());
153603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
153703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DisplayManagerFontTest,
15391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       TextSubpixelPositioningWithDsf125InternalWithScaling) {
15401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo::SetUse125DSFForUIScaling(true);
15411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FontTestHelper helper(1.25f, FontTestHelper::INTERNAL);
15421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_DOUBLE_EQ(
15431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1.0f, Shell::GetScreen()->GetPrimaryDisplay().device_scale_factor());
15441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(IsTextSubpixelPositioningEnabled());
15451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DisplayInfo::SetUse125DSFForUIScaling(false);
15461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
15471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
154803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif  // OS_CHROMEOS
154903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
1551