168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_screen_x11.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/client/aura_constants.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/base/hit_test.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/x/x11_util.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/display_observer.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/test/views_test_base.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Class which allows for the designation of non-client component targets of 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// hit tests. 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura { 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit TestDesktopNativeWidgetAura( 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch views::internal::NativeWidgetDelegate* delegate) 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : views::DesktopNativeWidgetAura(delegate) {} 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~TestDesktopNativeWidgetAura() {} 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void set_window_component(int window_component) { 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window_component_ = window_component; 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // DesktopNativeWidgetAura: 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return window_component_; 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int window_component_; 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura); 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace views { 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kFirstDisplay = 5321829; 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kSecondDisplay = 928310; 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopScreenX11Test : public views::ViewsTestBase, 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public gfx::DisplayObserver { 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DesktopScreenX11Test() {} 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~DesktopScreenX11Test() {} 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Overridden from testing::Test: 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void SetUp() OVERRIDE { 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::SetUp(); 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Initialize the world to the single monitor case. 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_.reset(new DesktopScreenX11(displays)); 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_->AddObserver(this); 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void TearDown() OVERRIDE { 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_.reset(); 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::TearDown(); 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) protected: 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> changed_display_; 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> added_display_; 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> removed_display_; 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DesktopScreenX11* screen() { return screen_.get(); } 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void NotifyDisplaysChanged(const std::vector<gfx::Display>& displays) { 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DesktopScreenX11* screen = screen_.get(); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) screen->change_notifier_.NotifyDisplaysChanged(screen->displays_, displays); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) screen->displays_ = displays; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ResetDisplayChanges() { 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) changed_display_.clear(); 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) added_display_.clear(); 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) removed_display_.clear(); 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds, 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool use_test_native_widget) { 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget* toplevel = new Widget; 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget::InitParams toplevel_params = 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (use_test_native_widget) { 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch toplevel_params.native_widget = 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new TestDesktopNativeWidgetAura(toplevel); 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } else { 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch toplevel_params.native_widget = 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new views::DesktopNativeWidgetAura(toplevel); 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) toplevel_params.bounds = bounds; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) toplevel_params.remove_standard_frame = true; 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) toplevel->Init(toplevel_params); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return toplevel; 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Overridden from gfx::DisplayObserver: 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE { 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) added_display_.push_back(new_display); 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE { 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) removed_display_.push_back(old_display); 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnDisplayMetricsChanged(const gfx::Display& display, 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t metrics) OVERRIDE { 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) changed_display_.push_back(display); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<DesktopScreenX11> screen_; 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11Test); 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, BoundsChangeSingleMonitor) { 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 1024, 768))); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheRight) { 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, changed_display_.size()); 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, added_display_.size()); 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheLeft) { 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768))); 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(1024, 0, 640, 480))); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, added_display_.size()); 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnRight) { 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetDisplayChanges(); 17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.clear(); 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, changed_display_.size()); 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, removed_display_.size()); 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnLeft) { 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetDisplayChanges(); 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.clear(); 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768))); 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, removed_display_.size()); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestPoint) { 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(650, 10)).id()); 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(10, 10)).id()); 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(10000, 10000)).id()); 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingBasic) { 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayMatching(gfx::Rect(700, 20, 100, 100)).id()); 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingOverlap) { 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayMatching(gfx::Rect(630, 20, 100, 100)).id()); 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) { 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 640, 480))); 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The first display in the list is always the primary, even if other 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // displays are to the left in screen layout. 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, screen()->GetPrimaryDisplay().id()); 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set up a two monitor situation. 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<gfx::Display> displays; 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10), 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10), 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ( 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kFirstDisplay, 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen()->GetDisplayNearestWindow(window_one->GetNativeWindow()).id()); 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ( 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kSecondDisplay, 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen()->GetDisplayNearestWindow(window_two->GetNativeWindow()).id()); 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_one->CloseNow(); 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_two->CloseNow(); 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window is maximized in response to a double click event. 2750529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) { 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!ui::WmSupportsHint(ui::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"))) 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget()); 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(window); 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(rwh->IsMaximized()); 2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event, 3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the first click was to a different target component than that of the 3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// second click. 3050529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) { 3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 3070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget()); 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(window); 3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCLIENT); 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event, 3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the double click was interrupted by a right click. 3320529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) { 3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>( 3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget())); 3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(window); 3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCLIENT); 3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.PressRightButton(); 3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ReleaseRightButton(); 3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that rotating the displays notifies the DisplayObservers. 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RotationChange) { 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<gfx::Display> displays; 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back( 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768))); 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetDisplayChanges(); 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_rotation(gfx::Display::ROTATE_90); 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_rotation(gfx::Display::ROTATE_90); 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_rotation(gfx::Display::ROTATE_270); 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3u, changed_display_.size()); 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_rotation(gfx::Display::ROTATE_270); 3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3u, changed_display_.size()); 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_rotation(gfx::Display::ROTATE_0); 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_rotation(gfx::Display::ROTATE_0); 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(5u, changed_display_.size()); 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that changing the displays workarea notifies the DisplayObservers. 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, WorkareaChange) { 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<gfx::Display> displays; 394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back( 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768))); 3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetDisplayChanges(); 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_work_area(gfx::Rect(0, 0, 300, 300)); 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_work_area(gfx::Rect(0, 0, 300, 300)); 4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_work_area(gfx::Rect(0, 0, 300, 300)); 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_work_area(gfx::Rect(0, 0, 300, 300)); 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_work_area(gfx::Rect(0, 0, 640, 480)); 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_work_area(gfx::Rect(640, 0, 1024, 768)); 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(4u, changed_display_.size()); 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that changing the device scale factor notifies the DisplayObservers. 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DesktopScreenX11Test, DeviceScaleFactorChange) { 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<gfx::Display> displays; 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays.push_back( 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Display(kSecondDisplay, gfx::Rect(640, 0, 1024, 768))); 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetDisplayChanges(); 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_device_scale_factor(2.5f); 4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_device_scale_factor(2.5f); 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_device_scale_factor(2.5f); 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_device_scale_factor(2.5f); 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, changed_display_.size()); 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[0].set_device_scale_factor(1.f); 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) displays[1].set_device_scale_factor(1.f); 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDisplaysChanged(displays); 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(4u, changed_display_.size()); 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace views 454