toplevel_window_event_handler_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/wm/toplevel_window_event_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_activation_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestWindowDelegate(int hittest_code) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hittest_code_(hittest_code) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWindowDelegate() {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_min_size(const gfx::Size& size) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_size_ = size; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::Test::TestWindowDelegate: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min_size_; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hittest_code_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowDestroyed() OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hittest_code_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size min_size_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToplevelWindowEventHandlerTest() : parent_(NULL) {} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ToplevelWindowEventHandlerTest() {} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::SetUp(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ = new aura::Window(NULL); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->Init(ui::LAYER_NOT_DRAWN); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->Show(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetPrimaryRootWindow()->AddChild(parent_); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->SetBounds(Shell::GetPrimaryRootWindow()->bounds()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_.reset(new ToplevelWindowEventHandler(parent_)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->AddPreTargetHandler(handler_.get()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->RemovePreTargetHandler(handler_.get()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_.reset(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_ = NULL; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::TearDown(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* CreateWindow(int hittest_code) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* w1 = new aura::Window(d1); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->set_id(1); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Init(ui::LAYER_TEXTURED); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->SetParent(parent_); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->SetBounds(gfx::Rect(0, 0, 100, 100)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Show(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return w1; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DragFromCenterBy(aura::Window* window, int dx, int dy) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(dx, dy); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressMoveAndReleaseTouchBy(dx, dy); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ToplevelWindowEventHandler> handler_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window |handler_| is installed on. Owned by RootWindow. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* parent_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = w1->bounds().size(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,100", w1->bounds().origin().ToString()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchDragFromCenterBy(w1.get(), 100, 100); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,200", w1->bounds().origin().ToString()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(w1.get()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(100, 100); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shrink the wnidow by (-100, -100). 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-100, -100); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 100,100. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 100), w1->bounds().size()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enforce minimum size. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-60, -60); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,0. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 100), w1->bounds().size()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0,100. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 200), w1->bounds().size()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -50, 50); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOP)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 0,50. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 50), w1->bounds().size()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,0. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 100), w1->bounds().size()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, -50); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,50. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 50), w1->bounds().origin()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = w1->bounds(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Neither position nor size should have changed. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bounds, w1->bounds()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large left-to-right drag. Window width should be clamped to 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position change should be limited as well. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 0); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large right-to-left drag. Window width should be clamped to 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position should not change. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 0); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-left to bottom-right drag. Window width should be 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should be limited. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 444); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 60), w1->bounds().origin()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-right to bottom-left drag. Window size should be 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should not change, and y position should 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be clamped. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 444); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 60), w1->bounds().origin()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-left to top-right drag. Window size should be 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should be clamped, and y position should 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not change. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, -444); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-right to top-left drag. Window size should be 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should not change. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, -444); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 100, work_area.height()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, target->bounds().origin()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100, work_area.height() - target->bounds.y() 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, work_area.height() - target->bounds().y()), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), -30, work_area.height()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin is now at 70, 100. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.x() - 30, target->bounds().x()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.y(), target->bounds().y()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 30, work_area.height() - target->bounds.y() 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(130, work_area.height() - target->bounds().y()), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 0, work_area.height()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, target->bounds().origin()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0, work_area.height() - target->bounds.y() 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, work_area.height() - target->bounds().y()), 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTTOP)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseTo(0, 5); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(0, -5); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, target->bounds().y()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, target->bounds().height()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).bounds(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), work_area.width() * 2, 0); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.width(), target->bounds().width()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location(5, 5); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Snap right; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point end = location; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(100, 0); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the window has moved after the gesture. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::RIGHT_EDGE, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizer.target_bounds().ToString(), target->bounds().ToString()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Snap left. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(-100, 0); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::LEFT_EDGE, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizer.target_bounds().ToString(), target->bounds().ToString()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maximize. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(0, -100); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsWindowMaximized(target.get())); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->SetBounds(old_bounds); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimize. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(0, 100); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsWindowMinimized(target.get())); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root = Shell::GetPrimaryRootWindow(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::ActivationClient* original_client = 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetActivationClient(root); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestActivationClient activation_client(root); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws so that pending mouse events are processed. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 110x111", target->bounds().ToString()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressKey(ui::VKEY_ESCAPE, 0); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseKey(ui::VKEY_ESCAPE, 0); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 100x100", target->bounds().ToString()); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationClient(root, original_client); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MinimizeMaximizeCompletes) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is minimized, window dragging completes. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MinimizeWindow(target.get()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is maximized, window dragging completes. 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MaximizeWindow(target.get()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 538