display_controller_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/launcher/launcher.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.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" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/activation_change_observer.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/activation_client.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/focus_change_observer.h" 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/focus_client.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_tracker.h" 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11) 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <X11/Xlib.h> 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#undef RootWindow 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDesktopBackgroundView[] = "DesktopBackgroundView"; 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template<typename T> 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class Resetter { 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) explicit Resetter(T* value) : value_(*value) { 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *value = 0; 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ~Resetter() { } 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) T value() { return value_; } 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) T value_; 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Resetter); 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass TestObserver : public DisplayController::Observer, 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public gfx::DisplayObserver, 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public aura::client::FocusChangeObserver, 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public aura::client::ActivationChangeObserver { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TestObserver() 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : changing_count_(0), 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch changed_count_(0), 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bounds_changed_count_(0), 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) changed_display_id_(0), 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) focus_changed_count_(0), 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) activation_changed_count_(0) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller()->AddObserver(this); 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Shell::GetScreen()->AddObserver(this); 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::client::GetFocusClient(Shell::GetPrimaryRootWindow())-> 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddObserver(this); 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddObserver(this); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestObserver() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller()->RemoveObserver(this); 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Shell::GetScreen()->RemoveObserver(this); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::client::GetFocusClient(Shell::GetPrimaryRootWindow())-> 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RemoveObserver(this); 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RemoveObserver(this); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Overridden from DisplayController::Observer 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDisplayConfigurationChanging() OVERRIDE { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++changing_count_; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDisplayConfigurationChanged() OVERRIDE { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++changed_count_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Overrideen from gfx::DisplayObserver 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE { 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch changed_display_id_ = display.id(); 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bounds_changed_count_ ++; 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE { 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE { 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Overridden from aura::client::FocusChangeObserver 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void OnWindowFocused(aura::Window* gained_focus, 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::Window* lost_focus) OVERRIDE { 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) focus_changed_count_++; 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Overridden from aura::client::ActivationChangeObserver 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void OnWindowActivated(aura::Window* gained_active, 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::Window* lost_active) OVERRIDE { 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) activation_changed_count_++; 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void OnAttemptToReactivateWindow( 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::Window* request_active, 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) aura::Window* actual_active) OVERRIDE { 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CountAndReset() { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(changing_count_, changed_count_); 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) changed_count_ = 0; 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return Resetter<int>(&changing_count_).value(); 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 GetBoundsChangedCountAndReset() { 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return Resetter<int>(&bounds_changed_count_).value(); 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 GetChangedDisplayIdAndReset() { 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return Resetter<int64>(&changed_display_id_).value(); 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int GetFocusChangedCountAndReset() { 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return Resetter<int>(&focus_changed_count_).value(); 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int GetActivationChangedCountAndReset() { 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return Resetter<int>(&activation_changed_count_).value(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int changing_count_; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int changed_count_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int bounds_changed_count_; 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 changed_display_id_; 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int focus_changed_count_; 149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int activation_changed_count_; 150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestObserver); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetPrimaryDisplay() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetScreen()->GetDisplayNearestWindow( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindows()[0]); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display GetSecondaryDisplay() { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetScreen()->GetDisplayNearestWindow( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetAllRootWindows()[1]); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset) { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DisplayLayout layout(position, offset); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1); 1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Shell::GetInstance()->display_manager()-> 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetLayoutForCurrentDisplays(layout); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetSecondaryDisplayLayout(DisplayLayout::Position position) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(position, 0); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetDefaultDisplayLayout(DisplayLayout::Position position) { 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Shell::GetInstance()->display_manager()->layout_store()-> 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetDefaultDisplayLayout(DisplayLayout(position, 0)); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DisplayControllerShutdownTest : public test::AshTestBase { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test::AshTestBase::TearDown(); 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that primary display is accessible after shutdown. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 444x333", primary.bounds().ToString()); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestEventHandler : public ui::EventHandler { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEventHandler() : target_root_(NULL), 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_radius_x_(0.0), 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_radius_y_(0.0), 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_x_offset_(0.0), 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_y_offset_(0.0), 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_x_offset_ordinal_(0.0), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_y_offset_ordinal_(0.0) {} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestEventHandler() {} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (event->flags() & ui::EF_IS_SYNTHESIZED && 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event->type() != ui::ET_MOUSE_EXITED && 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event->type() != ui::ET_MOUSE_ENTERED) { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* target = static_cast<aura::Window*>(event->target()); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_location_ = event->root_location(); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) target_root_ = target->GetRootWindow(); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->StopPropagation(); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = static_cast<aura::Window*>(event->target()); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only record when the target is the background which covers 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // entire root window. 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (target->name() != kDesktopBackgroundView) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_radius_x_ = event->radius_x(); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_radius_y_ = event->radius_y(); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->StopPropagation(); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* target = static_cast<aura::Window*>(event->target()); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only record when the target is the background which covers 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // entire root window. 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (target->name() != kDesktopBackgroundView) 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() == ui::ET_SCROLL) { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_x_offset_ = event->x_offset(); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_y_offset_ = event->y_offset(); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_x_offset_ordinal_ = event->x_offset_ordinal(); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scroll_y_offset_ordinal_ = event->y_offset_ordinal(); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string GetLocationAndReset() { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string result = mouse_location_.ToString(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_location_.SetPoint(0, 0); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_root_ = NULL; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float touch_radius_x() { return touch_radius_x_; } 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float touch_radius_y() { return touch_radius_y_; } 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_x_offset() { return scroll_x_offset_; } 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_y_offset() { return scroll_y_offset_; } 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; } 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; } 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point mouse_location_; 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* target_root_; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float touch_radius_x_; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float touch_radius_y_; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_x_offset_; 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_y_offset_; 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_x_offset_ordinal_; 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float scroll_y_offset_ordinal_; 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestEventHandler); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Display::Rotation GetStoredRotation(int64 id) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation(); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float GetStoredUIScale(int64 id) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11) 2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GetPrimaryAndSeconary(aura::Window** primary, 2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window** secondary) { 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *primary = Shell::GetPrimaryRootWindow(); 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0]; 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetXWindowName(aura::RootWindow* window) { 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch char* name = NULL; 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) XFetchName(gfx::GetXDisplay(), window->GetAcceleratedWidget(), &name); 292ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string ret(name); 293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch XFree(name); 294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return ret; 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef test::AshTestBase DisplayControllerTest; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerShutdownTest, Shutdown) { 3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("444x333, 200x200"); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, SecondaryDisplayLayout) { 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Creates windows to catch activation change event. 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1)); 315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) w1->Focus(); 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestObserver observer; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("500x500,400x400"); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Insets insets(5, 5, 5, 5); 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 secondary_display_id = ScreenAsh::GetSecondaryDisplay().id(); 325ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Shell::GetInstance()->display_manager()->UpdateWorkAreaOfDisplay( 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch secondary_display_id, insets); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default layout is RIGHT. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString()); 332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout the secondary display to the bottom of the primary. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayout(DisplayLayout::BOTTOM); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout the secondary display to the left of the primary. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayout(DisplayLayout::LEFT); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout the secondary display to the top of the primary. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayout(DisplayLayout::TOP); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout to the right with an offset. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep the minimum 100. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400); 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Layout to the bottom with an offset. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200); 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep the minimum 100. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490); 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString()); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // resize and add 421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Setting the same layout shouldn't invoke observers. 427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset()); 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset()); 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(0, observer.CountAndReset()); // resize and add 431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 436d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UpdateDisplay("500x500"); 437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_LE(1, observer.GetFocusChangedCountAndReset()); 438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_LE(1, observer.GetActivationChangedCountAndReset()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DisplayControllerTest, BoundsUpdated) { 4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 445d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Creates windows to catch activation change event. 446d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithId(1)); 447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) w1->Focus(); 448d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestObserver observer; 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetDefaultDisplayLayout(DisplayLayout::BOTTOM); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200,300x300"); // layout, resize and add. 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 453d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 454d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager* display_manager = 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Insets insets(5, 5, 5, 5); 459ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch display_manager->UpdateWorkAreaOfDisplay( 460ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ScreenAsh::GetSecondaryDisplay().id(), insets); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("400x400,200x200"); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); // two resizes 468d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 469d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("400x400,300x300"); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 475d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 476d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("400x400"); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_LE(1, observer.GetFocusChangedCountAndReset()); 483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_LE(1, observer.GetActivationChangedCountAndReset()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("400x500*2,300x300"); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString()); 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString()); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No change 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("400x500*2,300x300"); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 498d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 499d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rotation 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 primary_id = GetPrimaryDisplay().id(); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 505d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 506d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 509d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // UI scale is eanbled only on internal display. 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 secondary_id = GetSecondaryDisplay().id(); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::SetInternalDisplayId(secondary_id); 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(secondary_id, 1.125f); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, observer.CountAndReset()); 517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 518d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(secondary_id, 1.125f); 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(primary_id, 1.125f); 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 525d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 526d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(primary_id, 1.125f); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetFocusChangedCountAndReset()); 530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(0, observer.GetActivationChangedCountAndReset()); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimary) { 5347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 5357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisplayController* display_controller = 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller(); 5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) internal::DisplayManager* display_manager = 5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Shell::GetInstance()->display_manager(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200,300x300"); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 5478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) display_manager->SetLayoutForCurrentDisplays(display_layout); 54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(primary_display.id(), secondary_display.id()); 5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary_root = 55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id()); 5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* secondary_root = 55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id()); 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(primary_root, secondary_root); 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) aura::Window* launcher_window = 55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), 56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Point(-100, -100)).id()); 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString()); 56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("0,0 200x153", primary_display.work_area().ToString()); 56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString()); 56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("200,0 300x253", secondary_display.work_area().ToString()); 56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("right, 50", 57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_manager->GetCurrentDisplayLayout().ToString()); 57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Switch primary and secondary 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_controller->SetPrimaryDisplay(secondary_display); 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DisplayLayout& inverted_layout = 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_manager->GetCurrentDisplayLayout(); 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("left, -50", inverted_layout.ToString()); 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(secondary_display.id(), 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().id()); 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(secondary_display.id(), 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Point(-100, -100)).id()); 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(secondary_display.id(), 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ( 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) primary_root, 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id())); 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ( 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) secondary_root, 59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id())); 59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test if the bounds are correctly swapped. 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay(); 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay(); 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString()); 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("0,0 300x253", swapped_primary.work_area().ToString()); 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString()); 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("-200,-50 200x153", swapped_secondary.work_area().ToString()); 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) aura::WindowTracker tracker; 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) tracker.Add(primary_root); 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) tracker.Add(secondary_root); 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Deleting 2nd display should move the primary to original primary display. 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateDisplay("200x200"); 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Point(-100, -100)).id()); 61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(primary_display.id(), 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(tracker.Contains(primary_root)); 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(tracker.Contains(secondary_root)); 62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimaryForLegacyShelfLayout) { 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!SupportsMultipleDisplays()) 62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ash::switches::kAshDisableAlternateShelfLayout); 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisplayController* display_controller = 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetInstance()->display_controller(); 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) internal::DisplayManager* display_manager = 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Shell::GetInstance()->display_manager(); 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateDisplay("200x200,300x300"); 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 6418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) display_manager->SetLayoutForCurrentDisplays(display_layout); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(primary_display.id(), secondary_display.id()); 6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary_root = 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id()); 6461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* secondary_root = 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(primary_root, secondary_root); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* launcher_window = 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(-100, -100)).id()); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString()); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString()); 662b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString()); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("right, 50", 6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) display_manager->GetCurrentDisplayLayout().ToString()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Switch primary and secondary 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->SetPrimaryDisplay(secondary_display); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DisplayLayout& inverted_layout = 6693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) display_manager->GetCurrentDisplayLayout(); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("left, -50", inverted_layout.ToString()); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(secondary_display.id(), 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().id()); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(secondary_display.id(), 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(-100, -100)).id()); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(secondary_display.id(), 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id())); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_root, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id())); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test if the bounds are correctly swapped. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay(); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString()); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString()); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 697b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::WindowTracker tracker; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker.Add(primary_root); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker.Add(secondary_root); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting 2nd display should move the primary to original primary display. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200"); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(-100, -100)).id()); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracker.Contains(primary_root)); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tracker.Contains(secondary_root)); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, SwapPrimaryById) { 7197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 7207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisplayController* display_controller = 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller(); 7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) internal::DisplayManager* display_manager = 7253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Shell::GetInstance()->display_manager(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200,300x300"); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 7328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) display_manager->SetLayoutForCurrentDisplays(display_layout); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(primary_display.id(), secondary_display.id()); 7351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary_root = 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id()); 7371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* secondary_root = 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id()); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* launcher_window = 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(primary_root, secondary_root); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(-100, -100)).id()); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Switch primary and secondary by display ID. 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestObserver observer; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->SetPrimaryDisplayId(secondary_display.id()); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(secondary_display.id(), 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().id()); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(0, observer.CountAndReset()); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id())); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_root, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id())); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(secondary_root->Contains(launcher_window)); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DisplayLayout& inverted_layout = 7683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) display_manager->GetCurrentDisplayLayout(); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("left, -50", inverted_layout.ToString()); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling the same ID don't do anything. 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->SetPrimaryDisplayId(secondary_display.id()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, observer.CountAndReset()); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::WindowTracker tracker; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker.Add(primary_root); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker.Add(secondary_root); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting 2nd display should move the primary to original primary display. 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200"); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(-100, -100)).id()); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tracker.Contains(primary_root)); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tracker.Contains(secondary_root)); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding 2nd display with the same ID. The 2nd display should become primary 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since secondary id is still stored as desirable_primary_id. 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<internal::DisplayInfo> display_info_list; 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_info_list.push_back( 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->GetDisplayInfo(primary_display.id())); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_info_list.push_back( 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->GetDisplayInfo(secondary_display.id())); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->OnNativeDisplaysChanged(display_info_list); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(secondary_display.id(), 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().id()); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id())); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE( 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id())); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting 2nd display and adding 2nd display with a different ID. The 2nd 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // display shouldn't become primary. 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200"); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayInfo third_display_info( 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) secondary_display.id() + 1, std::string(), false); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) third_display_info.SetBounds(secondary_display.bounds()); 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(primary_display.id(), third_display_info.id()); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const internal::DisplayInfo& primary_display_info = 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->GetDisplayInfo(primary_display.id()); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<internal::DisplayInfo> display_info_list2; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_info_list2.push_back(primary_display_info); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_info_list2.push_back(third_display_info); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->OnNativeDisplaysChanged(display_info_list2); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(primary_display.id(), 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetPrimaryDisplay().id()); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id()); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id())); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE( 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root, 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_controller->GetRootWindowForDisplayId(third_display_info.id())); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(primary_root->Contains(launcher_window)); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) { 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 8447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisplayController* display_controller = 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->display_controller(); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200,200x200*2"); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary_root = 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(primary_display.id()); 8551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* secondary_root = 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->GetRootWindowForDisplayId(secondary_display.id()); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(primary_root, secondary_root); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager()); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(1.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()-> 8621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetDeviceScaleFactor()); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root->MoveCursorTo(gfx::Point(50, 50)); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 8651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2.0f, secondary_root->GetDispatcher()->AsRootWindowHostDelegate()-> 8661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetDeviceScaleFactor()); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_root->MoveCursorTo(gfx::Point(50, 50)); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Switch primary and secondary 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller->SetPrimaryDisplay(secondary_display); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cursor's device scale factor should be updated accroding to the swap of 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // primary and secondary. 8751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(1.0f, secondary_root->GetDispatcher()->AsRootWindowHostDelegate()-> 8761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetDeviceScaleFactor()); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_root->MoveCursorTo(gfx::Point(50, 50)); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root->MoveCursorTo(gfx::Point(50, 50)); 8801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()-> 8811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetDeviceScaleFactor()); 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleting 2nd display. 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDisplay("200x200"); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cursor's device scale factor should be updated even without moving cursor. 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) primary_root->MoveCursorTo(gfx::Point(50, 50)); 8921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(1.0f, primary_root->GetDispatcher()->AsRootWindowHostDelegate()-> 8931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetDeviceScaleFactor()); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, OverscanInsets) { 8987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 8997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayController* display_controller = 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_controller(); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestEventHandler event_handler; 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->AddPreTargetHandler(&event_handler); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("120x200,300x400*2"); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_controller->SetOverscanInsets(display1.id(), 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Insets(10, 15, 20, 25)); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString()); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("80,0 150x200", 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(root_windows[0]); 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(20, 25); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("5,15", event_handler.GetLocationAndReset()); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_controller->SetOverscanInsets(display1.id(), gfx::Insets()); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString()); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("120,0 150x200", 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(30, 20); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("30,20", event_handler.GetLocationAndReset()); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make sure the root window transformer uses correct scale 930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // factor when swapping display. Test crbug.com/253690. 931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("400x300*2,600x400/o"); 932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_windows = Shell::GetAllRootWindows(); 933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Point point; 934d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(&point); 935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("15,10", point.ToString()); 936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch display_controller->SwapPrimaryDisplay(); 938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch point.SetPoint(0, 0); 939d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(&point); 940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("15,10", point.ToString()); 941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, Rotate) { 9467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 9477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager* display_manager = 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager(); 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestEventHandler event_handler; 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->AddPreTargetHandler(&event_handler); 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("120x200,300x400*2"); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 display2_id = ScreenAsh::GetSecondaryDisplay().id(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator1(root_windows[0]); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("120,0 150x200", 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator1.MoveMouseToInHost(50, 40); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("50,40", event_handler.GetLocationAndReset()); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id())); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->SetDisplayRotation(display1.id(), 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::ROTATE_90); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("200,0 150x200", 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator1.MoveMouseToInHost(50, 40); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("40,69", event_handler.GetLocationAndReset()); 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayLayout display_layout(DisplayLayout::BOTTOM, 50); 9818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) display_manager->SetLayoutForCurrentDisplays(display_layout); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("50,120 150x200", 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->SetDisplayRotation(display2_id, 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::ROTATE_270); 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("50,120 200x150", 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 994eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_WIN) 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator2(root_windows[1]); 996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator2.MoveMouseToInHost(50, 40); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("179,25", event_handler.GetLocationAndReset()); 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager->SetDisplayRotation(display1.id(), 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::ROTATE_180); 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Dislay must share at least 100, so the x's offset becomes 20. 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("20,200 200x150", 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id())); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator1.MoveMouseToInHost(50, 40); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("69,159", event_handler.GetLocationAndReset()); 1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ScaleRootWindow) { 10177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 10187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 10197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestEventHandler event_handler; 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->AddPreTargetHandler(&event_handler); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("600x400*2@1.5,500x300"); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Display::SetInternalDisplayId(display1.id()); 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display display2 = ScreenAsh::GetSecondaryDisplay(); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("450,0 500x300", display2.bounds().ToString()); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(root_windows[0]); 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 200); 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("449,150", event_handler.GetLocationAndReset()); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager* display_manager = 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->display_manager(); 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_manager->SetDisplayUIScale(display1.id(), 1.25f); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display1 = Shell::GetScreen()->GetPrimaryDisplay(); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display2 = ScreenAsh::GetSecondaryDisplay(); 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 375x250", display1.bounds().ToString()); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString()); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("375,0 500x300", display2.bounds().ToString()); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.25f, GetStoredUIScale(display1.id())); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, TouchScale) { 10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 10567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEventHandler event_handler; 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->AddPreTargetHandler(&event_handler); 1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("200x200*2"); 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay(); 1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::RootWindow* root_window = root_windows[0]; 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator generator(root_window); 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.PressMoveAndReleaseTouchTo(50, 50); 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Default test touches have radius_x/y = 1.0, with device scale 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // factor = 2, the scaled radius_x/y should be 0.5. 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0.5, event_handler.touch_radius_x()); 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0.5, event_handler.touch_radius_y()); 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.ScrollSequence(gfx::Point(0,0), 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromMilliseconds(100), 1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10.0, 1.0, 5, 1); 1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ordinal_offset is invariant to the device scale factor. 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(event_handler.scroll_x_offset(), 10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_handler.scroll_x_offset_ordinal()); 1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(event_handler.scroll_y_offset(), 10814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_handler.scroll_y_offset_ordinal()); 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DisplayControllerTest, ConvertHostToRootCoords) { 10877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 10887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 10897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestEventHandler event_handler; 1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->AddPreTargetHandler(&event_handler); 1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("600x400*2/r@1.5"); 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator generator(root_windows[0]); 1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 0); 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 0); 1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 399); 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 399); 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("600x400*2/u@1.5"); 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_windows = Shell::GetAllRootWindows(); 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 0); 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("449,299", event_handler.GetLocationAndReset()); 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 0); 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,299", event_handler.GetLocationAndReset()); 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 399); 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 399); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("449,0", event_handler.GetLocationAndReset()); 1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDisplay("600x400*2/l@1.5"); 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_windows = Shell::GetAllRootWindows(); 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 0); 1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 0); 1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(599, 399); 1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseToInHost(0, 399); 1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11) 1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DisplayControllerTest, XWidowNameForRootWindow) { 11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_0", GetXWindowName( 11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetPrimaryRootWindow()->GetDispatcher())); 1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Multiple display. 1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("200x200,300x300"); 11531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* primary, *secondary; 1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetPrimaryAndSeconary(&primary, &secondary); 11551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher())); 11561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher())); 1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Swap primary. 1159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch primary = secondary = NULL; 1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetPrimaryAndSeconary(&primary, &secondary); 11621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_0", GetXWindowName(primary->GetDispatcher())); 11631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_x", GetXWindowName(secondary->GetDispatcher())); 1164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Switching back to single display. 1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateDisplay("300x400"); 11671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("aura_root_0", GetXWindowName( 11681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Shell::GetPrimaryRootWindow()->GetDispatcher())); 1169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1173