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