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