toplevel_window_event_handler_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/property_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/session_state_controller_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/snap_sizer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/event_generator.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_activation_client.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows headers define macros for these function names which screw with us. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CreateWindow) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef CreateWindow 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple window delegate that returns the specified hit-test code when 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// requested and applies a minimum size constraint if there is one. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWindowDelegate : public aura::test::TestWindowDelegate { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestWindowDelegate(int hittest_code) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hittest_code_(hittest_code) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWindowDelegate() {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_min_size(const gfx::Size& size) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) min_size_ = size; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from aura::Test::TestWindowDelegate: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetMinimumSize() const OVERRIDE { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min_size_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hittest_code_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowDestroyed() OVERRIDE { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hittest_code_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size min_size_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWindowDelegate); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToplevelWindowEventHandlerTest : public AshTestBase { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToplevelWindowEventHandlerTest() {} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ToplevelWindowEventHandlerTest() {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* CreateWindow(int hittest_code) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* d1 = new TestWindowDelegate(hittest_code); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* w1 = new aura::Window(d1); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) w1->SetType(aura::client::WINDOW_TYPE_NORMAL); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->set_id(1); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Init(ui::LAYER_TEXTURED); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent = 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetContainer(Shell::GetPrimaryRootWindow(), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::kShellWindowId_AlwaysOnTopContainer); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddChild(w1); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->SetBounds(gfx::Rect(0, 0, 100, 100)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Show(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return w1; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DragFromCenterBy(aura::Window* window, int dx, int dy) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(dx, dy); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressMoveAndReleaseTouchBy(dx, dy); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ToplevelWindowEventHandler> handler_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Caption) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCAPTION)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = w1->bounds().size(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100,100", w1->bounds().origin().ToString()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchDragFromCenterBy(w1.get(), 100, 100); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 100,100. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("200,200", w1->bounds().origin().ToString()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should not have. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRight) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GrowBox) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(w1.get()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(100, 100); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,100. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 200), w1->bounds().size()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shrink the wnidow by (-100, -100). 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-100, -100); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 100,100. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 100), w1->bounds().size()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enforce minimum size. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(-60, -60); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Right) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100,0. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, 100), w1->bounds().size()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Bottom) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOM)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0,100. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 200), w1->bounds().size()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRight) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -50, 50); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Top) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOP)); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 0,50. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 50), w1->bounds().origin()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 0,50. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, 50), w1->bounds().size()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Left) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,0. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 100), w1->bounds().size()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeft) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, -50); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,0. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 0), w1->bounds().origin()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeft) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 50, 50); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should have been offset by 50,50. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(50, 50), w1->bounds().origin()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have decreased by 50,50. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(50, 50), w1->bounds().size()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, Client) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTCLIENT)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = w1->bounds(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 100, 100); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Neither position nor size should have changed. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bounds, w1->bounds()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, LeftPastMinimum) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTLEFT)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large left-to-right drag. Window width should be clamped to 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position change should be limited as well. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 0); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, RightPastMinimum) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTRIGHT)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large right-to-left drag. Window width should be clamped to 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimum and position should not change. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 0); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 100), w1->bounds().size()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopLeftPastMinimum) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPLEFT)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-left to bottom-right drag. Window width should be 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should be limited. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, 444); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 60), w1->bounds().origin()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, TopRightPastMinimum) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTTOPRIGHT)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large top-right to bottom-left drag. Window size should be 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should not change, and y position should 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be clamped. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, 444); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(0, 60), w1->bounds().origin()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftPastMinimum) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMLEFT)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-left to top-right drag. Window size should be 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum, x position should be clamped, and y position should 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not change. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), 333, -444); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Point(60, 0), w1->bounds().origin()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightPastMinimum) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1(CreateWindow(HTBOTTOMRIGHT)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestWindowDelegate* window_delegate = 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestWindowDelegate*>(w1->delegate()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate->set_min_size(gfx::Size(40, 40)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = w1->bounds().origin(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a large bottom-right to top-left drag. Window size should be 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clamped to minimum and position should not change. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(w1.get(), -333, -444); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, w1->bounds().origin()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), w1->bounds().size()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomRightWorkArea) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 100, work_area.height()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, target->bounds().origin()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 100, work_area.height() - target->bounds.y() 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(200, work_area.height() - target->bounds().y()), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomLeftWorkArea) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMLEFT)); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), -30, work_area.height()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin is now at 70, 100. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.x() - 30, target->bounds().x()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position.y(), target->bounds().y()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 30, work_area.height() - target->bounds.y() 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(130, work_area.height() - target->bounds().y()), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, BottomWorkArea) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOM)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).work_area(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position = target->bounds().origin(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag further than work_area bottom. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), 0, work_area.height()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position should not have changed. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(position, target->bounds().origin()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size should have increased by 0, work_area.height() - target->bounds.y() 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Size(100, work_area.height() - target->bounds().y()), 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds().size()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows drag to a -y location. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTTOP)); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseTo(0, 5); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.DragMouseBy(0, -5); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, target->bounds().y()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(100, target->bounds().height()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies we don't let windows go bigger than the display width. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()).bounds(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragFromCenterBy(target.get(), work_area.width() * 2, 0); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y location and height should not have changed. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(work_area.width(), target->bounds().width()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that touch-gestures drag the window correctly. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target( 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 100, 100))); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location(5, 5); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point end = location; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Snap right; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the expected snapped bounds before snapping. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::RIGHT_EDGE, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds()); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(100, 0); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the window has moved after the gesture. 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), target->bounds().ToString()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Snap left. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the expected snapped bounds before snapping. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::LEFT_EDGE, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds()); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(-100, 0); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(snapped_bounds.ToString(), target->bounds().ToString()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds_before_maximization = target->bounds(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds_before_maximization.Offset(0, 100); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetBounds(bounds_before_maximization); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_bounds = target->bounds(); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maximize. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(0, -100); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsWindowMaximized(target.get())); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRestoreBoundsInScreen(target.get())->ToString()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->SetBounds(old_bounds); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimize. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end.Offset(0, 100); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.GestureScrollSequence(location, end, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_bounds.ToString(), target->bounds().ToString()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsWindowMinimized(target.get())); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetWindowAlwaysRestoresToRestoreBounds(target.get())); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRestoreBoundsInScreen(target.get())->ToString()); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that a gesture cannot minimize a window in login/lock screen. 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMinimizeLoginScreen) { 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SessionStateControllerImpl* state_controller = 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<SessionStateControllerImpl*> 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (Shell::GetInstance()->session_state_controller()); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_controller->OnLockStateChanged(false); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetUserLoggedIn(false); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lock = internal::RootWindowController::ForWindow(target.get())-> 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetContainer(internal::kShellWindowId_LockSystemModalContainer); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock->AddChild(target.get()); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = location; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(0, 100); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(wm::IsWindowMinimized(target.get())); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window( 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(10, 20, 30, 40))); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->Show(); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::wm::ActivateWindow(window.get()); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window.get()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = window->bounds(); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location, end; 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = location = window->GetBoundsInRootWindow().CenterPoint(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(0, 100); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(old_bounds.ToString(), window->bounds().ToString()); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(wm::IsWindowMinimized(window.get())); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetWindowAlwaysRestoresToRestoreBounds(window.get())); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(old_bounds.ToString(), 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRestoreBoundsInScreen(window.get())->ToString()); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that an unresizable window cannot be dragged or snapped using gestures. 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanResizeKey, false); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = location; 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to snap right. The window is not resizable. So it should not snap. 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the expected snapped bounds before the gesture. 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::RIGHT_EDGE, 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds()); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(100, 0); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the window has moved after the gesture. 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect expected_bounds(old_bounds); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_bounds.Offset(gfx::Vector2d(100, 0)); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString()); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the window did not snap left. 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), target->bounds().ToString()); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_bounds = target->bounds(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to snap left. It should not snap. 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the expected snapped bounds before the gesture. 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer sizer(target.get(), location, 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::LEFT_EDGE, 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::SnapSizer::OTHER_INPUT); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect snapped_bounds = sizer.GetSnapBounds(target->bounds()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = location = target->GetBoundsInRootWindow().CenterPoint(); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end.Offset(-100, 0); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence(location, end, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(5), 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the window has moved after the gesture. 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect expected_bounds(old_bounds); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_bounds.Offset(gfx::Vector2d(-100, 0)); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_bounds.ToString(), target->bounds().ToString()); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that the window did not snap left. 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(snapped_bounds.ToString(), target->bounds().ToString()); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that dragging multiple windows at the same time is not allowed. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, GestureDragMultipleWindows) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> target( 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 100, 100))); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> notmoved( 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTestWindowInShellWithDelegate( 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestWindowDelegate(HTCAPTION), 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, gfx::Rect(100, 0, 100, 100))); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target.get()); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect old_bounds = target->bounds(); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point location(5, 5); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetProperty(aura::client::kCanMaximizeKey, true); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send some touch events to start dragging |target|. 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveTouch(location); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location.Offset(40, 5); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveTouch(location); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Try to drag |notmoved| window. This should not move the window. 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = notmoved->bounds(); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator gen(Shell::GetPrimaryRootWindow(), 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notmoved.get()); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point end = start + gfx::Vector2d(100, 10); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gen.GestureScrollSequence(start, end, 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(10), 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString()); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies pressing escape resets the bounds to the original bounds. 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219. 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts DISABLED_EscapeReverts 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EscapeReverts EscapeReverts 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws so that pending mouse events are processed. 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 110x111", target->bounds().ToString()); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressKey(ui::VKEY_ESCAPE, 0); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseKey(ui::VKEY_ESCAPE, 0); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0,0 100x100", target->bounds().ToString()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies window minimization/maximization completes drag. 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled crbug.com/166219. 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is minimized, window dragging completes. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MinimizeWindow(target.get()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once window is maximized, window dragging completes. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Focus(); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.get()); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::MaximizeWindow(target.get()); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::RestoreWindow(target.get()); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(10, 11); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,11 100x100", target->bounds().ToString()); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 701