toplevel_window_event_handler_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/lock_state_controller.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/wm/resize_shadow.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/wm/resize_shadow_controller.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/client/window_move_client.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_util.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch explicit TestWindowDelegate(int hittest_code) { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch set_window_component(hittest_code); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWindowDelegate() {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::Test::TestWindowDelegate: 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToplevelWindowEventHandlerTest() {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ToplevelWindowEventHandlerTest() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* CreateWindow(int hittest_code) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* w1 = new aura::Window(d1); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) w1->SetType(ui::wm::WINDOW_TYPE_NORMAL); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->set_id(1); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) w1->Init(aura::WINDOW_LAYER_TEXTURED); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent = 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetContainer(Shell::GetPrimaryRootWindow(), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::kShellWindowId_AlwaysOnTopContainer); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddChild(w1); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->SetBounds(gfx::Rect(0, 0, 100, 100)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Show(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return w1; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DragFromCenterBy(aura::Window* window, int dx, int dy) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(dx, dy); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressMoveAndReleaseTouchBy(dx, dy); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ToplevelWindowEventHandler> handler_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = w1->bounds().size(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,100", w1->bounds().origin().ToString()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchDragFromCenterBy(w1.get(), 100, 100); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,200", w1->bounds().origin().ToString()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX)); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static_cast<TestWindowDelegate*>(w1->delegate()); 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(w1.get()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(100, 100); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shrink the wnidow by (-100, -100). 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-100, -100); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 100,100. 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 100).ToString(), w1->bounds().size().ToString()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enforce minimum size. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-60, -60); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,0. 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 100).ToString(), w1->bounds().size().ToString()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM)); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0,100. 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 200).ToString(), w1->bounds().size().ToString()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -50, 50); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50).ToString(), w1->bounds().origin().ToString()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOP)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50).ToString(), w1->bounds().origin().ToString()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 0,50. 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 50).ToString(), w1->bounds().size().ToString()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0).ToString(), w1->bounds().origin().ToString()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,0. 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 100).ToString(), w1->bounds().size().ToString()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, -50); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0).ToString(), w1->bounds().origin().ToString()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,50. 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 50).ToString(), w1->bounds().origin().ToString()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50).ToString(), w1->bounds().size().ToString()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = w1->bounds(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Neither position nor size should have changed. 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(bounds.ToString(), w1->bounds().ToString()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large left-to-right drag. Window width should be clamped to 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position change should be limited as well. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 0); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0).ToString(), w1->bounds().origin().ToString()); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100).ToString(), w1->bounds().size().ToString()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large right-to-left drag. Window width should be clamped to 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position should not change. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 0); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100).ToString(), w1->bounds().size().ToString()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-left to bottom-right drag. Window width should be 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should be limited. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 444); 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 60).ToString(), w1->bounds().origin().ToString()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-right to bottom-left drag. Window size should be 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should not change, and y position should 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be clamped. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 444); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 60).ToString(), w1->bounds().origin().ToString()); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-left to top-right drag. Window size should be 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should be clamped, and y position should 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not change. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, -444); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0).ToString(), w1->bounds().origin().ToString()); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch window_delegate->set_minimum_size(gfx::Size(40, 40)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-right to top-left drag. Window size should be 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should not change. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, -444); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40).ToString(), w1->bounds().size().ToString()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 100, work_area.height()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), target->bounds().origin().ToString()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100, work_area.height() - target->bounds.y() 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(200, work_area.height() - target->bounds().y()).ToString(), 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) target->bounds().size().ToString()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT)); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), -30, work_area.height()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin is now at 70, 100. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.x() - 30, target->bounds().x()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.y(), target->bounds().y()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 30, work_area.height() - target->bounds.y() 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(130, work_area.height() - target->bounds().y()).ToString(), 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) target->bounds().size().ToString()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 0, work_area.height()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(position.ToString(), target->bounds().origin().ToString()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0, work_area.height() - target->bounds.y() 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(100, work_area.height() - target->bounds().y()).ToString(), 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) target->bounds().size().ToString()); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragIfModalChild) { 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION)); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<aura::Window> w2(CreateWindow(HTCAPTION)); 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) w2->SetBounds(gfx::Rect(100, 0, 100, 100)); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) w2->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::AddTransientChild(w1.get(), w2.get()); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size size = w1->bounds().size(); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Attempt to drag w1, position and size should not change because w1 has a 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // modal child. 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("0,0", w1->bounds().origin().ToString()); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TouchDragFromCenterBy(w1.get(), 100, 100); 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("0,0", w1->bounds().origin().ToString()); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTTOP)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseTo(0, 5); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(0, -5); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, target->bounds().y()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, target->bounds().height()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).bounds(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), work_area.width() * 2, 0); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.width(), target->bounds().width()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target( 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 100, 100))); 4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(target.get()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location(5, 5); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point end = location; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Snap right; 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end.Offset(100, 0); 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generator.GestureScrollSequence(location, end, 415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10); 417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunAllPendingInMessageLoop(); 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the window has moved after the gesture. 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED, window_state->GetStateType()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Snap left. 426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end.Offset(-100, 0); 428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generator.GestureScrollSequence(location, end, 429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10); 431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunAllPendingInMessageLoop(); 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(wm::WINDOW_STATE_TYPE_LEFT_SNAPPED, window_state->GetStateType()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds_before_maximization = target->bounds(); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds_before_maximization.Offset(0, 100); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetBounds(bounds_before_maximization); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 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(); 44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(window_state->IsMaximized()); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Restore(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->SetBounds(old_bounds); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimize. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(0, 100); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 46568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(window_state->IsMinimized()); 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(window_state->unminimize_to_restore_bounds()); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 46868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that a gesture cannot minimize a window in login/lock screen. 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMinimizeLoginScreen) { 4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LockStateController* state_controller = 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Shell::GetInstance()->lock_state_controller(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_controller->OnLockStateChanged(false); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserLoggedIn(false); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lock = internal::RootWindowController::ForWindow(target.get())-> 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContainer(internal::kShellWindowId_LockSystemModalContainer); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock->AddChild(target.get()); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = location; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(0, 100); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(wm::GetWindowState(target.get())->IsMinimized()); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) { 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window( 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(10, 20, 30, 40))); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->Show(); 50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(window.get()); 50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Activate(); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window.get()); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = window->bounds(); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location, end; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = location = window->GetBoundsInRootWindow().CenterPoint(); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(0, 100); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(old_bounds.ToString(), window->bounds().ToString()); 51968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(window_state->IsMinimized()); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(window_state->unminimize_to_restore_bounds()); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 52268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->GetRestoreBoundsInScreen().ToString()); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that an unresizable window cannot be dragged or snapped using gestures. 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(target.get()); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanResizeKey, false); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = location; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to snap right. The window is not resizable. So it should not snap. 540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end.Offset(100, 0); 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generator.GestureScrollSequence(location, end, 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10); 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunAllPendingInMessageLoop(); 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the window has moved after the gesture. 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect expected_bounds(old_bounds); 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) expected_bounds.Offset(gfx::Vector2d(100, 0)); 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString()); 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the window did not snap left. 552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(window_state->IsNormalStateType()); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_bounds = target->bounds(); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to snap left. It should not snap. 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) end.Offset(-100, 0); 559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) generator.GestureScrollSequence(location, end, 560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10); 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RunAllPendingInMessageLoop(); 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the window has moved after the gesture. 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) expected_bounds = old_bounds; 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) expected_bounds.Offset(gfx::Vector2d(-100, 0)); 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString()); 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the window did not snap left. 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(window_state->IsNormalStateType()); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that dragging multiple windows at the same time is not allowed. 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMultipleWindows) { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target( 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 100, 100))); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> notmoved( 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, gfx::Rect(100, 0, 100, 100))); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send some touch events to start dragging |target|. 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveTouch(location); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location.Offset(40, 5); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveTouch(location); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to drag |notmoved| window. This should not move the window. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = notmoved->bounds(); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator gen(Shell::GetPrimaryRootWindow(), 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notmoved.get()); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = start + gfx::Vector2d(100, 10); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gen.GestureScrollSequence(start, end, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString()); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds. 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219. 613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws so that pending mouse events are processed. 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 110x111", target->bounds().ToString()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressKey(ui::VKEY_ESCAPE, 0); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseKey(ui::VKEY_ESCAPE, 0); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 100x100", target->bounds().ToString()); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag. 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219. 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is minimized, window dragging completes. 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 65268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(target.get()); 65368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Minimize(); 65468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Restore(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is maximized, window dragging completes. 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 67268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(target.get()); 67368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Maximize(); 67468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) window_state->Restore(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that a drag cannot be started via 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// aura::client::WindowMoveClient::RunMoveLoop() while another drag is already 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// in progress. 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RunMoveLoopFailsDuringInProgressDrag) { 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<aura::Window> window1(CreateWindow(HTCAPTION)); 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("0,0 100x100", window1->bounds().ToString()); 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<aura::Window> window2(CreateWindow(HTCAPTION)); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window1.get()); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window1->Focus(); 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator.PressLeftButton(); 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WindowMoveClient* move_client = 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::GetWindowMoveClient(window2->GetRootWindow()); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(aura::client::MOVE_CANCELED, 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) move_client->RunMoveLoop(window2.get(), gfx::Vector2d(), 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE)); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator.ReleaseLeftButton(); 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Showing the resize shadows when the mouse is over the window edges is tested 7098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// in resize_shadow_and_cursor_test.cc 710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 713