desktop_screen_x11_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
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 "base/message_loop/message_loop.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/client/aura_constants.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/test/event_generator.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/base/hit_test.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/x/x11_util.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_dispatcher.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_source.h" 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/display_observer.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/test/views_test_base.h" 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Class which allows for the designation of non-client component targets of 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// hit tests. 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura { 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit TestDesktopNativeWidgetAura( 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch views::internal::NativeWidgetDelegate* delegate) 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : views::DesktopNativeWidgetAura(delegate) {} 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~TestDesktopNativeWidgetAura() {} 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void set_window_component(int window_component) { 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window_component_ = window_component; 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // DesktopNativeWidgetAura: 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return window_component_; 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int window_component_; 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura); 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace views { 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kFirstDisplay = 5321829; 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kSecondDisplay = 928310; 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Class which waits till the X11 window associated with the widget passed into 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the constructor is activated. We cannot listen for the widget's activation 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// because the _NET_ACTIVE_WINDOW property is changed after the widget is 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// activated. 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ActivationWaiter : public ui::PlatformEventDispatcher { 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit ActivationWaiter(views::Widget* widget) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : x_root_window_(DefaultRootWindow(gfx::GetXDisplay())), 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) widget_xid_(0), 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) active_(false) { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char* kAtomToCache[] = { 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "_NET_ACTIVE_WINDOW", 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) atom_cache_.reset(new ui::X11AtomCache(gfx::GetXDisplay(), kAtomToCache)); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) widget_xid_ = widget->GetNativeWindow()->GetHost()-> 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetAcceleratedWidget(); 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~ActivationWaiter() { 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Blocks till |widget_xid_| becomes active. 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Wait() { 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (active_) 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop run_loop; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quit_closure_ = run_loop.QuitClosure(); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) run_loop.Run(); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ui::PlatformEventDispatcher: 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE { 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return event->type == PropertyNotify && 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event->xproperty.window == x_root_window_; 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE { 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::Window xid; 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_EQ(PropertyNotify, event->type); 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_EQ(x_root_window_, event->xproperty.window); 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (event->xproperty.atom == atom_cache_->GetAtom("_NET_ACTIVE_WINDOW") && 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::GetXIDProperty(x_root_window_, "_NET_ACTIVE_WINDOW", &xid) && 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) xid == widget_xid_) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) active_ = true; 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!quit_closure_.is_null()) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quit_closure_.Run(); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return ui::POST_DISPATCH_NONE; 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<ui::X11AtomCache> atom_cache_; 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::Window x_root_window_; 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::Window widget_xid_; 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool active_; 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure quit_closure_; 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ActivationWaiter); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DesktopScreenX11Test : public views::ViewsTestBase, 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public gfx::DisplayObserver { 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DesktopScreenX11Test() {} 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~DesktopScreenX11Test() {} 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Overridden from testing::Test: 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::SetUp(); 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Initialize the world to the single monitor case. 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_.reset(new DesktopScreenX11(displays)); 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_->AddObserver(this); 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void TearDown() OVERRIDE { 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen_.reset(); 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ViewsTestBase::TearDown(); 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) protected: 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> changed_display_; 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> added_display_; 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> removed_display_; 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DesktopScreenX11* screen() { return screen_.get(); } 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ResetDisplayChanges() { 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) changed_display_.clear(); 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) added_display_.clear(); 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) removed_display_.clear(); 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds, 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool use_test_native_widget) { 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget* toplevel = new Widget; 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Widget::InitParams toplevel_params = 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateParams(Widget::InitParams::TYPE_WINDOW); 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (use_test_native_widget) { 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch toplevel_params.native_widget = 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new TestDesktopNativeWidgetAura(toplevel); 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } else { 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch toplevel_params.native_widget = 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new views::DesktopNativeWidgetAura(toplevel); 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) toplevel_params.bounds = bounds; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) toplevel_params.remove_standard_frame = true; 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) toplevel->Init(toplevel_params); 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return toplevel; 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Overridden from gfx::DisplayObserver: 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE { 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) changed_display_.push_back(display); 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE { 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) added_display_.push_back(new_display); 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE { 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) removed_display_.push_back(old_display); 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<DesktopScreenX11> screen_; 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11Test); 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, BoundsChangeSingleMonitor) { 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 1024, 768))); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheRight) { 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, changed_display_.size()); 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, added_display_.size()); 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, AddMonitorToTheLeft) { 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768))); 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(1024, 0, 640, 480))); 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, added_display_.size()); 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, removed_display_.size()); 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnRight) { 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetDisplayChanges(); 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.clear(); 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, changed_display_.size()); 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, removed_display_.size()); 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, RemoveMonitorOnLeft) { 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetDisplayChanges(); 25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.clear(); 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768))); 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, changed_display_.size()); 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, added_display_.size()); 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, removed_display_.size()); 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestPoint) { 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(650, 10)).id()); 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(10, 10)).id()); 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, 27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayNearestPoint(gfx::Point(10000, 10000)).id()); 27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingBasic) { 28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayMatching(gfx::Rect(700, 20, 100, 100)).id()); 28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayMatchingOverlap) { 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kSecondDisplay, 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->GetDisplayMatching(gfx::Rect(630, 20, 100, 100)).id()); 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) { 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::Display> displays; 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 640, 480))); 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) screen()->ProcessDisplayChange(displays); 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The first display in the list is always the primary, even if other 31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // displays are to the left in screen layout. 31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(kFirstDisplay, screen()->GetPrimaryDisplay().id()); 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetWindowAtScreenPoint) { 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10), 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10), 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Widget* window_three = 3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20), false); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_three->Show(); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_two->Show(); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_one->Show(); 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the internal state of DesktopWindowTreeHostX11 is set up 3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // correctly. 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(3u, DesktopWindowTreeHostX11::GetAllOpenWindows().size()); 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(window_one->GetNativeWindow(), 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen()->GetWindowAtScreenPoint(gfx::Point(115, 115))); 3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(window_two->GetNativeWindow(), 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen()->GetWindowAtScreenPoint(gfx::Point(155, 155))); 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(NULL, 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen()->GetWindowAtScreenPoint(gfx::Point(200, 200))); 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Bring the third window in front. It overlaps with the first window. 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Hit-testing on the intersecting region should give the third window. 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ActivationWaiter activation_waiter(window_three); 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_three->Activate(); 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_waiter.Wait(); 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(window_three->GetNativeWindow(), 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) screen()->GetWindowAtScreenPoint(gfx::Point(115, 115))); 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_one->CloseNow(); 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_two->CloseNow(); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_three->CloseNow(); 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) { 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set up a two monitor situation. 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<gfx::Display> displays; 3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480))); 3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) displays.push_back(gfx::Display(kSecondDisplay, 3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect(640, 0, 1024, 768))); 3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen()->ProcessDisplayChange(displays); 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10), 3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10), 3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch false); 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ( 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kFirstDisplay, 3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen()->GetDisplayNearestWindow(window_one->GetNativeWindow()).id()); 3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ( 3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kSecondDisplay, 3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen()->GetDisplayNearestWindow(window_two->GetNativeWindow()).id()); 3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_one->CloseNow(); 3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_two->CloseNow(); 3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window is maximized in response to a double click event. 3760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) { 3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 3800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 3810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 3820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = 3880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 3890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget()); 3900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::test::EventGenerator generator(window); 3920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 3930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 3940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 3950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(rwh->IsMaximized()); 3960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 3980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event, 4010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the first click was to a different target component than that of the 4020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// second click. 4030529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) { 4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 4110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = 4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 4150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget()); 4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::test::EventGenerator generator(window); 4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCLIENT); 4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 4200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 4230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 4240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Tests that the window does not maximize in response to a double click event, 4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// if the double click was interrupted by a right click. 4300529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) { 4310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true); 4320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->Show(); 4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestDesktopNativeWidgetAura* native_widget = 4340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget()); 4350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::Window* window = widget->GetNativeWindow(); 4370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch window->SetProperty(aura::client::kCanMaximizeKey, true); 4380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized 4400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>( 4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()-> 4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetAcceleratedWidget())); 4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch aura::test::EventGenerator generator(window); 4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCLIENT); 4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ClickLeftButton(); 4470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch native_widget->set_window_component(HTCAPTION); 4480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.PressRightButton(); 4490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.ReleaseRightButton(); 4500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 4510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generator.DoubleClickLeftButton(); 4520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RunPendingMessages(); 4530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(rwh->IsMaximized()); 4540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch widget->CloseNow(); 4560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace views 459